interview
frontend-code-analysis
以下 JavaScript 代码的输出结果是什么请解释原因

前端代码分析面试题, 以下 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 限定在块作用域中。

用途

面试这些内容的目的是为了测试候选人对 JavaScript 核心概念的理解,如作用域、闭包、异步编程、类型转换和浮点数精度。这些概念在日常前端开发中非常重要,因为它们影响着代码的执行逻辑、性能和可靠性。例如,在处理异步操作时,理解 `setTimeout` 的行为对于避免常见的逻辑错误至关重要。理解浮点数的表示方式也能够帮助开发者避免潜在的计算错误,特别是在涉及金额计算的场景中。\n

相关问题

🦆
什么是 JavaScript 的闭包?为什么有用?

闭包是指一个函数可以记住它定义时的词法作用域,即使这个函数在词法作用域之外执行。闭包对于创建私有变量和实现函数工厂非常有用。

🦆
JavaScript 中如何实现模块化?

可以通过 ES6importexport 语法来实现模块化。之前也可以使用 CommonJS (``require``/``module.exports``) 或 AMD (``define``) 来实现模块化。

🦆
解释 JavaScript 中的事件循环Event Loop.

事件循环是 JavaScript 处理异步操作的机制。JavaScript 是单线程的,事件循环允许它在等待 I/O 操作(如网络请求)时继续执行其他代码,而不会阻塞整个程序。

🦆
JavaScript 中的 Promise 是什么?如何使用它来处理异步操作?

Promise 是一个表示异步操作最终完成或失败的对象。通过 thencatch 方法可以处理 Promise 的结果。async``/``awaitPromise 的语法糖,提供了更简洁的异步代码写法。