欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-10-27 09:06:34
1、null 对于null有一个历史存留的 bug,null是对象类型吗?虽然我们使用 typeof 检测null是对象类型,这其实是一个 bug。 1.1 原因是什么 因为 JS 最初的版本是 32 位系统的,为了将性能将用低位存储变量类型信息,000 开头表示代表的是对象,此时null表示全零, ......

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))

待补充。。。
参考文章: