嘗試解析js面試題(二)

說明:一共有13題(原本14題,最后一道什么鬼里覆,嫌棄不要了)丧荐,覆蓋面比較廣,都屬于比較燒腦的類型喧枷,各種神坑虹统;不過對于夯實js理論基礎(chǔ)幫助非常大;看看都能做對幾題吧(????)

//第1題
(function () {  
    return typeof arguments;  
})();  
A. "object"
B. "array"
C. "arguments"
D. "undefined"

//第2題
var f = function g() {
    return 23;
};
typeof g();
A. "number"
B. "undefined"
C. "function"
D. Eorror

//第3題
(function (x) {
    delete x;
    return x;
})(1);
A. 1
B. null
C. undefined
D. Error

//第4題
var y = 1,
x = y = typeof x;
x;
A. 1
B. "number"
C. undefined
D. "undefined"

//第5題
(function f(f) {
    return typeof f();
})(function () {
    return 1;
});
A. "number"
B. "undefined"
C. "function"
D. Error

//第6題
var foo = {
bar: function () {
    return this.baz;
},
    baz: 1
};
(function () {
    return typeof arguments[0]();
})(foo.bar);
A. "undefined"
B. "object"
C. "number"
D. "function"

//第7題
var foo = {
bar: function () {
    return this.baz;
},
    baz: 1
};
typeof (f = foo.bar)();
A. "undefined"
B. "object"
C. "number"
D. "function"

//第8題
var f = (function f() {
return "1";
}, function g() {
    return 2;
})();
typeof f;
A. "string"
B. "number"
C. "function"
D. "undefined"

//第9題
var x = 1;
if (function f() {}) {
    x += typeof f;
}
x;
A. 1
B. "1function"
C. "1undefined"
D. NaN

//第10題
var x = [typeof x, typeof y][1];
typeof typeof x;
A. "number"
B. "string"
C. "undefined"
D. "object"

//第11題
(function (foo) {
    return typeof foo.bar;
})({
    foo: {
        bar: 1
    }
});
A隧甚、“undefined” 
B车荔、“object” 
C、“number” 
D戚扳、Error

//第12題
(function f() {
    function f() {
        return 1;
    }
    return f();
    function f() {
        return 2;
    }
})();
A忧便、1 
B、2 
C咖城、Error (e.g. “Too much recursion”) 
D茬腿、undefined

//第13題
function f() {
    return f;
}
new f() instanceof f;
A呼奢、true 
B宜雀、false

//第14題
with (function(x, undefined){}) length;
A、1 
B握础、2 
C辐董、undefined 
D、Error

解析

ps1:這套題在知乎上也有相關(guān)的解析可以參考如何理解這14道JavaScript 題--知乎

//第1題  答案A
(function () {  
    return typeof arguments;  
})();  
A. "object"
B. "array"
C. "arguments"
D. "undefined"

arguments是函數(shù)免費贈送的一個關(guān)鍵字禀综,功能類似數(shù)組简烘,但實際上是一個對象,因此這題答案是A

//舉個arguments的例子
function foo(x) {
    alert(x); // 10
    for (var i=0; i<arguments.length; i++) {
        alert(arguments[i]); // 10, 20, 30
    }
}
foo(10, 20, 30);

//第2題  答案D
var f = function g() {
    return 23;
};
typeof g();
A. "number"
B. "undefined"
C. "function"
D. Eorror

1)函數(shù)定義有兩種方式定枷,一種是普通函數(shù)直接聲明function a () {return b;};(這種在解析時會被優(yōu)先處理)

2)另外一種就是匿名函數(shù) var a = function () {returnb;};孤澎,這種也被稱為表達(dá)式類型,因為右邊部分已經(jīng)成為一個表達(dá)式的一部分欠窒,無法再被正常訪問

3)題目中的情況按照第二種方法理解覆旭,作為表達(dá)式的g函數(shù)已經(jīng)無法被訪問

4)注意,題目是typeof g()岖妄,不是typeof g型将;這兩者的區(qū)別在于函數(shù)調(diào)用"()"的運算優(yōu)先級高于typeof,所以先解析g()的情況下荐虐,js直接報錯七兜,而不是給出"undefiend";因此答案是D

