- 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基础面试题及答案
1.JS数据类型有哪些?怎么判断具体类型?
答案:
分两大类:
基本类型(7种):String、Number、Boolean、Undefined、Null、Symbol、BigInt
引用类型:Object(包括Array、Function、Date、RegExp等)
判断方法:
typeof:适合判断基本类型(除了Null,typeofnull会返回object,这是历史bug),判断引用类型时除了Function返回function,其他都返回object。
例:typeofabc→string,typeof[1,2]→object
instanceof:适合判断引用类型,原理是检查原型链上是否有该构造函数的prototype。
例:[1,2]instanceofArray→true,{}instanceofObject→true
Object.prototype.toString.call():最精准的方法,能返回[object类型]格式,支持所有类型。
例:Object.prototype.toString.call(null)→[objectNull],Object.prototype.toString.call(Symbol())→[objectSymbol]
2.变量提升和函数提升有什么区别?举个例子说明
答案:
两者都是JS预编译阶段的行为,会把声明“提前”到作用域顶部,但规则不同:
变量提升:只提升var声明的变量名,不提升赋值;let/const没有变量提升(有暂时性死区)。
函数提升:function声明的函数,会把“函数名+函数体”一起提升;函数表达式(如varfn=function(){})只提升变量名,不提升函数体。
例子:
//变量提升案例
console.log(a);//undefined(只提升声明,没提升赋值)
vara=10;
//函数提升案例
fn1();//能执行(函数体一起提升)
functionfn1(){console.log(fn1);}
fn2();//报错(只提升变量名,fn2此时是undefined)
varfn2=function(){console.log(fn2);}
3.this指向有哪些场景?分别怎么确定?
答案:
this指向不是定义时决定的,是调用时决定的,常见场景:
普通函数调用:this指向全局对象(浏览器是window,Node是global),严格模式下指向undefined。
例:functionfn(){console.log(this);}fn();//window(非严格模式)
对象方法调用:this指向调用方法的对象。
例:constobj={name:a,fn(){console.log(this.name);}};obj.fn();//a
构造函数调用(new):this指向新创建的实例对象。
例:functionPerson(name){this.name=name;}constp=newPerson(b);console.log(p.name);//b
箭头函数:没有自己的this,继承外层作用域的this(一旦确定就不会变)。
例:constobj={fn:()={console.log(this);}};obj.fn();//window(继承全局this)
call/apply/bind:直接改变this指向,第一个参数就是新的this值。
例:functionfn(){console.log(this.name);}constobj={name:c};fn.call(obj);//c
4.什么是闭包?实际开发中怎么用?有什么问题要注意?
答案:
定义:函数嵌套时,内层函数引用了外层函数的变量/参数,且内层函数被外层函数以外的地方调用,这时就形成闭包(外层函数的作用域不会被销毁)。
实际用途:
保存变量状态:比如循环中保存索引(避免经典的var循环问题)。
例:
for(vari=0;i3;i++){
(function(j){//闭包保存j的值
setTimeout(()=console.log(j),1000);
})(i);
}
//输出:0、1、2(如果不用闭包会输出3次3)
实现私有变量:比如模块封装,隐藏内部变量,只暴露方法。
例:
functioncreate
原创力文档


文档评论(0)