04.JS 的类型(Counting the Values)
Undefined
它是一个值,就像 2
"hello"
一样
Null
typeof(null) -> "object"
这是一个 bug,null 并不是一个对象,它是一个基本值。
同时有 undefined 和 null 可以帮助程序区分 未定义(undefined) 和 缺失数据(null)。
Boolean
在 JS 中只有两个布尔值 true
false
。任意计算出来的结果是布尔值的都指向(线连接到)这两个值上。
Number
数字会有精度问题要注意。小数部分的精度更接近于0,而远离0的精度更低,所以称为浮点数(floating)。
一些特殊的 number 类型值Infinity
-Infinity
-0
NaN
。
注意 typeof(NaN) -> number
,NaN 是数值类型,表示无效的结果。
BigInt
let alot = 9007199254740991n
alot + 1n // -> 9007199254740992n
在JS 世界中,BigInt 可以表示任意精度,也就是说有无数多个 bigint。
在实践中,不可能把所有的 bigint 都放在内存中,可能会导致崩溃。
String
一个字符串可以访问它的 length 或 下标,但并不意味着字符串是对象,你无法进行 str[0] = 'a'
这样的操作。
字符串是基本值(primitives),是不可变的。
为了保持心智模型的简单,我们说所有可能的字符串值一开始就已经存在(我们脑海里),每个字符串对应一个值。而在 JS 引擎中,字符串可能是单内存块、多内存块或一个 Rope (取决于 JS 引擎)。
Symbol
let alohomora = Symbol()
typeof(alohomora) // -> 'symbol'
Object
typeof({})) // -> 'object'
typeof([])) // -> 'object'
typeof(new Date()) // -> 'object'
typeof(/\d+/)) // -> 'object'
typeof(Math)) // -> 'object'
与前面的不同,对象不是基本值,它是可变的。
在我们的心智模型中,所有的基本值都“一直存在的”,无法“创建”新的字符串或数字,只能“传唤”这个值
但是对象而言,我们每次都会创建一个全新的对象值:
我们只能创建对象,但是无法立刻销毁对象(因为我们无法知道垃圾回收机制什么时候运作),如下代码。
如果 {}
一直没有被引用, 最终是会被销毁的。
let a = {}
a = null // 此时上面的 {} 不一定被销毁了
Function
就像对象一样,每次创建一个函数,都会创建一个新的函数值。(从技术上来讲,函数是 JS 的对象)