https://juejin.cn/post/6934500357091360781#comment

https://juejin.cn/post/7004638318843412493#comment

https://juejin.cn/post/6844903969345503240

1. 0.1 + 0.2 === 0.3 嘛?为什么?

JavaScript 使用 Number 类型来表示数字(整数或浮点数),遵循 IEEE 754 标准,通过 64 位来表示一个数字(1 + 11 + 52)

  • 1 符号位,0 表示正数,1 表示负数 s
  • 11 指数位(e)
  • 52 尾数,小数部分(即有效数字)

最大安全数字:Number.MAX_SAFE_INTEGER = Math.pow(2, 53) - 1,转换成整数就是 16 位,所以 0.1 === 0.1,是因为通过 toPrecision(16) 去有效位之后,两者是相等的。
在两数相加时,会先转换成二进制,0.1 和 0.2 转换成二进制的时候尾数会发生无限循环,然后进行对阶运算,JS 引擎对二进制进行截断,所以造成精度丢失。
所以总结:精度丢失可能出现在进制转换和对阶运算中
参考链接
juejin.cn/post/684490…

2. JS 数据类型

基本类型:Number、Boolean、String、null、undefined、symbol(ES6 新增的),BigInt(ES2020) 引用类型:Object,对象子类型(Array,Function)
参考链接
juejin.cn/post/684490…
developer.mozilla.org/zh-CN/docs/…

3. JS 整数是怎么表示的?

  • 通过 Number 类型来表示,遵循 IEEE754 标准,通过 64 位来表示一个数字,(1 + 11 + 52),最大安全数字是 Math.pow(2, 53) - 1,对于 16 位十进制。(符号位 + 指数位 + 小数部分有效位)

4.Number() 的存储空间是多大?如果后台发送了一个超过最大自己的数字怎么办

Math.pow(2, 53) ,53 为有效数字,会发生截断,等于 JS 能支持的最大数字。

5.写代码:实现函数能够深度克隆基本类型

浅克隆

  1. function shallowClone(obj) {
  2. let cloneObj = {};
  3. for (let i in obj) {
  4. cloneObj[i] = obj[i];
  5. }
  6. return cloneObj;
  7. }

深克隆:

  • 考虑基础类型
  • 引用类型

    • RegExp、Date、函数 不是 JSON 安全的
    • 会丢失 constructor,所有的构造函数都指向 Object
    • 破解循环引用 ```typescript function deepCopy(obj) { if (typeof obj === ‘object’) { var result = obj.constructor === Array ? [] : {};

      for (var i in obj) { result[i] = typeof obj[i] === ‘object’ ? deepCopy(obj[i]) : obj[i]; } } else { var result = obj; }

    return result; } ```