JS 中的基本类型与引用类型
基本类型
null
: 表示空值undefined
: 表示声明了该变量,但还未赋值boolean
: 布尔值,true | falsenumber
: 数字类型,包含整数和浮点数string
: 字符串类型symbol
: 符号类型,可用作唯一标识符bigint
: 表示大数
typeof null 问题
使用 typeof
可以检测一个变量的类型,其中 typeof null
会显示 object
,这是语言层面的一个 bug,其原因是 JS 底层存储变量的时候,会有个类型标记和类型值,其中 object
对应的类型标记是 0
,而 null
被表示为空指针 0x00
,结果, null
的类型标记就是 0
,所以 typeof
返回 object
。
0.1 + 0.2 !== 0.3
JS 中 Number 类型采用的是 IEEE 754 标准
来表示整数和浮点数,只要是采用了这个标准的语言,都会遇到 0.1 + 0.2 != 0.3
的问题。这是因为 JS 使用 64 位来存储一个浮点数,计算机底层存储数据都是二进制的,0.1 在转换为 64 位二进制的时候,就发生了 精度丢失
,所以就导致了 0.1 不是 0.1 ,实际上是 0.0001100110011001100110011001100110011001100110011001101....
。这时候 0.1 + 0.2 就不是 0.3 了,而是 0.3000000000 ...
实际上比 0.3 还大一丢丢,所以这个相等判断就不成立了。
解决方法:
parseFloat((0.1 + 0.2).toFixed(1)) === 0.3
Math.abs(0.1 + 0.2 - 0.3) < Number.EPSILON
(0.1 * 1000 + 0.2 * 1000) / 1000 === 0.3
装箱
平时使用基本类型的时候可能会疑惑,为啥一个字符串可以直接访问一些原型上才有的方法?比如下面这些代码:
'aaa'.toUpperCase()
(0.12343).toFixed(2)
...
这是因为 JS 会自动对基本类型进行 装箱
操作,才使得这些方法可以访问,否则基本类型属性是没有这些东西的。
引用类型
引用类型主要就是 Object
, Function
, Date
之类的构造函数。这里就要提一下函数的传参了。函数参数到底是按值传递还是按引用传递?按照红宝书的说法,所有函数的参数都是按值传递。但是如果是按值传递,为啥下面这段代码预期不一样呢?
var obj = {a: 1}
function foo(x) {
x.a = 2
console.log(x.a) // 2
}
foo(obj)
console.log(obj.a) // 2
说好的按值传递,怎么修改了函数形参的值,实参也被影响到了呢。再略微修改一下,就能发现端倪:
var obj = {a: 1}
function foo(x) {
x = 2
console.log(x) // 2
}
foo(obj)
console.log(obj.a) // 1
上面这两段代码,一个是直接修改形参的属性,一个是重新赋值形参,对于执行结果可以这么理解: 如果是基本类型的值,传递的是值的拷贝;如果是引用类型的值,传递的是对象引用的拷贝
。而 ”对象引用的拷贝“ 就是一个 ”值“。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论