//調(diào)試比對結(jié)果
//typeof a是function這個沒有問題
//typeof fn1是得到undefined
//typeof fn1()是錯誤報警形式出現(xiàn)
var a = function fn1 (){}
typeof a  //"function"
typeof fn1()  //Uncaught ReferenceError: fn1 is not defined(…)
typeof fn1  //"undefined"

//第3題  答案A
(function (x) {
    delete x;
    return x;
})(1);
A. 1
B. null
C. undefined
D. Error

1)delete是用來刪除對象的屬性的福扬,它不能夠刪除函數(shù)中傳遞的參數(shù)

2)所以這里delete x這句其實并沒有什么軟用腕铸,函數(shù)正常執(zhí)行傳參及返回參數(shù)惜犀;因此答案是A

//給個delete使用方法的舉例
var xiaoming = {
    name: '小明'
};
xiaoming.age; // undefined
xiaoming.age = 18; // 新增一個age屬性
xiaoming.age; // 18
delete xiaoming.age; // 刪除age屬性
xiaoming.age; // undefined
delete xiaoming['name']; // 刪除name屬性
xiaoming.name; // undefined
delete xiaoming.school; // 刪除一個不存在的school屬性也不會報錯

//第4題  答案D
var y = 1,
x = y = typeof x;
x;
A. 1
B. "number"
C. undefined
D. "undefined"

1)賦值運算符由右向左運算

2)首先typeof x因為x未聲明,因此結(jié)果是"undifined"(注意:typeof的結(jié)果都是以字符串形式給出的)

3)接著"undifined"被接連賦值給y與x狠裹,所以答案是D


//第5題  答案A
(function f(f) {
    return typeof f();
})(function () {
    return 1;
});
A. "number"
B. "undefined"
C. "function"
D. Error

1)這道題可以拆分一下向拆,首先是函數(shù)本體

//此處是一個函數(shù),傳入了一個叫f的參數(shù)酪耳,這個參數(shù)還是另外一個函數(shù)
//隨后在本體函數(shù)內(nèi)部浓恳,將這個參數(shù)所代表的函數(shù)執(zhí)行了一下,并返回其typeof結(jié)果
(function f(f) {
    return typeof f();  //這里的f是指參數(shù)函數(shù)
})();

2)其次是參數(shù)

function () {
    return 1;
}

3)所以現(xiàn)在就很清晰了碗暗,按照運算符優(yōu)先級颈将,首先參數(shù)函數(shù)執(zhí)行f()結(jié)果為1;typeof 1結(jié)果為"number"言疗;所以結(jié)果是A


//第6題  答案A
var foo = {
    bar: function () {
        return this.baz;
    },
    baz: 1
};
(function () {
    return typeof arguments[0]();
})(foo.bar);
A. "undefined"
B. "object"
C. "number"
D. "function"

1)先說下我的理解晴圾,這題考的是this的指向問題

2)this指向的四種情況,其中只有作為方法調(diào)用或者apply/call強行指向的情況下才可能指向原函數(shù)

3)在作為普通函數(shù)調(diào)用的時候是指向window的噪奄,所以這里的argument[0]()的調(diào)用形式我認(rèn)為是這種調(diào)用

4)也就是說this.baz就是window.baz死姚,當(dāng)然是"undefined",所以答案是A

this對我來說還是比較繞的一個東西勤篮,就再貼上別人的解析看看吧

這個分析總的結(jié)果就是foo.bar中的this指向的是arguments(此處懵逼臉??)

為什么是"undefined"都毒?.
我們必須要知道this運算符是怎么工作的.

JS語言精粹總結(jié)的很精煉:
1 純粹的函數(shù)調(diào)用
2 作為對象方法的調(diào)用
3 作為構(gòu)造函數(shù)調(diào)用
4 apply調(diào)用

我們看看題目是屬于那種環(huán)境?
arguments[0]()中執(zhí)行了一個方法,arguments[0]就是foo.bar方法
注意:這在foo.bar中的this是沒有綁定到foo

雖然 foo.bar 傳遞給了函數(shù)碰缔,但是真正執(zhí)行的時候账劲,函數(shù) bar 的上下文環(huán)境是 arguments ,并不是 foo

