- 作者:陈大鱼头
- github: KRISACHAN
- 链接:github.com/YvetteLau/S…
- 背景:最近高级前端工程师 刘小夕 在 github 上开了个每个工作日布一个前端相关题的 repo,怀着学习的心态我也参与其中,以下为我的回答,如果有不对的地方,非常欢迎各位指出。
JS的基本类型(primitive values)有
- Undefined
- Null
- Boolean
- String
- Symbol (ES2015新增)
- Number
- Object
除 Object 以外的所有类型都是不可变的(值本身无法被改变)。
鱼头注:在最新的ECMA proposal里有个处于Stage 3的基本数据类型 BigInt
,用于表示比253大的所有数字。
具体可参考:
null是对象吗?
在ECMA文档里的定义是:
原始值,表示缺省任何对象值(object value)
typeof null === 'object'
是个早在第一版的JS就存在的BUG。在这个版本里,JS值是以 32位 为单位存储的,由**小型标记(1 - 3位)**和 真实值 组成。类型标签存储在低位的单元里。其中5个是:
000
:对象(object)1
:整型(int)010
:双精度浮点型(double)100
:字符串(string)110
:布尔值(boolean)
两种特殊值
undefined
(JSVAL_VOID
):-2的30次方以内的整数。null
(JSVAL_NULL
) :机器码NULL
空指针,空指针引用 加上 对象标记还是 0,所以有Number(null) === 0
跟typeof null === 'object'
。
复杂类型
JS的复杂类型只有 Object
一种。
在计算机科学中, 对象是指内存中的可以被 标识符引用的一块区域。
在 Javascript 里,对象可以被看作是一组属性的集合。用 对象字面量语法 来定义一个对象时,会自动初始化一组属性。而后,这些属性还可以被增减。属性的值可以是任意类型,包括具有复杂数据结构的对象。属性使用键来标识,它的键值可以是一个字符串或者符号值**(Symbol)**。
JS基本类型与复杂类型的区别
基本类型存储的是值,复杂类型存储的是地址(指针)。
当你创建了一个复杂类型的时候,计算机会在内存中帮我们开辟一个空间来存放值,但是我们需要找到这个空间,这个空间会拥有一个地址(指针)。
当我们将变量赋值给另外一个变量时,复制的是原本变量的地址(指针),当我们进行数据修改的时候,就会修改存放在地址(指针) 上的值。
如果你、喜欢探讨技术,或者对本文有任何的意见或建议,你可以扫描下方二维码,关注微信公众号“ 鱼头的Web海洋”,随时与鱼头互动。欢迎!衷心希望可以遇见你。