JavaScript
常见JS问题

1. js 有哪些数据类型?

  • 基本数据类型:NumberStringBooleanNullUndefinedSymbolBigInt

2. 为什么 0.1+0.2 ! == 0.3,如何让其相等 (精度丢失)?

计算机是通过二进制的方式存储数据的,所以计算机计算 0.1+0.2 的时候,实际上是计算的两个数的二进制的和。

在 js 中 只有一种数字类型:Number,它的实现遵循 IEEE 754 标准,使用 64 位固定长度来表示,也就是标准的 double 双精度浮点数。在二进制科学表示法中,双精度浮点数的小数部分最多只能保留 52 位,再加上前面的 1,其实就是保留 53 位有效数字,剩余的需要舍去,遵从“0 舍 1 入”的原则。

根据这个原则,0.1 和 0.2 的二进制数相加,再转化为十进制数就是:0.30000000000000004。所以不相等

  • 0.1 + 0.2 = 0.30000000000000004
  • 解决方法:Number.EPSILONMath.abstoFixed

3. 什么是闭包?闭包的作用?

  • 闭包 Closure 是 1964 年提出的一个计算机编程的概念,按照当时的论文《表达式的机器执行》(The Mechanical Evaluation of Expressions (opens in a new tab)) 的定义它包含控制和环境两个部分,在 JavaScript 中,以函数能够访问其定义时的环境中的变量,用这种方式 JavaScript 实现了闭包。

  • 闭包 - JavaScript | MDN (opens in a new tab):闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical environment,词法环境)的引用的组合。换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。在 JavaScript 中,闭包会随着函数的创建而被同时创建。

4. typeof NaN 的结果是什么?

NaN 指“不是一个数字”(not a number),NaN 是一个“警戒值”(sentinel value,有特殊用途的常规值),用于指出数字类型中的错误情况,即“执行数学运算没有成功,这是失败后返回的结果”。

typeof NaN; // "number"

5. isNaN 和 Number.isNaN 函数的区别?

  • isNaN 函数会先尝试将参数转换为数字,然后再进行判断,如果转换后的值不是数字,那么就返回 true,否则返回 false。
  • Number.isNaN 函数只对数字有效,如果参数不是数字,那么就返回 false,否则就返回 true。

6. 什么是伪数组(类数组)?怎么样转为数组?

  • 伪数组是一个拥有 length 属性和若干索引属性的对象,但它不是 Array 的实例。
// 转为数组的几种方法
Array.prototype.slice.call(arrayLike);
Array.prototype.splice.call(arrayLike, 0);
Array.prototype.concat.apply([], arrayLike);
Array.from(arrayLike);