国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

javascript中那些折磨人的面試題

endiat / 682人閱讀

摘要:如果構(gòu)造函數(shù)返回了一個(gè)對(duì)象,那么這個(gè)對(duì)象會(huì)取代整個(gè)出來(lái)的結(jié)果。如果構(gòu)造函數(shù)沒(méi)有返回對(duì)象,那么出來(lái)的結(jié)果為步驟創(chuàng)建的對(duì)象,一般情況下構(gòu)造函數(shù)不返回任何值,不過(guò)用戶(hù)如果想覆蓋這個(gè)返回值,可以自己選擇返回一個(gè)普通對(duì)象來(lái)覆蓋。

前端工程師有時(shí)候面試時(shí)會(huì)遇到一類(lèi)面試官,他們問(wèn)的問(wèn)題對(duì)于語(yǔ)言本身非常較真兒,往往不是候選人可能期待的面向?qū)嶋H的問(wèn)題(有些候選人強(qiáng)調(diào)能干活就行,至于知不知道其中緣由是無(wú)關(guān)痛癢的)。這類(lèi)題目,雖然沒(méi)有邏輯,但某種程度說(shuō),確實(shí)考察了候選人對(duì)于javascript這門(mén)語(yǔ)言的理解。

突然想到這個(gè)話(huà)題是無(wú)聊在翻自己的Github,看看以前都寫(xiě)過(guò)什么丑貨。然后翻到了這篇解釋Javascript quiz的文章quiz-legend,反正沒(méi)事兒,就想搬過(guò)來(lái)供大家學(xué)習(xí)、理解、背誦、批判。

問(wèn)題一
(function(){
    return typeof arguments;//"object"
})();

arguments是一個(gè)Array-like對(duì)象,對(duì)應(yīng)的就是傳入函數(shù)的參數(shù)列表。你可以在任何函數(shù)中直接使用該變量。

typeof操作符只會(huì)返回string類(lèi)型的結(jié)果。參照如下列表可知對(duì)應(yīng)不同數(shù)據(jù),typeof返回的值都是什么:

類(lèi)型 結(jié)果
undefined "undefined"
null "object"
Boolean "boolean"
Number "number"
String "string"
Symbol (new in ECMAScript 2015) "symbol"
Host object (provided by the JS environment) Implementation-dependent
Function object (implements [[Call]] in ECMA-262 terms) "function"
Any other object "object"

由此我們推斷出,typeof argumentsobject

問(wèn)題二
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ò)的

問(wèn)題三
(function(x){
    delete x;
    return x;//1
})(1);

delete操作符可以從對(duì)象中刪除屬性,正確用法如下:

delete object.property
delete object["property"]

delete操作符只能作用在對(duì)象的屬性上,對(duì)變量和函數(shù)名無(wú)效。也就是說(shuō)delete x是沒(méi)有意義的。

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

問(wèn)題四
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)該沒(méi)有異議,我們直接看第二步

賦值表達(dá)式從右向左執(zhí)行

y被重新賦值為typeof x的結(jié)果,也就是undefined

x被賦值為右邊表達(dá)式(y = typeof x)的結(jié)果,也就是undefined

問(wèn)題五
(function f(f){
    return typeof f();//"number"
})(function(){ return 1; });

直接上注釋解釋?zhuān)?/p>

(function f(f){
    //這里的f是傳入的參數(shù)function(){ return 1; }
    //執(zhí)行的結(jié)果自然是1
    return typeof f(); //所以根據(jù)問(wèn)題一的表格我們知道,typeof 1結(jié)果是"number"
})(function(){ return 1; });
問(wèn)題六
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了。

問(wèn)題七
var foo = {
    bar: function(){ return this.baz; },
    baz: 1
}
typeof (f = foo.bar)();//"undefined"

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

問(wèn)題八
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ù)問(wèn)題一的表格,結(jié)果自然是number

問(wèn)題九
var x = 1;
if (function f(){}) {
    x += typeof f;
}
x;//"1undefined"

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

問(wèn)題十
var x = [typeof x, typeof y][1];
typeof typeof x;//"string"

