前端代码分析面试题, 以下 JavaScript 代码的输出结果是什么?请解释原因
前端代码分析面试题, 以下 JavaScript 代码的输出结果是什么?请解释原因
QA
Step 1
Q:: 在以下 JavaScript 代码中,输出结果是什么?为什么?
console.log(0.1 + 0.2 == 0.3);
A:: 输出结果是 false
。这是因为 JavaScript 中的浮点数使用的是 IEEE 754 双精度标准。这种表示方法不能精确地表示某些小数,因此 0.1 + 0.2 的结果不是精确的 0.3,而是一个接近于 0.3
的值。由于浮点数的精度问题,导致了比较时的差异。
Step 2
Q:: 以下代码中 this
的值是什么?为什么?
function myFunction() {
console.log(this);
}
myFunction();
A:: 在非严格模式下,this
的值是全局对象(window
对象在浏览器环境下)。在严格模式下(即使用 'use strict';
),this
的值是 undefined
。这是因为在全局上下文中调用函数时,默认情况下 this
绑定到全局对象,而严格模式下会将其设置为 undefined
。
Step 3
Q:: 以下代码的输出是什么?为什么?
var a = 1;
function b() {
a = 10;
return;
function a() {}
}
b();
console.log(a);
A:: 输出结果是 1
。在函数 b
内部,声明了一个同名的函数 a
,这会使得函数内部的 a
变量提升并覆盖外部的 a
变量。因此,函数 b
中的赋值 a = 10
实际上修改的是函数内的 a
变量,而不是全局的 a
。
Step 4
Q:: 为什么 ==
和 ===
在 JavaScript 中的行为不同?
A:: ==
是宽松比较,它会在比较前进行类型转换,然后再进行比较;===
是严格比较,它要求比较的两个值必须类型相同,且值相等。因为 ==
会进行隐式类型转换,可能会导致一些意料之外的结果,而 ===
更为安全。
Step 5
Q:: 解释以下代码的输出,并解释 setTimeout
的行为。
for (var i = 0; i < 3; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}
A:: 输出结果是三次 3
。这是因为 setTimeout
是异步的,它们会在循环结束后执行,而此时 i
的值已经变为 3
。所有 setTimeout
回调都会使用这个最终的 i
值。如果要在每次循环时保存 i
的当前值,可以使用闭包或 let
关键字将 i
限定在块作用域中。