interview
javascript-frontend-basics
为什么 JavaScript 中 0.1 0.2 0.3如何让其相等

前端 JavaScript 基础面试题, 为什么 JavaScript 中 0.1 + 0.2 !== 0.3,如何让其相等?

前端 JavaScript 基础面试题, 为什么 JavaScript 中 0.1 + 0.2 !== 0.3,如何让其相等?

QA

Step 1

Q:: 为什么 JavaScript 中 0.1 + 0.2 !== 0.3,如何让其相等?

A:: JavaScript 中的浮点数是遵循 IEEE 754 标准的双精度 64 位二进制格式。这导致某些小数无法精确表示,比如 0.1 和 0.2 的二进制表示是无限循环的。因此,当进行算术运算时,结果会有微小的误差,导致 0.1 + 0.2 !== 0.3。为了让其相等,可以使用 Number.EPSILONtoFixed() 方法进行比较:

 
console.log(Math.abs((0.1 + 0.2) - 0.3) < Number.EPSILON); // true
// 或者
console.log((0.1 + 0.2).toFixed(10) === 0.3.toFixed(10)); // true
 

Step 2

Q:: 什么是闭包?

A:: 闭包是指在 JavaScript 中,当一个函数访问它外部作用域的变量时,即使这个函数是在它的外部作用域之外执行的,也能访问这些变量。闭包是创建私有变量和函数的常用方法。

 
function createCounter() {
  let count = 0;
  return function() {
    count++;
    return count;
  };
}
const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
 

Step 3

Q:: 什么是事件循环?

A:: 事件循环是 JavaScript 的运行机制,用于处理异步操作。当 JavaScript 代码执行时,单线程引擎会将任务放入调用栈,遇到异步操作时将其交给浏览器处理,完成后将回调函数放入任务队列。事件循环不断检查调用栈是否为空,如果为空则从任务队列中取出第一个任务执行。

 
console.log('Start');
setTimeout(() => {
  console.log('Timeout');
}, 0);
console.log('End');
// 输出顺序: Start, End, Timeout
 

用途

这些内容都是 JavaScript 的基础知识,掌握这些知识有助于理解更复杂的概念和框架。在实际生产环境中,这些知识广泛应用于调试、性能优化、代码组织、异步编程等方面。\n

相关问题

🦆
如何处理 JavaScript 中的异步编程?

异步编程可以通过回调函数、Promise 和 async/await 来处理。回调函数是最基本的方式,但容易导致回调地狱。Promise 提供了一种更优雅的处理方式,而 async/await 是基于 Promise 的语法糖,使异步代码看起来像同步代码。

 
// 使用 Promise
fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error(error));
 
// 使用 async/await
async function fetchData() {
  try {
    const response = await fetch('https://api.example.com/data');
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.error(error);
  }
}
fetchData();
 
🦆
解释 JavaScript 中的作用域和作用域链.

作用域是指变量和函数的可访问范围。在 JavaScript 中,主要有全局作用域和函数作用域(块级作用域通过 let 和 const 声明)。作用域链是指在当前作用域查找变量时,如果没有找到,会逐层向上查找直到全局作用域。

 
let globalVar = 'global';
function outerFunction() {
  let outerVar = 'outer';
  function innerFunction() {
    let innerVar = 'inner';
    console.log(globalVar); // global
    console.log(outerVar); // outer
    console.log(innerVar); // inner
  }
  innerFunction();
}
outerFunction();
 
🦆
解释 JavaScript 中的原型和原型链.

JavaScript 中的每个对象都有一个原型,通过原型可以继承属性和方法。原型链是指对象沿着其原型链向上查找属性和方法的机制,直到找到为止或者到达 null 结束。

 
function Person(name) {
  this.name = name;
}
Person.prototype.greet = function() {
  console.log('Hello, ' + this.name);
};
const alice = new Person('Alice');
alice.greet(); // Hello, Alice
console.log(alice.__proto__ === Person.prototype); // true