你在准备 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。