js经典面试题及答案.docx
js经典面试题及答案
1.什么是事件冒泡和事件捕获?请解释它们之间的区别。
答案:
事件冒泡和事件捕获是描述事件在DOM中如何传播的两种机制。
事件冒泡:当一个事件在一个元素上被触发后,会向上传播到它的父元素,然后是父元素的父元素,直到到达文档的根元素。大多数现代浏览器默认支持事件冒泡。
事件捕获:与冒泡相反,事件捕获是从文档的根元素开始,向下传播到目标元素。在事件到达目标元素之前,它首先会在祖先元素中被捕获。
区别在于,事件捕获先于事件目标执行,而事件冒泡在事件目标执行之后。
2.请解释`null`和`undefined`之间的区别。
答案:
`null`和`undefined`都是JavaScript中的特殊值,但它们表示不同的概念。
`null`是一个表示“空”或“无”的对象标识符。它是一个赋值给变量的值,表示变量故意没有值。
`undefined`表示未定义,即一个变量已经声明但未初始化时的值。它也用于表示函数没有返回值时的默认返回值。
3.什么是闭包(Closure)?请提供一个例子。
答案:
闭包是一个函数,它能够访问并保持对创建该函数时的作用域链的引用。闭包允许函数访问外部函数作用域中的变量。
例子:
```javascript
functionouter(){
letouterVar=Iamfromouterfunction;
functioninner(){
letinnerVar=Iamfrominnerfunction;
console.log(outerVar);//输出:Iamfromouterfunction
}
returninner;
}
constmyClosure=outer();
myClosure();//输出:Iamfromouterfunction
```
4.请解释`==`和`===`之间的区别。
答案:
`==`是等于运算符,它会在比较前进行类型转换(如果两个值不是同一类型)。这被称为“宽松比较”。
`===`是严格等于运算符,它不会进行类型转换,如果两个值类型不同,直接返回`false`。这被称为“严格比较”。
5.如何检查一个变量是否为数组?
答案:
有多种方法可以检查一个变量是否为数组:
使用`Array.isArray()`方法:
```javascript
Array.isArray(variable);//返回true或false
```
使用`instanceof`运算符:
```javascript
variableinstanceofArray;//返回true或false
```
使用`Object.prototype.toString.call()`方法:
```javascript
Object.prototype.toString.call(variable)===[objectArray];//返回true或false
```
6.请解释异步编程中的Promise及其三种状态。
答案:
Promise是一个对象,它代表了一个异步操作的最终完成(或失败)及其结果值。Promise有三种状态:
待定(Pending):初始状态,既不是成功,也不是失败状态。
已兑现(Fulfilled):意味着操作成功完成。
已拒绝(Rejected):意味着操作失败。
7.如何实现深拷贝和浅拷贝?
答案:
浅拷贝:只复制对象的第一层属性,如果属性是基本类型,则复制值;如果属性是引用类型,则复制引用。
```javascript
letobj={a:1,b:{c:2}};
letshallowCopy={...obj};
```
深拷贝:复制对象的所有层级属性,每个属性值都完全独立于原对象。
```javascript
functiondeepCopy(obj){
letclone=Array.isArray(obj)?[]:{};
for(letkeyinobj){
if(obj.hasOwnProperty(key)){
clone[key]=typeofobj[key]===objectobj[key]!==null?deepCopy(obj[key]):obj[key];
}
}
returnclone;
}
```