文章目录
看过一些文章,关于JavaScript的数据类型分为几种,有不同的说法。先从大体上看,有说基本数据类型和引用数据类型的;有说原始数据类型和对象数据类型的等等。
在这里结合MDN文档和一些网上的文章整理一下。
先上结论:八种,分别是:string、number、boolean、undefined、null、symbol(ES6)、bigint(ES10)和object
一、JS中的堆栈与数据类型
1.从JavaScript中的堆栈谈起
首先我们需要知道:
- JavaScript是一门解释型语言
- JavaScript代码需要在机器(node或者浏览器)上安装一个工具(JS引擎)才能执行。
然而JS引擎(例如chrome v8等)多数是一种由 C++ 开发的“应用”,JavaScript中并没有严格意义上区分栈内存与堆内存,具体怎么做取决与不同引擎的实现方式。
我们需要参考一些编译型语言来看JS的堆栈。
- 栈(stack): 栈会自动分配内存空间,会自动释放,存放基本类型。
- 堆(heap): 动态分配的内存,大小不定也不会自动释放,存放引用类型, 栈(stack)内存中存放地址指向堆(heap)内存中的对象.
当查询引用类型的变量时, 先从栈中读取内存地址, 然后再通过地址找到堆中的值。
2.从堆栈看数据类型
综上,我们将JS中的数据类型大体上分为两种:基本数据类型和引用数据类型。
目前为之JS有八种数据类型,分别是:
- string、number、boolean、undefined、null、symbol(ES6)、bigint(ES10)
- object
这样,我们从JS的堆栈开始,进一步了解了JavaScript的数据类型,有助于之后理解传值和传址,深浅拷贝等等。
注:function函数其实也是一个对象,是在堆内存当中。对象又是通过 new 构造函数出来的······这部分可以去学习原型与原型链,有助于进一步理解。
二、不可改变的基本数据类型
MDN中写到
基本类型(基本数值、基本数据类型)是一种既非对象也无方法的数据。在 JavaScript 中,共有7种基本类型:string,numbe,boolean,null,undefined,bigint,symbol。
多数情况下,基本类型直接代表了最底层的语言实现。
所有基本类型的值都是不可改变的。
基本类型值可以被替换,但不能被改变,赋值行为可以给基本类型一个新值,而不是改变它。
在函数中JavaScript会将传递进来的参数(基本类型的值)复制一份,创建一个本地副本,函数中的任何操作都不会影响到最初的值,我们操作的只不过是它的副本
那么调用字符串的方法,不会影响之前的字符串;调用数组的方法,部分会影响之前的数组。
三、JS中的基本类型、包装对象、原型
除了 null
和 undefined
之外,所有基本类型都有其对应的包装对象:
String
为字符串基本类型。Number
为数值基本类型。BigInt
为大整数基本类型。Boolean
为布尔基本类型。Symbol
为字面量基本类型。
在包装对象的原型上有基本类型的方法,例如String.prototype中有split、substring等等方法。
而我们的基本类型的 __proto__
属性又会指向对应包装对象的原型,那么我们可以把基本类型看作是实例,与原型与原型链的知识结合起来了。
这样基本数据类型就可以调用这些方法时,可以通过原型链找到。
const str = "abc";
const num = 123;
str.__proto__ === String.prototype // true
num.__proto__ === Number.prototype // true
四、typeof 操作符能返回哪些结果?
typeof
操作符返回一个字符串,表示未经计算的操作数的类型。
类型 | 结果 |
---|---|
Undefined | "undefined" |
Null | "object" |
Boolean | "boolean" |
Number | "number" |
BigInt | "bigint" |
String | "string" |
Symbol | "symbol" |
Function | "function" |
其他任何对象 | "object" |
特殊的几点:
-
typeof Object
:结果是"function",因为Object是一个构造函数,可以通过new操作符来构造对象。 -
typeof null
:结果是"object",null是一个只有一个值的特殊类型。表示一个空对象引用。为什么 typeof null 为 “object”? JavaScript 诞生以来便如此
在 JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。由于
null
代表的是空指针(大多数平台下值为 0x00),因此,null 的类型标签是 0,typeof null
也因此返回"object"
。曾有一个 ECMAScript 的修复提案(通过选择性加入的方式),但被拒绝了该提案会导致
typeof null === 'null'
。
综上,typeof操作符能返回的类型:
- string number boolean undefined symbol bigint
- object 、(typeof null === ‘object’)
- function
五、== 和 === 相关总结
==运算符,会发生隐式类型转换
// 以下结果都是true
100 == '100'
0 == ''
0 == false
1 == true
false == ''
null == undefined
通常我们在所有地方都使用===,在判断null或者undefined时使用==
const obj = { foo: "foo" }
if (obj.a == null) {}
// 相当于
if (obj.a === null || obj.a === undefined) {}
在==、if、逻辑判断中都类似,自行网上了解一下隐式类型转换规则。
网上看了一下什么面试题大坑,特别奇葩的js隐形转换的面试题,感觉很离谱又没什么意思。