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