前端中容易让人忽略的知识点

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

你可能感兴趣的