arguemnts[0] 可以理解為 arguments.0(不過寫代碼就不要這樣了金抡,語法會錯誤的)瀑焦,所以這樣看來,上下文環(huán)境是 arguemnts 就沒問題了,所以在執(zhí)行baz的時候自然this就是window了,window 上沒有baz屬性,返回的就是undefined, typeof調(diào)用的話就轉(zhuǎn)換成"undefined"了


//第7題  答案A
var foo = {
bar: function () {
    return this.baz;
},
    baz: 1
};
typeof (f = foo.bar)();
A. "undefined"
B. "object"
C. "number"
D. "function"

1)這題還是在考察this的指向問題

2)foo.bar的確是方法的調(diào)用方式梗肝,但是在賦值給f的時候這個this的指向還是被改變了

3)把調(diào)用函數(shù)拆分一下就清楚了

var f = foo.bar
typeof f();

4)這樣在調(diào)用形式上又是普通函數(shù)調(diào)用榛瓮,this指向window;同上題巫击,答案是A


//第8題  答案B
var f = (function f() {
    return "1";
}, function g() {
    return 2;
})();
typeof f;
A. "string"
B. "number"
C. "function"
D. "undefined"

1)此處是一個立即執(zhí)行函數(shù)禀晓,但是在前面的包含函數(shù)的圓括號(命名空間)中出現(xiàn)了2個函數(shù),并用逗號分隔

2)這種形式喘鸟,最終圓括號返回的是最后的一個值

//來看一個例子
var a = (1,2,3,4)
console.log(a) //4

//題目中的情況匆绣,最終將后面的函數(shù)返回
var f = (function f() {return "1";}, function g() {return 2;})
console.log(f) //function g() {return 2;}

3)所以,同樣的此處會返回第二個函數(shù)出來執(zhí)行什黑,得到的最終返回值是2并賦值給f崎淳;所以答案是B


//第9題  答案C
var x = 1;
if (function f() {}) {
    x += typeof f;
}
x;
A. 1
B. "1function"
C. "1undefined"
D. NaN

1)首先在if判定中,函數(shù)f的布爾值是true愕把;所以判定條件成立拣凹,可以執(zhí)行if中的語句

2)函數(shù)f在正常聲明的情況下森爽,typeof f應(yīng)該是"function"

3)但是題目中f函數(shù)只是if的判定條件,沒有經(jīng)過聲明嚣镜;所以typeof f返回"undefined"爬迟,所以答案是C

//單獨聲明的情況下,f是函數(shù)類型
function f(){}
typeof f //"function"

//但題目中f作為一個if中的判定條件存在菊匿,未得到聲明
if(function f(){}){
    
}
typeof f //"undefined"

//第10題  答案B
var x = [typeof x, typeof y][1];
typeof typeof x;
A. "number"
B. "string"
C. "undefined"
D. "object"

1)數(shù)組中獲取坐標(biāo)1的是typeof y付呕,因為y未聲明,所以返回"undefined"并賦值給x

2)所以typeof x就是typeof "undefined"返回"string"跌捆,typeof "string"依然返回"string"徽职;所以答案是B


//第11題  答案A
(function (foo) {
    return typeof foo.bar;
})({
    foo: {
        bar: 1
    }
});
A、"undefined"
B佩厚、"object"
C姆钉、"number"
D、Error

1)又是一個立即執(zhí)行的匿名函數(shù)抄瓦,首先拆分一下

var a = { foo:{ bar:1 } }
(function (foo) { return typeof foo.bar; })(a);

2)再簡化

var a = { foo:{ bar:1 } }
var foo = a;
typeof foo.bar

3)再簡化潮瓶,用a將foo替代掉

var a = { foo:{ bar:1 } }
typeof a.bar

現(xiàn)在就清楚了,無法直接通過a訪問bar屬性钙姊,只有通過a.foo.bar才成立毯辅,所以答案是A

ps:這個思路是看到的別人的解析,但是總覺得簡化函數(shù)的第二步存在問題(var foo = a這步)

//第12題  答案B
(function f() {
    function f() {
        return 1;
    }
    return f();
    function f() {
        return 2;
    }
})();
A摸恍、1 
B悉罕、2 
C赤屋、Error (e.g. “Too much recursion”) 
D立镶、undefined

