分享 10 道常见的 JavaScript 面试题

2023-08-31 08:49:09 浏览数 (1)

英文 | https://medium.com/@maria_laramie/10-common-javascript-interview-questions-and-how-to-answer-them-328b59806cf7

你在准备 JavaScript 面试吗? 如果是的话,那今天这篇文章,你一定不能错过,因为我会在文章中分享10 道常见的 JavaScript 面试题以及如何参考答案,帮助你在面试中获得好成绩。

现在,我们就开始吧。

1. JavaScript 中的Hoisting是什么?

Hoisting是 JavaScript 中的一种行为,其中变量和函数声明被移动到其作用域的顶部。这意味着可以在代码中声明变量和函数之前使用它们。但是,只会声明,不会赋值。

代码语言:javascript复制
console.log(x); //undefined
var x = 5;

在这个例子中,变量 x 被提升到范围的顶部,但它的赋值 5 没有,所以当我们尝试记录 x 的值时,它返回 undefined。

2. JavaScript 中的闭包是什么?

闭包是一个函数,即使在外部函数返回之后,它也可以访问其外部范围内的变量。

代码语言:javascript复制
function outerFunction(x) {
  return function innerFunction() {
    return x;
  }
}

const myClosure = outerFunction(10);
console.log(myClosure()); //10

在此示例中,内部函数 innerFunction 可以从其外部范围访问变量 x,因此,即使在 outerFunction 返回后它也可以返回其值。

3. 讲解JavaScript中的事件冒泡和捕获

事件冒泡和捕获是在 DOM 中传播事件的两种方式。

事件冒泡是指事件首先被最内层元素捕获和处理,然后传播到外层元素。

事件捕获则相反,事件首先由最外层元素处理,然后传播到内部元素。

代码语言:javascript复制
<div onclick="alert('div')">
  <p onclick="alert('p')">
    Click me!
  </p>
</div>

在这个例子中,如果 p 元素被点击,事件将首先被 p 元素捕获并调用 alert('p') 函数。

然后,事件将传播到 div 元素并调用 alert('div') 函数。这是事件冒泡的一个例子。

如果我们在 addEventListener 中使用 useCapture 参数并将其设置为 true,则事件将首先被 div 元素捕获,然后传播到 p 元素。这是一个事件捕获的例子。

4. 用 JavaScript 解释“this”

在 JavaScript 中,this 指的是函数是其方法的对象。

代码语言:javascript复制
const person = {
  name: "John",
  sayName: function() {
    console.log(this.name);
  }
}

person.sayName(); // "John"

在此示例中,this 指的是 person 对象,因此调用 this.name 会返回“John”。this 的值可以根据函数的调用方式而改变。

5. 解释原型继承在 JavaScript 中的工作原理

在 JavaScript 中,所有对象都有一个原型,它们从中继承属性和方法。当在对象上调用属性或方法但在该对象上找不到时,JavaScript 将在对象的原型上查找它。

代码语言:javascript复制
const animal = {
  type: "unknown"
}

const dog = Object.create(animal);
dog.breed = "Golden Retriever";

console.log(dog.type); // "unknown"
console.log(dog.breed); // "Golden Retriever"

在此示例中,狗对象是使用 Object.create() 创建的,它将动物对象设置为其原型。当我们尝试访问 dog 对象的 type 属性时,在 dog 对象本身找不到它,因此 JavaScript 在原型上查找它并在 animal 对象上找到它。

6. 解释 setTimeout 在 JavaScript 中的工作原理

setTimeout 是一个允许您在经过一定时间后执行函数的函数。

代码语言:javascript复制
console.log("Started!");
setTimeout(() => {
  console.log("Hello!");
}, 2000);
console.log("Ended!");

在此示例中,console.log("Started!") 被立即调用,然后 setTimeout 被调用,回调函数记录“Hello!” 和 2000 毫秒的时间。之后立即调用 console.log("Ended!") 。传递给 setTimeout 的回调函数将在 2 秒后调用。

7. 解释 setInterval 在 JavaScript 中的工作原理

setInterval 与setTimeout 类似,但它会以指定的时间间隔重复执行提供的函数。

代码语言:javascript复制
let count = 0;
const intervalId = setInterval(() => {
  console.log(`Interval count: ${count}`);
  count  ;
  if (count === 5) {
    clearInterval(intervalId);
  }
}, 1000);

在此示例中,提供的函数将每 1000 毫秒(1 秒)执行一次,每次计数都会增加 1。clearInterval 函数用于在 5 次迭代后停止间隔。

8. 解释什么是 JavaScript 中的 promise

Promise 是一个对象,表示异步操作的最终完成(或失败)及其结果值。

代码语言:javascript复制
const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("Success!");
  }, 2000);
});

promise
  .then(result => console.log(result))
  .catch(error => console.log(error));

在此示例中,使用 setTimeout 函数创建了一个 promise,该函数在 2 秒后调用 resolve 函数。promise 有两个方法,then 和 catch,可用于处理已解析的值或发生的任何错误。

9.解释JavaScript中==和===的区别

==(松散相等)在执行任何必要的类型转换后比较两个值是否相等。===(严格相等)在不执行任何类型转换的情况下比较两个值是否相等。

代码语言:javascript复制
console.log(0 == false); // true
console.log(0 === false); // false

在此示例中,0 和 false 大致相等,因为它们都是假值,但它们并不严格相等,因为 0 是数字而 false 是布尔值。

通常建议在 JavaScript 中使用 === 进行比较,因为它可以帮助防止意外的类型强制转换。

10.解释JavaScript中let、var、const的区别

let 和 var 用于在 JavaScript 中声明变量,但它们的行为略有不同。let 变量是块作用域的,这意味着它们只能在声明它们的块内访问。

var 变量是函数作用域的,这意味着它们可以在它们声明的整个函数内访问。

代码语言:javascript复制
if (true) {
  let x = 5;
}
console.log(x); // ReferenceError: x is not definedCopy code
代码语言:javascript复制
if (true) {
  var x = 5;
}
console.log(x); // 5

const 用于声明一个常量变量,这意味着它的值在声明后不能重新赋值。

代码语言:javascript复制
const x = 5;
x = 10; // TypeError: Assignment to constant variable

一般来说,最佳实践是默认使用 const,并且仅在需要重新分配变量时才使用 let。

0 人点赞