- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
JS常见面试题及答案(贴近实战版)
1.说下原型和原型链,实际开发中哪里用到?
答案:
原型是JS对象的“模板”,每个对象(除null)都有__proto__(隐式原型),指向其构造函数的prototype(显式原型)。原型链就是对象通过__proto__逐层向上查找属性的链条,直到Object.prototype.__proto__(值为null)。
实际用例:
实现继承:比如封装组件时,让自定义弹窗构造函数的prototype指向Object.create(基础弹窗.prototype),复用基础弹窗的“关闭”“显示”方法;
共享方法:数组的map、filter方法都存在Array.prototype上,所有数组实例通过原型链调用,避免每个数组都复制一份方法,节省内存。
注意:不要直接修改__proto__,性能差且不推荐,推荐用Object.create或class(ES6语法糖,本质还是原型)。
2.闭包是什么?用它的时候要注意什么?
答案:
闭包就是“函数嵌套函数,内层函数引用外层函数的变量,且内层函数被外部访问”,这时外层函数的变量不会被GC(垃圾回收)回收,能一直被内层函数使用。
实际例子:
写防抖函数时用闭包存定时器ID,避免每次调用防抖函数都重新创建定时器:
functiondebounce(fn,delay){
lettimer=null;//闭包保存timer,不会被回收
returnfunction(){
clearTimeout(timer);
timer=setTimeout(()=fn.apply(this,arguments),delay);
};
}
constinputDebounce=debounce(handleInput,300);
注意点:
内存泄漏:如果闭包引用的变量是大对象(比如DOM元素),且闭包一直存在(比如没清除的定时器、全局变量引用),会导致内存占着不放,要及时销毁(比如清除定时器、解除全局引用);
不要过度使用:比如循环里创建闭包(早期var变量提升问题),现在用let块级作用域能避免,但仍需注意没必要的闭包会增加内存开销。
3.this指向怎么判断?举几个常见场景
答案:
this指向“调用函数的对象”,不是定义时的对象,核心看“谁调用”,分5种常见场景:
全局调用(非严格模式):this指向window(浏览器)/global(Node),严格模式下是undefined;
例:functionfn(){console.log(this)}fn()→非严格模式输出window。
对象方法调用:this指向调用方法的对象;
例:constobj={name:a,say(){console.log(this.name)}}obj.say()→输出a。
call/apply/bind:this指向第一个参数(传null/undefined时,非严格模式指向window);
例:obj.say.call({name:b})→输出b。
构造函数(new):this指向新创建的实例;
例:functionPerson(name){this.name=name}constp=newPerson(c)→p.name是c。
箭头函数:没有自己的this,继承外层“非箭头函数”的this(跟定义位置有关,不是调用位置);
例:constobj={fn:()={console.log(this)}}obj.fn()→输出window(因为fn是箭头函数,继承外层全局的this)。
实际坑点:Vue组件methods里的this指向组件实例,就是因为Vue内部用call把this绑定到了实例上。
4.0.1+0.2为什么不等于0.3?怎么解决?
答案:
因为JS用“二进制浮点数”存储数字,而0.1和0.2转成二进制后是无限循环的,浏览器会截取前53位(JS能精确表示的最大位数),导致精度丢失,所以相加后是0.30000000000000004,不是0.3。
解决方法(实际开发常用):
转成整数计算:比如涉及金额时,把元转成分(乘以100),计算后再转回去;
例:(0.1*10+0.2*10)/10=0.3。
用toFixed(注意四舍五入坑):需要先判断小数位数,比如(0.1+0.2).toFixed(1)→输出0.3(但1.335.toFi
您可能关注的文档
最近下载
- 急性胰腺炎护理查房课件(完整版).pptx VIP
- 如何做合格的研究生导师.ppt VIP
- GB50084-2001(2005版)自动喷水灭火系统设计规范.docx VIP
- 绿色“垃圾不落地城市更美丽”节能环保树立垃圾分类新观念PPT模板课件.pptx VIP
- 铁路栅栏改移重点项目施工专项方案.doc
- ApacheCN 编程/大数据/数据科学/人工智能学习资源 2019.8.pdf VIP
- 精品解析:北京市八中2023-2024学年九年级上学期期中考试物理试题(解析版).docx VIP
- 大数据互联网科技PPT模板 .pptx VIP
- (人教版)九年级英语第一次月考试卷(含答案).pdf VIP
- 隐球菌性脑膜炎护理.pptx VIP
文档评论(0)