前端进阶之JS中基本类型,复杂类型以及那个让人头大的null

948 阅读2分钟
  • 作者:陈大鱼头
  • 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大的所有数字。

具体可参考:

tc39.github.io/proposal-bi…

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) === 0typeof null === 'object'

复杂类型

JS的复杂类型只有 Object 一种。

在计算机科学中, 对象是指内存中的可以被 标识符引用的一块区域。

在 Javascript 里,对象可以被看作是一组属性的集合。用 对象字面量语法 来定义一个对象时,会自动初始化一组属性。而后,这些属性还可以被增减。属性的值可以是任意类型,包括具有复杂数据结构的对象。属性使用键来标识,它的键值可以是一个字符串或者符号值**(Symbol)**。

JS基本类型与复杂类型的区别

基本类型存储的是值,复杂类型存储的是地址(指针)。

当你创建了一个复杂类型的时候,计算机会在内存中帮我们开辟一个空间来存放值,但是我们需要找到这个空间,这个空间会拥有一个地址(指针)。

当我们将变量赋值给另外一个变量时,复制的是原本变量的地址(指针),当我们进行数据修改的时候,就会修改存放在地址(指针) 上的值。

如果你喜欢探讨技术,或者对本文有任何的意见或建议,非常欢迎加鱼头微信好友一起探讨,当然,鱼头也非常希望能跟你一起聊生活,聊爱好,谈天说地。 鱼头的微信号是:krisChans95 也可以扫码关注公众号,订阅更多精彩内容。

https://fish-pond-1253945200.cos.ap-guangzhou.myqcloud.com/img/base/qrcode-all.png