js高級(jí)經(jīng)典面試題(待更新)
new關(guān)鍵字做了什么
1. 開(kāi)辟一個(gè)內(nèi)存存放新創(chuàng)建的對(duì)象--創(chuàng)建實(shí)例對(duì)象
2. 將構(gòu)造函數(shù)里的this指向?qū)嵗龑?duì)象
3. 給實(shí)例對(duì)象新增屬性和方法
4. 隱式的返回了實(shí)例對(duì)象
深拷貝淺拷貝的區(qū)別
淺拷貝,指的是創(chuàng)建新的數(shù)據(jù)媳维,這個(gè)數(shù)據(jù)有著原始數(shù)據(jù)屬性值的一份精確拷貝
如果屬性是基本類型酿雪,拷貝的就是基本類型的值。如果屬性是引用類型侄刽,拷貝的就是內(nèi)存地址
在JavaScript中指黎,存在淺拷貝的現(xiàn)象有:
1. Object.assign
2. Array.prototype.slice()
3. Array.prototype.concat()
4. 使用拓展運(yùn)算符實(shí)現(xiàn)的復(fù)制
深拷貝開(kāi)辟一個(gè)新的棧,兩個(gè)對(duì)象屬完成相同唠梨,但是對(duì)應(yīng)兩個(gè)不同的地址袋励,修改一個(gè)對(duì)象的屬性,不會(huì)改變另一個(gè)對(duì)象的屬性
常見(jiàn)的深拷貝方式有:
1. 遞歸 for-in遍歷
2. JSON.parse(JSON.stringify())
3. jQuery $.extend
4. lodash _.cloneDeep()
淺談對(duì)this指向的理解
1. 普通函數(shù)中:this → window
2. 普通對(duì)象里的方法(函數(shù)): 對(duì)象本身
3. 定時(shí)器中: this → window
4. 構(gòu)造函數(shù)中: this → 當(dāng)前實(shí)例化的對(duì)象
5. 事件處理函數(shù)中:this → 事件的觸發(fā)對(duì)象
閉包的理解
閉包就是函數(shù)中包含另一個(gè)函數(shù)当叭,可以讓你在函數(shù)外部讀取到內(nèi)部的變量(就是在函數(shù)內(nèi)部再定義一個(gè)函數(shù)),讓這些變量的值始終保持在內(nèi)存中盖灸,可以達(dá)到延長(zhǎng)變量生命周期的效果蚁鳖,過(guò)多使用會(huì)導(dǎo)致內(nèi)存泄漏的問(wèn)題
原型鏈
Javascript 是面向?qū)ο蟮模總€(gè)實(shí)例對(duì)象都有一個(gè)__proto_屬性赁炎,該屬性指向它原型對(duì)象醉箕,這個(gè)實(shí)例對(duì)象的構(gòu)造函數(shù)有一個(gè)原型屬性 prototype,與實(shí)例的 __proto__屬性指向同一個(gè)對(duì)象徙垫。當(dāng)一個(gè)對(duì)象在查找一個(gè)屬性的時(shí)讥裤,自身沒(méi)有就會(huì)根據(jù)__proto__ 向它的原型進(jìn)行查找,如果都沒(méi)有姻报,則向它的原型的原型繼續(xù)查找己英,直到查到 Object.prototype._proto_為 nul,這樣也就形成了原型鏈吴旋。
bind损肛、call厢破、apply 區(qū)別
1.call和apply會(huì)調(diào)用函數(shù),且會(huì)改變函數(shù)內(nèi)部的this指向
2.call和apply傳遞的參數(shù)不一樣治拿,call 的參數(shù)是直接放進(jìn)去的摩泪,第二第三第 n 個(gè)參數(shù)全都用逗號(hào)分隔。而 apply 的所有參數(shù)都必須放在一個(gè)數(shù)組里面?zhèn)鬟M(jìn)去劫谅。
3.bind 不會(huì)調(diào)用函數(shù)见坑,可以改變函數(shù)內(nèi)部指向,返回是函數(shù)捏检,它的參數(shù)和 call 一樣奸例。
防抖和節(jié)流
防抖: n 秒后在執(zhí)行該事件,若在 n 秒內(nèi)被重復(fù)觸發(fā)擂仍,則重新計(jì)時(shí)
節(jié)流: n 秒內(nèi)只運(yùn)行一次粥航,若在 n 秒內(nèi)重復(fù)觸發(fā),只有一次生效