因?yàn)闆](méi)有聲明過(guò)變量y,所以typeof y返回"undefined"

typeof y的結(jié)果賦值給x,也就是說(shuō)x現(xiàn)在是"undefined"

然后typeof x當(dāng)然是"string"

最后typeof "string"的結(jié)果自然還是"string"

問(wèn)題十一
(function(foo){
    return typeof foo.bar;//"undefined"
})({ foo: { bar: 1 } });

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

(function(foo){
    
    //這里的foo,是{ foo: { bar: 1 } },并沒(méi)有bar屬性哦。
    //bar屬性是在foo.foo下面
    //所以這里結(jié)果是"undefined"
    return typeof foo.bar;
})({ foo: { bar: 1 } });
問(wèn)題十二
(function f(){
    function f(){ return 1; }
    return f();//2
    function f(){ return 2; }
})();

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

(function f(){
    function f(){ return 1; }
    function f(){ return 2; }
    return f();
})();
問(wèn)題十三
function f(){ return f; }
new f() instanceof f;//false

當(dāng)代碼new f()執(zhí)行時(shí),下面事情將會(huì)發(fā)生:

一個(gè)新對(duì)象被創(chuàng)建。它繼承自f.prototype

構(gòu)造函數(shù)f被執(zhí)行。執(zhí)行的時(shí)候,相應(yīng)的傳參會(huì)被傳入,同時(shí)上下文(this)會(huì)被指定為這個(gè)新實(shí)例。new f等同于new f(),只能用在不傳遞任何參數(shù)的情況。

如果構(gòu)造函數(shù)返回了一個(gè)“對(duì)象”,那么這個(gè)對(duì)象會(huì)取代整個(gè)new出來(lái)的結(jié)果。如果構(gòu)造函數(shù)沒(méi)有返回對(duì)象,那么new出來(lái)的結(jié)果為步驟1創(chuàng)建的對(duì)象,

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

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

問(wèn)題十四
with (function(x, undefined){}) length;//2

with語(yǔ)句將某個(gè)對(duì)象添加的作用域鏈的頂部,如果在statement中有某個(gè)未使用命名空間的變量,跟作用域鏈中的某個(gè)屬性同名,則這個(gè)變量將指向這個(gè)屬性值。如果沒(méi)有同名的屬性,則將拋出ReferenceError異常。

OK,現(xiàn)在我們來(lái)看,由于function(x, undefined){}是一個(gè)匿名函數(shù)表達(dá)式,是函數(shù),就會(huì)有length屬性,指的就是函數(shù)的參數(shù)個(gè)數(shù)。所以最終結(jié)果就是2

寫(xiě)在最后

有人覺(jué)得這些題坑爹,也有人覺(jué)得開(kāi)闊了眼界,見(jiàn)仁見(jiàn)智吧。但有一件事是真的,無(wú)論你是否堅(jiān)定的實(shí)踐派,缺了理論基礎(chǔ),也鐵定走不遠(yuǎn) - 你永遠(yuǎn)不會(huì)見(jiàn)到哪個(gè)熟練的技術(shù)工人突然成了火箭專(zhuān)家。

看文檔、讀標(biāo)準(zhǔn)、結(jié)合實(shí)踐,才是同志們的決勝之道

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/90846.html

