参考: 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类型有 264-253+3 个值。
Number 里的特殊值
- NaN,占用了 9007199254740990 个特殊值来表示NaN,这原本是符合IEEE规则的数字;
- Infinity,无穷大;
- -Infinity,负无穷大。
+0
和 -0
不同
- 通过检测 1/x 是 Infinity 还是 -Infinity 去区分 x 是 +0 还是 -0 。
浮点数运算的精度问题
console.log( 0.1 + 0.2 == 0.3) // false
JS 中浮点数运算的精度问题导致等式左右的结果并不是严格相等,而是相差了个微小的值。
正确的比较方法是使用JavaScript提供的最小精度值,检查等式左右两边差的绝对值是否小于最小精度
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
值都是独一无二的。
// 可以不用加参数,加了参数以后,就等于为它们加上了描述,输出的时候我们就能够分清,到底是哪一个值。
let s = Symbol('test')
typeof s // "symbol"
// 每个被 Symbol() 创建的 symbol 都是独一无二的
Symbol('123') === Symbol('123') // false
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 对象的构造器。
对象为基本类型提供的便利
日常代码可以把对象的方法在基本类型上使用,例如:
console.log("abc".length) // 3
原因在于.
运算符提供了装箱操作,它会根据基础类型构造一个临时对象,使得我们能在基础类型上调用对应对象的方法。但是 3 与 new Number(3) 是完全不同的值,它们一个是 Number 类型, 一个是对象类型。