基礎(chǔ)面試題js

1、js的this是怎么工作的芥驳?(這個大概就是問this是什么)
答:1柿冲、this總是指向函數(shù)的直接調(diào)用者。2兆旬、如果有new關(guān)鍵字假抄,this指向new出來的那個對象。3丽猬、在MOD實踐中宿饱,this指向目標(biāo)元素。4脚祟、箭頭函數(shù)的this指向它所在的函數(shù)作用域谬以,并且不能改變,始終指向的是window由桌。
2为黎、原型繼承的原理?
答:在new一個函數(shù)的時候行您,會返回一個實例铭乾,這個實例里有一個porto指向它的原型,同時這個function會有一個prototype屬性指向這個原型娃循,當(dāng)訪問這個實例上的屬性的時候如果沒有的話炕檩,會順著proto指向的原型上找,如果原型上沒有的話捌斧,會順著proto找原型的原型笛质,一直指到object的實例泉沾,如果找到了,會把這個值賦值給你所需要的這個變量妇押。優(yōu)點:所有的對象都可以共享原型鏈上的方法跷究,它的優(yōu)勢就是能夠節(jié)省內(nèi)存,非常方便舆吮。應(yīng)用場景:jquery的符號揭朝,在源碼上就能看到是放在jquery的原型上队贱,當(dāng)我們使用的時候就很方便的拿到一些屬性色冀,vue開發(fā)的時候axios就是放在vue的實例上,我們通過$axios就可以在任何文件上使用這個方法柱嫌。
3锋恬、什么是閉包,怎么用编丘?
答:在js中函數(shù)可以訪問函數(shù)外部的變量的与学,但是在外部拿不到內(nèi)部的變量,A一個函數(shù)嘉抓,B是A里面的子函數(shù)索守,在B里面把A的變量return出去,再把B函數(shù)給return出去抑片,如果我要用A里面的變量就可以直接調(diào)用B函數(shù)了卵佛,這個就是閉包。
優(yōu)點:可訪問函數(shù)內(nèi)部的變量,防止變量污染作用域(隱藏變量),從而實現(xiàn)封裝敞斋。
缺點:本來局部變量會被垃圾回收機制給回收的截汪,但是我們給返回到外面了,并且在引用的情況下植捎,是不回被回收的衙解,會造成內(nèi)存的一些浪費
4、call焰枢、apply蚓峦、bind的區(qū)別是什么?
答:call济锄、apply暑椰、bind三個為改變this指向的方法。
共同點:第一個參數(shù)都為改變this的指針拟淮。若第一參數(shù)為null/undefined干茉,this默認(rèn)指向window
區(qū)別:call(無數(shù)個參數(shù))參數(shù)是一個一個傳遞。第一個參數(shù):改變this指向很泊;第二個參數(shù):實參角虫;使用之后會自動執(zhí)行該函數(shù)

function fn(a,b,c){
        console.log(this,a+b+c); // this指向window
    }
    fn();
    fn.call(document,1,2,3);//call改變之后this指向document  
    //輸出 #document 6   1,2,3是實參 結(jié)果相加為6

apply(兩個參數(shù))是把所有參數(shù)組成一個數(shù)組傳遞沾谓。第一個參數(shù):改變this指向;第二個參數(shù):數(shù)組(里面為實參)戳鹅;使用時候會自動執(zhí)行函數(shù)

function fn(a,b,c){
        console.log(this,a+b+c); 
    }
    fn();
    fn.apply(document,[1,2,3]); 

bind(無數(shù)個參數(shù))均驶,第一個參數(shù):改變this指向;第二個參數(shù)之后:實參枫虏;返回值為一個新的函數(shù)

function fn(a,b,c){
    console.log(this,a+b+c); //window
}
let ff = fn.bind('小明',1,2,3); //手動調(diào)用一下

