国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

14 個(gè)折磨人的 JavaScript 面試題

2019-11-20 09:17:12
字體:
供稿:網(wǎng)友

翻到了這篇解釋Javascript quiz的文章quiz-legend,反正沒事兒,就想搬過來供大家學(xué)習(xí)、理解、背誦、批判。

問題一

 (function(){ return typeof arguments;//"object"})(); 

arguments是一個(gè)Array-like對(duì)象,對(duì)應(yīng)的就是傳入函數(shù)的參數(shù)列表。你可以在任何函數(shù)中直接使用該變量。
typeof操作符只會(huì)返回string類型的結(jié)果。參照如下列表可知對(duì)應(yīng)不同數(shù)據(jù),typeof返回的值都是什么:

由此我們推斷出,typeof arguments是object 

問題二

 var f = function g(){ return 23; };typeof g();//報(bào)錯(cuò) 

這是一個(gè)名字是g的function expression,然后又被賦值給了變量f。
 這里的函數(shù)名g和被其賦值的變量f有如下差異:
 函數(shù)名g不能變動(dòng),而變量f可以被重新賦值
 函數(shù)名g只能在函數(shù)體內(nèi)部被使用,試圖在函數(shù)外部使用g會(huì)報(bào)錯(cuò)的 

問題三

 (function(x){ delete x; return x;//1})(1); 

delete操作符可以從對(duì)象中刪除屬性,正確用法如下:
delete object.property
delete object['property']
delete操作符只能作用在對(duì)象的屬性上,對(duì)變量和函數(shù)名無(wú)效。也就是說delete x是沒有意義的。 

你最好也知道,delete是不會(huì)直接釋放內(nèi)存的,她只是間接的中斷對(duì)象引用 

問題四
var y = 1, x = y = typeof x; x;//"undefined"
我們?cè)噲D分解上述代碼成下面兩步:
var y = 1; //step 1
var x = y = typeof x; //step 2
第一步應(yīng)該沒有異議,我們直接看第二步
 1.賦值表達(dá)式從右向左執(zhí)行
 2.y被重新賦值為typeof x的結(jié)果,也就是undefined
 3.x被賦值為右邊表達(dá)式(y = typeof x)的結(jié)果,也就是undefined 

問題五

 (function f(f){ return typeof f();//"number"})(function(){ return 1; }); 

直接上注釋解釋:

 (function f(f){ //這里的f是傳入的參數(shù)function(){ return 1; } //執(zhí)行的結(jié)果自然是1 return typeof f(); //所以根據(jù)問題一的表格我們知道,typeof 1結(jié)果是"number"})(function(){ return 1; }); 

問題六

 var foo = { bar: function() { return this.baz; }, baz: 1};(function(){ return typeof arguments[0]();//"undefined"})(foo.bar); 

這里你可能會(huì)誤以為最終結(jié)果是number。向函數(shù)中傳遞參數(shù)可以看作是一種賦值,所以arguments[0]得到是是真正的bar函數(shù)的值,而不是foo.bar這個(gè)引用,那么自然this也就不會(huì)指向foo,而是window了。 

問題七

 var foo = { bar: function(){ return this.baz; }, baz: 1}typeof (f = foo.bar)();//"undefined" 

這和上一題是一樣的問題,(f = foo.bar)返回的就是bar的值,而不是其引用,那么this也就指的不是foo了。 

問題八 

var f = (function f(){ return '1'; }, function g(){ return 2; })();typeof f;//"number" 

逗號(hào)操作符 對(duì)它的每個(gè)操作對(duì)象求值(從左至右),然后返回最后一個(gè)操作對(duì)象的值 

所以(function f(){ return '1'; }, function g(){ return 2; })的返回值就是函數(shù)g,然后執(zhí)行她,那么結(jié)果是2;最后再typeof 2,根據(jù)問題一的表格,結(jié)果自然是number 

問題九

 var x = 1;if (function f(){}) { x += typeof f;}x;//"1undefined" 

這個(gè)問題的關(guān)鍵點(diǎn),我們?cè)趩栴}二中談到過,function expression中的函數(shù)名f是不能在函數(shù)體外部訪問的

問題十

 var x = [typeof x, typeof y][1];typeof typeof x;//"string" 1.因?yàn)闆]有聲明過變量y,所以typeof y返回"undefined"

 2.將typeof y的結(jié)果賦值給x,也就是說x現(xiàn)在是"undefined"
 3.然后typeof x當(dāng)然是"string"
 4.最后typeof "string"的結(jié)果自然還是"string" 

問題十一 

(function(foo){ return typeof foo.bar;//"undefined"})({ foo: { bar: 1 } }); 

這是個(gè)純粹的視覺詭計(jì),上注釋

 (function(foo){ //這里的foo,是{ foo: { bar: 1 } },并沒有bar屬性哦。 //bar屬性是在foo.foo下面 //所以這里結(jié)果是"undefined" return typeof foo.bar;})({ foo: { bar: 1 } }); 

問題十二

 (function f(){ function f(){ return 1; } return f();//2 function f(){ return 2; }})(); 

通過function declaration聲明的函數(shù)甚至可以在聲明之前使用,這種特性我們稱之為hoisting。于是上述代碼其實(shí)是這樣被運(yùn)行環(huán)境解釋的:

 (function f(){ function f(){ return 1; } function f(){ return 2; } return f();})(); 

問題十三

function f(){ return f; }new f() instanceof f;//false 

當(dāng)代碼new f()執(zhí)行時(shí),下面事情將會(huì)發(fā)生:
 1.一個(gè)新對(duì)象被創(chuàng)建。它繼承自f.prototype
 2.構(gòu)造函數(shù)f被執(zhí)行。執(zhí)行的時(shí)候,相應(yīng)的傳參會(huì)被傳入,同時(shí)上下文(this)會(huì)被指定為這個(gè)新實(shí)例。new f等同于new f(),只能用在不傳遞任何參數(shù)的情況。
 3.如果構(gòu)造函數(shù)返回了一個(gè)“對(duì)象”,那么這個(gè)對(duì)象會(huì)取代整個(gè)new出來的結(jié)果。如果構(gòu)造函數(shù)沒有返回對(duì)象,那么new出來的結(jié)果為步驟1創(chuàng)建的對(duì)象, 

ps:一般情況下構(gòu)造函數(shù)不返回任何值,不過用戶如果想覆蓋這個(gè)返回值,可以自己選擇返回一個(gè)普通對(duì)象來覆蓋。當(dāng)然,返回?cái)?shù)組也會(huì)覆蓋,因?yàn)閿?shù)組也是對(duì)象。 

于是,我們這里的new f()返回的仍然是函數(shù)f本身,而并非他的實(shí)例 

問題十四
 with (function(x, undefined){}) length;//2
with語(yǔ)句將某個(gè)對(duì)象添加的作用域鏈的頂部,如果在statement中有某

主站蜘蛛池模板: 漯河市| 土默特右旗| 淮北市| 自治县| 交口县| 麟游县| 香格里拉县| 岳池县| 敦化市| 富锦市| 淳安县| 宝兴县| 高青县| 永新县| 玉环县| 清苑县| 焉耆| 吴江市| 平阳县| 临泽县| 佛山市| 丰镇市| 清新县| 武胜县| 玉屏| 邵东县| 噶尔县| 澎湖县| 玉环县| 英吉沙县| 滦南县| 基隆市| 原平市| 保靖县| 桦川县| 中牟县| 余庆县| 林州市| 浦江县| 太原市| 杨浦区|