相關(guān)文章

  • 自己寫(xiě)的面試,自己想的答案

    摘要:因?yàn)轭}目是我自己寫(xiě)的,并不是網(wǎng)上摘的,所以知識(shí)點(diǎn)比較基礎(chǔ),也不全面。即使是面試題,也有人掉坑。小結(jié)面試題就是這道,我自己的解決方案也說(shuō)完了。 大家都知道‘不忘初心,方得始終’,但多少人知道‘初心易得,始終難守’。時(shí)代在變化,技術(shù)在發(fā)展,基礎(chǔ)沒(méi)變。學(xué)習(xí)新技術(shù)的時(shí)候,不應(yīng)把基礎(chǔ)落下。 1.前言 因?yàn)闄C(jī)緣巧合,讓當(dāng)了無(wú)數(shù)次面試者的我,當(dāng)上了面試官,也和幾個(gè)面試者交流過(guò)。既然要應(yīng)對(duì)面試者,我就...

    CatalpaFlat 評(píng)論0 收藏0
  • 自己寫(xiě)的面試,自己想的答案

    摘要:因?yàn)轭}目是我自己寫(xiě)的,并不是網(wǎng)上摘的,所以知識(shí)點(diǎn)比較基礎(chǔ),也不全面。即使是面試題,也有人掉坑。小結(jié)面試題就是這道,我自己的解決方案也說(shuō)完了。 大家都知道‘不忘初心,方得始終’,但多少人知道‘初心易得,始終難守’。時(shí)代在變化,技術(shù)在發(fā)展,基礎(chǔ)沒(méi)變。學(xué)習(xí)新技術(shù)的時(shí)候,不應(yīng)把基礎(chǔ)落下。 1.前言 因?yàn)闄C(jī)緣巧合,讓當(dāng)了無(wú)數(shù)次面試者的我,當(dāng)上了面試官,也和幾個(gè)面試者交流過(guò)。既然要應(yīng)對(duì)面試者,我就...

    sherlock221 評(píng)論0 收藏0
  • 自己寫(xiě)的面試,自己想的答案

    摘要:因?yàn)轭}目是我自己寫(xiě)的,并不是網(wǎng)上摘的,所以知識(shí)點(diǎn)比較基礎(chǔ),也不全面。即使是面試題,也有人掉坑。小結(jié)面試題就是這道,我自己的解決方案也說(shuō)完了。 大家都知道‘不忘初心,方得始終’,但多少人知道‘初心易得,始終難守’。時(shí)代在變化,技術(shù)在發(fā)展,基礎(chǔ)沒(méi)變。學(xué)習(xí)新技術(shù)的時(shí)候,不應(yīng)把基礎(chǔ)落下。 1.前言 因?yàn)闄C(jī)緣巧合,讓當(dāng)了無(wú)數(shù)次面試者的我,當(dāng)上了面試官,也和幾個(gè)面試者交流過(guò)。既然要應(yīng)對(duì)面試者,我就...

    SimpleTriangle 評(píng)論0 收藏0
  • 面試小結(jié)--前端面試的幾個(gè)雷點(diǎn)

    摘要:前言得益于金三銀四,在最近一段時(shí)間,面試了一些人,但是符合的寥寥無(wú)幾。看到我的面試題自己寫(xiě)的面試題,自己想的答案。聽(tīng)人說(shuō)過(guò)一個(gè)面試套路面試官問(wèn)的問(wèn)題,可能面試官自己都不懂,目的只是為了壓工資,挫士氣。不過(guò)我是為了測(cè)試面試者是不是真的精通。 技術(shù)在不斷的創(chuàng)新,隨著框架,庫(kù),構(gòu)建工具,打包工具,版本控制工具等操作越來(lái)越方便,使用越來(lái)越簡(jiǎn)單。面對(duì)這樣的情況,除了興奮,也要警惕。這些工具使得開(kāi)...

    idealcn 評(píng)論0 收藏0
  • 20道HTML基礎(chǔ)面試(附答案)

    摘要:但有時(shí)候我們希望關(guān)閉輸入框的自動(dòng)完成功能,例如當(dāng)用戶(hù)輸入內(nèi)容的時(shí)候,我們希望使用技術(shù)從數(shù)據(jù)庫(kù)搜索并列舉而不是在用戶(hù)的歷史記錄中搜索。 以下是我整理的一些HTML的基礎(chǔ)面試體,并自己整理了答案。 1 DOCTYPE有什么作用?標(biāo)準(zhǔn)模式與混雜模式如何區(qū)分?它們有何意義? 告訴瀏覽器使用哪個(gè)版本的HTML規(guī)范來(lái)渲染文檔。DOCTYPE不存在或形式不正確會(huì)導(dǎo)致HTML文檔以混雜模式呈現(xiàn)。標(biāo)準(zhǔn)模...

    firim 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<