JS面试题大汇总及答案.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

JS面试题大汇总及答案

一、基础概念类

说说变量提升,var、let、const的区别?

变量提升是JS解析时,把var声明的变量/函数声明提到作用域顶部的行为(函数声明优先级高于变量)。

区别:

var:函数级作用域,存在变量提升,可重复声明、重复赋值;

let/const:块级作用域({}内),无变量提升(有暂时性死区,声明前用会报错),不可重复声明;

const:声明常量,赋值后不能改引用(对象/数组内部属性可改),声明时必须赋值。

例:console.log(a);vara=1;不报错(a提升为undefined),换成let则报错。

typeof和instanceof的区别?

都用于判断类型,但适用场景不同:

typeof:检测基本类型(返回string/number/boolean/undefined/symbol/bigint/function),但null会误判为object,引用类型(数组、对象)都返回object;

instanceof:检测原型链,判断A是否是B的实例(AinstanceofB→看B.prototype是否在A的__proto__链上),只能检测引用类型。

例:[]instanceofArray→true,[]instanceofObject→true(数组是Object子类);typeofnull→object(JS历史bug)。

二、原型与继承类

讲下原型链的概念,JS如何实现继承?

原型链:每个对象都有__proto__(隐式原型),指向其构造函数的prototype(显式原型);当访问对象属性时,若自身没有,会顺着__proto__往上找,直到Object.prototype.proto=null,这条链就是原型链。

常见继承方式:

原型链继承:Child.prototype=newParent()→缺点:子类实例共享父类引用属性(如父类有数组,一个子类改了全变);

构造函数继承:functionChild(){Parent.call(this)}→缺点:不能继承父类原型上的方法;

组合继承(常用):原型链+构造函数→解决上述两个问题,但父类构造函数会执行两次;

ES6class继承:classChildextendsParent{constructor(){super()}}→语法糖,本质还是原型继承,解决组合继承的缺点。

prototype和__proto__的区别?

prototype:是构造函数的属性,指向原型对象(用于存放子类共享的方法/属性);

proto:是实例对象的属性,指向其构造函数的prototype(用于查找原型链上的属性);

例:letarr=[]→arr.proto===Array.prototype→Array.prototype.proto===Object.prototype。

三、异步编程类

什么是回调地狱?怎么解决?

回调地狱:多层异步操作嵌套(如Ajax回调里套Ajax),代码可读性差、难维护。

解决方案:

Promise链式调用:用.then()串联异步操作,错误统一用.catch()捕获;

async/await:ES7语法,把异步代码写成同步风格,需配合try/catch处理错误;

例:

//Promise解决

fetchData1()

.then(res1=fetchData2(res1))

.then(res2=fetchData3(res2))

.catch(err=console.log(err))

//async/await解决

asyncfunctiongetData(){

try{

constres1=awaitfetchData1()

constres2=awaitfetchData2(res1)

constres3=awaitfetchData3(res2)

}catch(err){

console.log(err)

}

}

Promise有哪些状态?all和race的区别?

Promise有三种状态:pending(等待)、fulfilled(成功)、rejected(失败),状态一旦改变就不能再变。

Promise.all([p1,p2,p3]):所有Promise都成功,才返回成功结果数组;只要有一个失败,就返回第一个失败的原因;适合“所有操作都完成才继续”的场景(如同时请

文档评论(0)

151****9429 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档