JS中关于类型的细节
参考: winter 的重学前端
JS 中有哪些类型?
JavaScript 语言的每一个值都属于某一种数据类型。JavaScript 语言规定了 7 种语言类型。语言类型广泛用于变量、函数参数、表达式、函数返回值等场合。根据最新的语言标准,这 7 种语言类型是:
- Undefined
- Null
- Boolean
- String
- Number
- Symbol
- Object
Undefined 和 Null
Undefined 类型只有一个值,就是
undefined,JS 中任何变量在赋值前,它的类型是 Undefined,值为undefined。一般可以用 JS 中的全局变量 undefined(就是名为 undefined 的这个变量)来表达这个值,或者 void 运算来把任一一个表达式变成undefined值。Null 类型也只有一个值,就是
null,它的语义表示空值,与undefined不同,null 是 JavaScript 关键字,所以在任何代码中,都可以放心用 null 关键字来获取null值。
undefined 和 null 的区别
undefined 跟 null 有一定的表意差别,null 表示的是:定义了但是为空。所以,在实际编程时,我们一般不会把变量赋值为 undefined,这样可以保证所有值为 undefined 的变量,都是从未赋值的自然状态。
Boolean
Boolean 类型有两个值,true 和 false,它用于表示逻辑意义上的真和假,同样有关键字 true 和 false 来表示两个值。
String
String 用于表示文本数据。String 有最大长度是 2^53 - 1。
String 是 UTF16 编码
String 的意义并非“字符串”,而是字符串的 UTF16 编码,我们字符串的操作 charAt、charCodeAt、length 等方法针对的都是 UTF16 编码。所以,字符串的最大长度,实际上是受字符串的编码长度影响的。
String 可以作为值
JavaScript 中的字符串是永远无法变更的,一旦字符串构造出来,无法用任何方式改变字符串的内容,所以字符串具有值类型的特征。
Number
JavaScript 中的 Number 类型有 2^64-2^53+3 个值。
Number 里的特殊值
- NaN,占用了 9007199254740990 个特殊值来表示 NaN,这原本是符合 IEEE 规则的数字;
- Infinity,无穷大;
- -Infinity,负无穷大。
+0 和 -0 不同
- 通过检测 1/x 是 Infinity 还是 -Infinity 去区分 x 是 +0 还是 -0 。
浮点数运算的精度问题
1 | console.log(0.1 + 0.2 == 0.3); // false |
JS 中浮点数运算的精度问题导致等式左右的结果并不是严格相等,而是相差了个微小的值。
正确的比较方法是使用 JavaScript 提供的最小精度值,检查等式左右两边差的绝对值是否小于最小精度
1 | console.log(Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON); // true |
Symbol
Symbol 是个啥?
Symbol 是 ES6 中引入的新类型,就像 Number、String、和 Boolean 一样。
如何创建 Symbol 类型
与别的原始类型不同,Symbols 没有字面量语法(例如,String 有 '')—— 创建 Symbol 的唯一方式是使用全局的 Symbol 函数。记住每个被创建出来的symbol 值都是独一无二的。
1 | // 可以不用加参数,加了参数以后,就等于为它们加上了描述,输出的时候我们就能够分清,到底是哪一个值。 |
Symbol 是可以用来干嘛?
- 作为对象的属性名,可以保证这个属性名永远不会冲突(不能用
.运算符) - 给予开发者在 API 中为对象改写默认行为的能力
- 操作 ES6 中对象内置的 Symbols 属性,例如 Symbol.iterator 等这些内置的 Symbol 可以 JavaScript 内部行为
Object
Object 是 JavaScript 中最复杂的类型,也是 JavaScript 的核心机制之一。Object 表示对象的意思,它是一切有形和无形物体的总称。
JS 中的 Object ?
在 JavaScript 中,对象的定义是“属性的集合”。属性分为数据属性和访问器属性,二者都是 key-value 结构,key 可以是字符串或者 Symbol 类型。
JS 中的类与对象
JavaScript 中的“类”仅仅是运行时对象的一个私有属性,而 JavaScript 中是无法自定义类型的。
基本类型与 Object 的联系
JavaScript 中的几个基本类型,都在对象类型中有一个“亲戚”。它们是:
- Number
- String
- Boolean
- Symbol
Number、String 和 Boolean,三个构造器是两用的,当跟 new 搭配时,它们产生对象,当直接调用时,它们表示强制类型转换。
Symbol 函数比较特殊,直接用 new 调用它会抛出错误,但它仍然是 Symbol 对象的构造器。
对象为基本类型提供的便利
日常代码可以把对象的方法在基本类型上使用,例如:
1 | console.log('abc'.length); // 3 |
原因在于**.** 运算符提供了装箱操作,它会根据基础类型构造一个临时对象,使得我们能在基础类型上调用对应对象的方法。但是 3 与 new Number(3) 是完全不同的值,它们一个是 Number 类型, 一个是对象类型。
图解