使用的時候需要手動調(diào)用下返回 的新函數(shù)(不會自動執(zhí)行)
5妇穴、請指出js宿主對象(host object)和原生對象(native object)的區(qū)別?
答:宿主對象是指DOM和BOM隶债;宿主對象不是引擎的原生對象腾它,是宿主框架通過某種機制注冊到j(luò)s引擎里的對象。
原生對象是指Object死讹、Function瞒滴、Array、String赞警、Boolean妓忍、Number、Date愧旦、RegExp世剖、Error、Math等對象笤虫。除了內(nèi)置對象旁瘫,還有一些在運行過程中創(chuàng)建出的對象。
6耕皮、請指出下面代碼的區(qū)別:function person()境蜕、var person = Parson()、var person = new Person()凌停。
答:function person():聲明一個person函數(shù)粱年,this指向window;var person = Parson():將Parson方法返回的結(jié)果給person變量罚拟,如果沒有返回值則是undefined台诗,this指向person;var person = new Person():創(chuàng)建一個構(gòu)造函數(shù)赐俗,this指向Person拉队。
7、請解釋變量聲明提升
答:舉一個例子:

foo(2);

function foo(a){
  console.log(a);
}

編譯階段:1阻逮、先遇見了foo(2),一個函數(shù)執(zhí)行粱快,不是我編譯器的活,略過。2事哭、發(fā)現(xiàn)了function漫雷,告訴JS引擎編譯器有函數(shù)要聲明垄潮,需要在當(dāng)前作用域內(nèi)的內(nèi)存中開辟一塊空間給foo税弃,繼續(xù)編譯函數(shù)內(nèi)部(從上到下一行一行編譯),遇到形參a后在函數(shù)內(nèi)存里開辟一塊空間給a躲叼,只不過現(xiàn)在a的值為undefined谤辜,繼續(xù)走蓄坏,結(jié)束。
執(zhí)行階段:1丑念、遇到了foo(2)涡戳,引擎:作用域,你見過foo沒渠欺?作用域:見過妹蔽,剛才編譯器那小子剛聲明了他,我給你挠将。引擎:好的。那我來執(zhí)行以下foo這個函數(shù)编整。作用域兄弟舔稀,你在foo中見過a嗎?作用域:有掌测,編譯器也聲明他了内贮,給你。引擎:謝了哥們汞斧,我把2復(fù)制給他夜郁。
來一個測試題

var a = new Object();
a.param = 123;

function foo(){
  get = function(){
      console.log(1);
  };
  return this;
}

foo.get = function(){
  console.log(2);
};

foo.prototype.get = function(){
  console.log(3);
};

var get = function(){
  console.log(4);
};

function get(){
  console.log(5);
}

foo.get();
get();
foo().get();
get();
new foo.get();
new foo().get();
new new foo().get();
// 2,4粘勒,1竞端,1,2庙睡,3事富,3

8、什么是use strict乘陪?使用它的好處和壞處分別是什么统台?
答:只要在js文件的第一行加上use steict就是開啟嚴(yán)格模式,嚴(yán)格模式下的this不是指向window啡邑,指向的是undefined贱勃,幫助我們養(yǎng)成良好的代碼習(xí)慣,有一些不嚴(yán)謹(jǐn)?shù)拇a會報錯。
9贵扰、什么是事件循環(huán)(event loop)?
js是單線程的族展,也就是說一個時間只能做一件事,做什么事都要排隊拔鹰,想要同一時間做多件事情仪缸,這就衍生出了異步,將事件放在消息隊列里列肢,先執(zhí)行可以直接執(zhí)行的操作恰画,之后不停的去詢問消息隊列:有沒有要執(zhí)行的?如果有就取出來放到主線程里執(zhí)行瓷马,如果沒有就繼續(xù)之前的操作拴还。舉個例子:

console.log('start')

setTimeout(function() {
    console.log('setTimeout')
}, 0)

console.log('end')
// start
// end
// setTimeout