1)形式類似于第8題,中間多了個return

2)正常來說类早,return會導(dǎo)致跳出函數(shù)媚媒,所以后邊的語句不會執(zhí)行

3)但是,此處因為兩個函數(shù)都是普通聲明的函數(shù)涩僻,會被優(yōu)先解析缭召,所以第二個函數(shù)是在return前執(zhí)行的;所以答案還是B


//第13題  答案B
function f() {
    return f;
}
new f() instanceof f;
A逆日、true 
B嵌巷、false

1)首先,instanceof是用來檢測原型的室抽,如果是原型返回true搪哪,否則返回false

2)此處函數(shù)f中return了一個返回值f,導(dǎo)致new出來的東西與原來期望的實例化對象已經(jīng)不是一個東西了坪圾,所以答案是false

//如果這里返回的是this或者不定義返回值(默認(rèn)返回一個this)
function f() {
    return this;
}
new f() instanceof f; //true

//題目中return了f后的結(jié)果
function f() {
    return f;
}
new f() instanceof f; //false

3)再說的詳細(xì)一些晓折,引用一篇看到的解釋:小小滄海--第六問處對于new的解釋

1惑朦、沒有返回值則按照其他語言一樣返回實例化對象。

2漓概、若有返回值則檢查其返回值是否為引用類型漾月。如果是非引用類型,如基本類型(string,number,boolean,null,undefined)則與無返回值相同胃珍,實際返回其實例化對象梁肿。

3、若返回值是引用類型觅彰,則實際返回值為這個引用類型栈雳。

//對比調(diào)試
//首先沒有返回值,沒有問題
function a(){}
new a() //a {}
new a() instanceof a //true

//這是返回非引用類型缔莲,也是true
function a(){return true}
new a() //a {}
new a() instanceof a //true

//這是返回引用類型哥纫,這個就是false了,因為new出來的東西被返回值覆蓋
function a(){return {a:1}}
new a() //Object {a: 1}
new a() instanceof a //false

//類似的痴奏,題目中應(yīng)該也是引用的類型
function f() {return f;}
new f() //function f(){return f} 
    //關(guān)鍵就是這里了
    //new出來的東西被返回值強行指向原本的函數(shù)本身蛀骇,而不是其實例化對象,當(dāng)然原型也無從談起
new f() instanceof f; //false

也就是說读拆,調(diào)試結(jié)果顯示擅憔;只有new出來的是原函數(shù)的實例化對象,這個原型才會指向原函數(shù)(這是我的理解??)

媽蛋總算寫完檐晕,累死寶寶了??

新手上路暑诸,錯漏之處,請各位大神指導(dǎo)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辟灰,一起剝皮案震驚了整個濱河市个榕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芥喇,老刑警劉巖西采,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異继控,居然都是意外死亡械馆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門武通,熙熙樓的掌柜王于貴愁眉苦臉地迎上來霹崎,“玉大人,你說我怎么就攤上這事冶忱∥补剑” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長错沽。 經(jīng)常有香客問我簿晓,道長,這世上最難降的妖魔是什么千埃? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任憔儿,我火速辦了婚禮,結(jié)果婚禮上放可,老公的妹妹穿的比我還像新娘谒臼。我一直安慰自己,他們只是感情好耀里,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布蜈缤。 她就那樣靜靜地躺著,像睡著了一般冯挎。 火紅的嫁衣襯著肌膚如雪底哥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天房官,我揣著相機(jī)與錄音趾徽,去河邊找鬼。 笑死翰守,一個胖子當(dāng)著我的面吹牛孵奶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蜡峰,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼了袁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了湿颅?” 一聲冷哼從身側(cè)響起载绿,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肖爵,沒想到半個月后卢鹦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡劝堪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了揉稚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秒啦。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖搀玖,靈堂內(nèi)的尸體忽然破棺而出余境,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布芳来,位于F島的核電站含末,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏即舌。R本人自食惡果不足惜佣盒,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望顽聂。 院中可真熱鬧肥惭,春花似錦、人聲如沸紊搪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耀石。三九已至牵囤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滞伟,已是汗流浹背奔浅。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留诗良,地道東北人汹桦。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像鉴裹,于是被迫代替她去往敵國和親舞骆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

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