Skip to main content

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 的对象)