文档详情

js经典面试题及答案.docx

发布:2025-01-19约1.98千字共6页下载文档
文本预览下载声明

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;

}

```

显示全部
相似文档