在上述的例子中兩個console是同步代碼,所以直接進(jìn)入主線程的執(zhí)行棧中執(zhí)行欧聘,setTimeout是異步代碼所以放到消息隊列里片林。在執(zhí)行棧中按照代碼從上到下的執(zhí)行順序,打印 start => end怀骤。執(zhí)行棧中的任務(wù)全部完成后费封,對消息隊里進(jìn)行輪詢,由于定時器設(shè)定的時間為0蒋伦,所以會在執(zhí)行棧的任務(wù)清空后立即執(zhí)行弓摘,所以上述例子的打印結(jié)果為start => end => setTimeout

大致總結(jié)js事件線程循環(huán)的過程:
1、所有任務(wù)都在主線程上執(zhí)行痕届,形成一個執(zhí)行棧韧献。
2、所有執(zhí)行棧中的所有同步任務(wù)執(zhí)行完畢研叫,js就會讀取息隊列中的異步任務(wù)锤窑,如果有可以執(zhí)行的任務(wù)就把他放在執(zhí)行棧中并開始執(zhí)行。
3嚷炉、主線程不斷重復(fù)上面第二步渊啰,這樣的一個循環(huán)成為事件循環(huán)。
js事件循環(huán)中有異步隊列有兩種:宏任務(wù)隊列(macro)和微任務(wù)隊列(micro)
常見的宏任務(wù)比如:setTimeout渤昌、setInterval虽抄、 setImmediate、script(整體代碼)独柑、 I/O 操作迈窟、UI 渲染等。
常見的微任務(wù)比如:process忌栅。nextTick车酣、Pormise曲稼、MutationObserver 等。
eventLoop循環(huán)過程:
1湖员、初始狀態(tài):微任務(wù)隊列只有一個script腳本贫悄;(整體代碼為宏任務(wù))
2、【宏任務(wù)階段】執(zhí)行script代碼娘摔,創(chuàng)建宏任務(wù)到宏任務(wù)調(diào)用棧中窄坦,創(chuàng)建的微任務(wù)到微任務(wù)調(diào)用棧中。
3凳寺、【微任務(wù)階段】執(zhí)行微任務(wù)鸭津,調(diào)出當(dāng)前微任務(wù)中的所有微任務(wù),一次性執(zhí)行肠缨,其中如果有宏任務(wù)推到宏任務(wù)棧中逆趋。
4、【宏任務(wù)階段】執(zhí)行宏任務(wù)晒奕,調(diào)用當(dāng)前宏任務(wù)棧中的第一個宏任務(wù)闻书,其中有創(chuàng)見的微任務(wù)推到微任務(wù)棧中。
5脑慧、如果代碼沒結(jié)束魄眉,循環(huán)執(zhí)行3、4步驟漾橙。
總結(jié):
1杆融、宏任務(wù)和微任務(wù)是交替進(jìn)行的
2、每個宏任務(wù)只執(zhí)行棧中的第一個任務(wù)霜运,執(zhí)行完就執(zhí)行微任務(wù)。微任務(wù)執(zhí)行棧中所有的微任務(wù)蒋腮。

console.log('sync');
 
setTimeout(function () {
   console.log('setTimeout')
}, 0);
 
var promise = new Promise(function (resolve, reject) {
   console.log('promise');
   setTimeout(function() {
      promise.then(function(){
        console.log('promise-setTimeout-then')    
      })
      console.log('promise-setTimeout')
   }, 0);
   resolve();
});
 
promise.then(function() {
    setTimeout(function() { 
            promise.then(function(){
                console.log('then-setTimeout-then')    
            })
            console.log('then-setTimeout')
    }, 0);
    console.log('then');
    promise.then(function(){
        console.log('then-than')    
    })
})
////宏任務(wù)階段
sync  
promise
//微任務(wù)階段
then
then - than
//宏任務(wù)階段
setTimeout
//微任務(wù)階段(沒有任務(wù)淘捡,沒有輸出)
//宏任務(wù)階段
promise - setTimeout
//微任務(wù)階段
promise - setTimeout - then
//宏任務(wù)階段
then - setTimeout
//微任務(wù)階段
then-setTimeout-then

