1、null
对于null有一个历史存留的 bug,null是对象类型吗?虽然我们使用 typeof 检测null是对象类型,这其实是一个 bug。
1.1 原因是什么
因为 JS 最初的版本是 32 位系统的,为了将性能将用低位存储变量类型信息,000 开头表示代表的是对象,此时null表示全零,所以系统就错误的将null判断为对象类型。虽然 JS 内部判断代码已经更改,但是这个 bug 一直留存下来。
2、symbol
有关symbol使用的比较少,但是它的存在是有原因的。
2.1 symbol 是什么
symbol表示独一无二的值,因为由于对象的属性都是字符串类型,我们避免不了相同字符串冲突的问题。所以为了防止对象的属性都是字符串类型而冲突引入的。
2.2 symbol 的使用
// 通常参数是字符串类型,如果为对象类型,就会调用 toString 方法
let s1 = Symbol(参数);// 这个参数可以认为是 Symbol 实例的一个描述,用于区分
// 第一种写法
let a = {};
a[s1] = 'Hello!';
// 第二种写法
let a = {
[s1] = 'Hello';
}
3、为什么 0.1 + 0.2 != 0.3
0.1 + 0.2 __ 0.3呢?为什么会出现不相等的情况呢?面试该如何回答面试官?
3.1 是什么导致了这种情况
原因很简单,JS 采用的是双精度版本,这个版本就存在精度问题,就导致了上边这种情况。
3.2 内部的原理是什么
我们计算机的信息全部转化为二进制进行存储的,那么0.1的二进制表示的是一个无限循环小数,该版本的 JS 采用的是浮点数标准需要对这种无限循环的二进制进行截取,从而导致了精度丢失,造成了0.1不再是0.1,截取之后0.1变成了 0.100...001,0.2变成了0.200...002。所以两者相加的数大于0.3。
那好,既然0.1不等于0.1了,那为什么我在控制台上输出console.log(0.1)还等于0.1呢?
因为在输入内容进行转换的时候,二进制转换成十进制,然后十进制转换成字符串,在这个转换的过程中发生了取近似值,所以打印出来的是一个近似值。
//可以通过原生的取近似值(四舍五入)的方法解决就可以了。
parseFloat((0.1 + 0.2).toFixed(10))
待补充。。。
参考文章:https://juejin.im/post/5d9e932ff265da5bb065db1f