如果不清楚請?zhí)D(zhuǎn)鏈接:https://blog.csdn.net/webjhh/article/details/116759051
10、請解釋同步和異步的區(qū)別池摧。
11焦除、http的狀態(tài)碼
答:1信息,服務(wù)器接收到請求作彤,請求者繼續(xù)吧
2
成功膘魄。
3重定向,需要進(jìn)一步操作來完成請求
4
客戶端錯誤
5**服務(wù)端錯誤
16竭讳、瀏覽器的垃圾回收機制是什么创葡?
12、構(gòu)造函數(shù)new的過程
1绢慢、創(chuàng)建一個新對象
2灿渴、把當(dāng)前構(gòu)造函數(shù)的作用域給新的對象(此時this指向就會指向新對象)
3、執(zhí)行構(gòu)造函數(shù)中的代碼(給新的對象添加方法或者是屬性)
4、返回新對象
通過new關(guān)鍵字創(chuàng)建的對象會有一個constructor屬性骚露,該屬性指向的是當(dāng)前的這個對象蹬挤。
注意:原本構(gòu)造函數(shù)是window對象的方法,如果不是用new調(diào)用棘幸,那么指向的還是window焰扳,那么this指向也是window。如果是用new關(guān)鍵字調(diào)用误续,那么this指向就是當(dāng)前的對象吨悍。
13、如果后端給前端一個很大的數(shù)女嘲,前端要怎么處理畜份?
答:分頁,滾動加載欣尼,加lodding爆雹,節(jié)流。
14愕鼓、函數(shù)的節(jié)流和防抖
函數(shù)節(jié)流是指一定時間內(nèi)js方法只跑一次
函數(shù)防抖是指頻繁觸發(fā)的情況下钙态,只有足夠的空閑時間,才執(zhí)行代碼一次菇晃。
函數(shù)防抖的要點册倒,也是需要一個setTimeout來輔助實現(xiàn)。延遲執(zhí)行需要跑的代碼磺送。
如果方法多次觸發(fā)驻子,則把上次記錄的延遲執(zhí)行代碼用clearTimeout清掉,重新開始估灿。
如果計時完畢崇呵,沒有方法進(jìn)來訪問觸發(fā),則執(zhí)行代碼馅袁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末域慷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子汗销,更是在濱河造成了極大的恐慌犹褒,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弛针,死亡現(xiàn)場離奇詭異叠骑,居然都是意外死亡,警方通過查閱死者的電腦和手機钦奋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門座云,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疙赠,“玉大人,你說我怎么就攤上這事朦拖∑匝簦” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵璧帝,是天一觀的道長捍岳。 經(jīng)常有香客問我,道長睬隶,這世上最難降的妖魔是什么锣夹? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮苏潜,結(jié)果婚禮上银萍,老公的妹妹穿的比我還像新娘。我一直安慰自己恤左,他們只是感情好贴唇,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著飞袋,像睡著了一般戳气。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上巧鸭,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天瓶您,我揣著相機與錄音,去河邊找鬼纲仍。 笑死呀袱,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的郑叠。 我是一名探鬼主播压鉴,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼锻拘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起击蹲,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤署拟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后歌豺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體推穷,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年类咧,在試婚紗的時候發(fā)現(xiàn)自己被綠了馒铃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蟹腾。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖区宇,靈堂內(nèi)的尸體忽然破棺而出娃殖,到底是詐尸還是另有隱情,我是刑警寧澤议谷,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布炉爆,位于F島的核電站,受9級特大地震影響卧晓,放射性物質(zhì)發(fā)生泄漏芬首。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一逼裆、第九天 我趴在偏房一處隱蔽的房頂上張望郁稍。 院中可真熱鬧,春花似錦胜宇、人聲如沸耀怜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽封寞。三九已至,卻和暖如春仅财,著一層夾襖步出監(jiān)牢的瞬間狈究,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工盏求, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留抖锥,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓碎罚,卻偏偏與公主長得像磅废,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子荆烈,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容