前端程序員經(jīng)常忽視的一個JavaScript面試題

Github原文

題目

function Foo() {
    getName = function () { alert (1); };
    return this;
}
Foo.getName = function () { alert (2);};
Foo.prototype.getName = function () { alert (3);};
var getName = function () { alert (4);};
function getName() { alert (5);}
 
//請寫出以下輸出結(jié)果:
Foo.getName();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();

這幾天面試上幾次碰上這道經(jīng)典的題目滨彻,特地從頭到尾來分析一次答案典格,這道題的經(jīng)典之處在于它綜合考察了面試者的JavaScript的綜合能力,包含了變量定義提升套耕、this指針指向构灸、運(yùn)算符優(yōu)先級、原型笋额、繼承元暴、全局變量污染、對象屬性及原型屬性優(yōu)先級等知識兄猩,此題在網(wǎng)上也有部分相關(guān)的解釋茉盏,當(dāng)然我覺得有部分解釋還欠妥,不夠清晰枢冤,特地重頭到尾來分析一次鸠姨,當(dāng)然我們會把最終答案放在后面,并把此題再改高一點(diǎn)點(diǎn)難度淹真,改進(jìn)版也放在最后讶迁,方便面試官在出題的時候有個參考


image
image

第一問

先看此題的上半部分做了什么,首先定義了一個叫Foo的函數(shù)核蘸,之后為Foo創(chuàng)建了一個叫g(shù)etName的靜態(tài)屬性存儲了一個匿名函數(shù)巍糯,之后為Foo的原型對象新創(chuàng)建了一個叫g(shù)etName的匿名函數(shù)。之后又通過函數(shù)變量表達(dá)式創(chuàng)建了一個getName的函數(shù)客扎,最后再聲明一個叫g(shù)etName函數(shù)祟峦。

第一問的Foo.getName自然是訪問Foo函數(shù)上存儲的靜態(tài)屬性,答案自然是2徙鱼,這里就不需要解釋太多的宅楞,一般來說第一問對于稍微懂JS基礎(chǔ)的同學(xué)來說應(yīng)該是沒問題的,當(dāng)然我們可以用下面的代碼來回顧一下基礎(chǔ),先加深一下了解

        function User(name) {
            var name = name; //私有屬性
            this.name = name; //公有屬性
            function getName() { //私有方法
                return name;
            }
        }
        User.prototype.getName = function() { //公有方法
            return this.name;
        }
        User.name = 'Wscats'; //靜態(tài)屬性
        User.getName = function() { //靜態(tài)方法
            return this.name;
        }
        var Wscat = new User('Wscats'); //實(shí)例化

注意下面這幾點(diǎn):

  • 調(diào)用公有方法袱吆,公有屬性厌衙,我們必需先實(shí)例化對象,也就是用new操作符實(shí)化對象杆故,就可構(gòu)造函數(shù)實(shí)例化對象的方法和屬性迅箩,并且公有方法是不能調(diào)用私有方法和靜態(tài)方法的
  • 靜態(tài)方法和靜態(tài)屬性就是我們無需實(shí)例化就可以調(diào)用
  • 而對象的私有方法和屬性,外部是不可以訪問的

第二問

第二問,直接調(diào)用getName函數(shù)处铛。既然是直接調(diào)用那么就是訪問當(dāng)前上文作用域內(nèi)的叫g(shù)etName的函數(shù)饲趋,所以這里應(yīng)該直接把關(guān)注點(diǎn)放在4和5上,跟1 2 3都沒什么關(guān)系撤蟆。當(dāng)然后來我問了我的幾個同事他們大多數(shù)回答了5奕塑。此處其實(shí)有兩個坑,一是變量聲明提升家肯,二是函數(shù)表達(dá)式和函數(shù)聲明的區(qū)別龄砰。
我們來看看為什么,可參考(1)關(guān)于Javascript的函數(shù)聲明和函數(shù)表達(dá)式 (2)關(guān)于JavaScript的變量提升
在Javascript中,定義函數(shù)有兩種類型

函數(shù)聲明

    // 函數(shù)聲明
    function wscat(type){
        return type==="wscat";
    }

函數(shù)表達(dá)式

    // 函數(shù)表達(dá)式
    var oaoafly = function(type){
        return type==="oaoafly";
    }

先看下面這個經(jīng)典問題换棚,在一個程序里面同時用函數(shù)聲明和函數(shù)表達(dá)式定義一個名為getName的函數(shù)

        getName()//oaoafly
        var getName = function() {
            console.log('wscat')
        }
        getName()//wscat
        function getName() {
            console.log('oaoafly')
        }
        getName()//wscat

上面的代碼看起來很類似徐钠,感覺也沒什么太大差別。但實(shí)際上势腮,Javascript函數(shù)上的一個“陷阱”就體現(xiàn)在Javascript兩種類型的函數(shù)定義上拳话。

  • JavaScript 解釋器中存在一種變量聲明被提升的機(jī)制,也就是說函數(shù)聲明會被提升到作用域的最前面夕玩,即使寫代碼的時候是寫在最后面你弦,也還是會被提升至最前面。
  • 而用函數(shù)表達(dá)式創(chuàng)建的函數(shù)是在運(yùn)行時進(jìn)行賦值燎孟,且要等到表達(dá)式賦值完成后才能調(diào)用
                var getName//變量被提升禽作,此時為undefined
                
                getName()//oaoafly 函數(shù)被提升 這里受函數(shù)聲明的影響,雖然函數(shù)聲明在最后可以被提升到最前面了
        var getName = function() {
            console.log('wscat')
        }//函數(shù)表達(dá)式此時才開始覆蓋函數(shù)聲明的定義
        getName()//wscat
        function getName() {
            console.log('oaoafly')
        }
        getName()//wscat 這里就執(zhí)行了函數(shù)表達(dá)式的值

所以可以分解為這兩個簡單的問題來看清楚區(qū)別的本質(zhì)

                var getName;
        console.log(getName)//undefined
        getName()//Uncaught TypeError: getName is not a function
        var getName = function() {
            console.log('wscat')
        }
                var getName;
        console.log(getName)//function getName() {console.log('oaoafly')}
        getName()//oaoafly
        function getName() {
            console.log('oaoafly')
        }

這個區(qū)別看似微不足道揩页,但在某些情況下確實(shí)是一個難以察覺并且“致命“的陷阱旷偿。出現(xiàn)這個陷阱的本質(zhì)原因體現(xiàn)在這兩種類型在函數(shù)提升和運(yùn)行時機(jī)(解析時/運(yùn)行時)上的差異。
當(dāng)然我們給一個總結(jié):Javascript中函數(shù)聲明函數(shù)表達(dá)式是存在區(qū)別的碍沐,函數(shù)聲明在JS解析時進(jìn)行函數(shù)提升狸捅,因此在同一個作用域內(nèi),不管函數(shù)聲明在哪里定義累提,該函數(shù)都可以進(jìn)行調(diào)用尘喝。而函數(shù)表達(dá)式的值是在JS運(yùn)行時確定,并且在表達(dá)式賦值完成后斋陪,該函數(shù)才能調(diào)用朽褪。
所以第二問的答案就是4,5的函數(shù)聲明被4的函數(shù)表達(dá)式覆蓋了

第三問

Foo().getName();先執(zhí)行了Foo函數(shù)无虚,然后調(diào)用Foo函數(shù)的返回值對象的getName屬性函數(shù)缔赠。
Foo函數(shù)的第一句getName = function () { alert (1); };是一句函數(shù)賦值語句,注意它沒有var聲明友题,所以先向當(dāng)前Foo函數(shù)作用域內(nèi)尋找getName變量嗤堰,沒有。再向當(dāng)前函數(shù)作用域上層度宦,即外層作用域內(nèi)尋找是否含有g(shù)etName變量踢匣,找到了,也就是第二問中的alert(4)函數(shù)戈抄,將此變量的值賦值為function(){alert(1)}离唬。
此處實(shí)際上是將外層作用域內(nèi)的getName函數(shù)修改了。

注意:此處若依然沒有找到會一直向上查找到window對象划鸽,若window對象中也沒有g(shù)etName屬性输莺,就在window對象中創(chuàng)建一個getName變量戚哎。

之后Foo函數(shù)的返回值是this,而JS的this問題已經(jīng)有非常多的文章介紹嫂用,這里不再多說型凳。
簡單的講,this的指向是由所在函數(shù)的調(diào)用方式?jīng)Q定的尸折。而此處的直接調(diào)用方式啰脚,this指向window對象。
遂Foo函數(shù)返回的是window對象实夹,相當(dāng)于執(zhí)行window.getName(),而window中的getName已經(jīng)被修改為alert(1)粒梦,所以最終會輸出1
此處考察了兩個知識點(diǎn)亮航,一個是變量作用域問題,一個是this指向問題
我們可以利用下面代碼來回顧下這兩個知識點(diǎn)

                var name = "Wscats";//全局變量
        window.name = "Wscats";//全局變量
        function getName() {
            name = "Oaoafly"; //去掉var變成了全局變量
            var privateName = "Stacsw";
            return function() {
                console.log(this);//window
                return privateName
            }
        }
        var getPrivate = getName("Hello"); //當(dāng)然傳參是局部變量匀们,但函數(shù)里面我沒有接受這個參數(shù)
        console.log(name) //Oaoafly
        console.log(getPrivate()) //Stacsw

因?yàn)镴S沒有塊級作用域缴淋,但是函數(shù)是能產(chǎn)生一個作用域的,函數(shù)內(nèi)部不同定義值的方法會直接或者間接影響到全局或者局部變量泄朴,函數(shù)內(nèi)部的私有變量可以用閉包獲取重抖,函數(shù)還真的是第一公民呀~
而關(guān)于this,this的指向在函數(shù)定義的時候是確定不了的祖灰,只有函數(shù)執(zhí)行的時候才能確定this到底指向誰钟沛,實(shí)際上this的最終指向的是那個調(diào)用它的對象
所以第三問中實(shí)際上就是window在調(diào)用Foo()函數(shù),所以this的指向是window

window.Foo().getName();
//->window.getName();

第四問

直接調(diào)用getName函數(shù)局扶,相當(dāng)于window.getName()恨统,因?yàn)檫@個變量已經(jīng)被Foo函數(shù)執(zhí)行時修改了,遂結(jié)果與第三問相同三妈,為1畜埋,也就是說Foo執(zhí)行后把全局的getName函數(shù)給重寫了一次,所以結(jié)果就是Foo()執(zhí)行重寫的那個getName函數(shù)

第五問

第五問new Foo.getName();此處考察的是JS的運(yùn)算符優(yōu)先級問題畴蒲,我覺得這是這題靈魂的所在悠鞍,也是難度比較大的一題
下面是JS運(yùn)算符的優(yōu)先級表格,從高到低排列模燥】Ъ溃可參考MDN運(yùn)算符優(yōu)先級

優(yōu)先級 運(yùn)算類型 關(guān)聯(lián)性 運(yùn)算符
19 圓括號 n/a ( … )
18 成員訪問 從左到右 … . …
需計(jì)算的成員訪問 從左到右 … [ … ]
new (帶參數(shù)列表) n/a new … ( … )
17 函數(shù)調(diào)用 從左到右 … ( … )
new (無參數(shù)列表) 從右到左 new …
16 后置遞增(運(yùn)算符在后) n/a … ++
后置遞減(運(yùn)算符在后) n/a … --
15 邏輯非 從右到左 ! …
按位非 從右到左 ~ …
一元加法 從右到左 + …
一元減法 從右到左 - …
前置遞增 從右到左 ++ …
前置遞減 從右到左 -- …
typeof 從右到左 typeof …
void 從右到左 void …
delete 從右到左 delete …
14 乘法 從左到右 … * …
除法 從左到右 … / …
取模 從左到右 … % …
13 加法 從左到右 … + …
減法 從左到右 … - …
12 按位左移 從左到右 … << …
按位右移 從左到右 … >> …
無符號右移 從左到右 … >>> …
11 小于 從左到右 … < …
小于等于 從左到右 … <= …
大于 從左到右 … > …
大于等于 從左到右 … >= …
in 從左到右 … in …
instanceof 從左到右 … instanceof …
10 等號 從左到右 … == …
非等號 從左到右 … != …
全等號 從左到右 … === …
非全等號 從左到右 … !== …
9 按位與 從左到右 … & …
8 按位異或 從左到右 … ^ …
7 按位或 從左到右 … 按位或 …
6 邏輯與 從左到右 … && …
5 邏輯或 從左到右 … 邏輯或 …
4 條件運(yùn)算符 從右到左 … ? … : …
3 賦值 從右到左 … = …
… += …
… -= …
… *= …
… /= …
… %= …
… <<= …
… >>= …
… >>>= …
… &= …
… ^= …
… 或= …
2 yield 從右到左 yield …
yield* 從右到左 yield* …
1 展開運(yùn)算符 n/a ... …
0 逗號 從左到右 … , …

這題首先看優(yōu)先級的第18和第17都出現(xiàn)關(guān)于new的優(yōu)先級,new (帶參數(shù)列表)比new (無參數(shù)列表)高比函數(shù)調(diào)用高涧窒,跟成員訪問同級

new Foo.getName();的優(yōu)先級是這樣的

相當(dāng)于是:

new (Foo.getName)();
  • 點(diǎn)的優(yōu)先級(18)比new無參數(shù)列表(17)優(yōu)先級高
  • 當(dāng)點(diǎn)運(yùn)算完后又因?yàn)橛袀€括號()心肪,此時就是變成new有參數(shù)列表(18),所以直接執(zhí)行new纠吴,當(dāng)然也可能有朋友會有疑問為什么遇到()不函數(shù)調(diào)用再new呢硬鞍,那是因?yàn)楹瘮?shù)調(diào)用(17)比new有參數(shù)列表(18)優(yōu)先級低

.成員訪問(18)->new有參數(shù)列表(18)

所以這里實(shí)際上將getName函數(shù)作為了構(gòu)造函數(shù)來執(zhí)行,遂彈出2。

第六問

這一題比上一題的唯一區(qū)別就是在Foo那里多出了一個括號固该,這個有括號跟沒括號我們在第五問的時候也看出來優(yōu)先級是有區(qū)別的

(new Foo()).getName()

那這里又是怎么判斷的呢锅减?首先new有參數(shù)列表(18)跟點(diǎn)的優(yōu)先級(18)是同級,同級的話按照從左向右的執(zhí)行順序伐坏,所以先執(zhí)行new有參數(shù)列表(18)再執(zhí)行點(diǎn)的優(yōu)先級(18)怔匣,最后再函數(shù)調(diào)用(17)

new有參數(shù)列表(18)->.成員訪問(18)->()函數(shù)調(diào)用(17)

這里還有一個小知識點(diǎn),F(xiàn)oo作為構(gòu)造函數(shù)有返回值桦沉,所以這里需要說明下JS中的構(gòu)造函數(shù)返回值問題每瞒。

構(gòu)造函數(shù)的返回值

在傳統(tǒng)語言中,構(gòu)造函數(shù)不應(yīng)該有返回值纯露,實(shí)際執(zhí)行的返回值就是此構(gòu)造函數(shù)的實(shí)例化對象剿骨。
而在JS中構(gòu)造函數(shù)可以有返回值也可以沒有。

  1. 沒有返回值則按照其他語言一樣返回實(shí)例化對象埠褪。
                function Foo(name){
            this.name = name
        }
        console.log(new Foo('wscats'))
image
image
  1. 若有返回值則檢查其返回值是否為引用類型浓利。如果是非引用類型,如基本類型(String,Number,Boolean,Null,Undefined)則與無返回值相同钞速,實(shí)際返回其實(shí)例化對象贷掖。
                function Foo(name){
            this.name = name
            return 520
        }
        console.log(new Foo('wscats'))
image
image
  1. 若返回值是引用類型,則實(shí)際返回值為這個引用類型渴语。
                function Foo(name){
            this.name = name
            return {
                age:16
            }
        }
        console.log(new Foo('wscats'))
image
image

原題中苹威,由于返回的是this,而this在構(gòu)造函數(shù)中本來就代表當(dāng)前實(shí)例化對象遵班,最終Foo函數(shù)返回實(shí)例化對象屠升。
之后調(diào)用實(shí)例化對象的getName函數(shù),因?yàn)樵贔oo構(gòu)造函數(shù)中沒有為實(shí)例化對象添加任何屬性狭郑,當(dāng)前對象的原型對象(prototype)中尋找getName函數(shù)腹暖。
當(dāng)然這里再拓展個題外話,如果構(gòu)造函數(shù)和原型鏈都有相同的方法翰萨,如下面的代碼脏答,那么默認(rèn)會拿構(gòu)造函數(shù)的公有方法而不是原型鏈,這個知識點(diǎn)在原題中沒有表現(xiàn)出來亩鬼,后面改進(jìn)版我已經(jīng)加上殖告。

               function Foo(name) {
            this.name = name
            this.getName = function() {
                return this.name
            }
        }
        Foo.prototype.name = 'Oaoafly';
        Foo.prototype.getName = function() {
            return 'Oaoafly'
        }
        console.log((new Foo('Wscats')).name)//Wscats
        console.log((new Foo('Wscats')).getName())//Wscats

第七問

new new Foo().getName();同樣是運(yùn)算符優(yōu)先級問題。做到這一題其實(shí)我已經(jīng)覺得答案沒那么重要了雳锋,關(guān)鍵只是考察面試者是否真的知道面試官在考察我們什么黄绩。
最終實(shí)際執(zhí)行為:

new ((new Foo()).getName)();

new有參數(shù)列表(18)->new有參數(shù)列表(18)

先初始化Foo的實(shí)例化對象,然后將其原型上的getName函數(shù)作為構(gòu)造函數(shù)再次new玷过,所以最終結(jié)果為3

答案

function Foo() {
    getName = function () { alert (1); };
    return this;
}
Foo.getName = function () { alert (2);};
Foo.prototype.getName = function () { alert (3);};
var getName = function () { alert (4);};
function getName() { alert (5);}

//答案:
Foo.getName();//2
getName();//4
Foo().getName();//1
getName();//1
new Foo.getName();//2
new Foo().getName();//3
new new Foo().getName();//3

后續(xù)

后續(xù)我把這題的難度再稍微加大一點(diǎn)點(diǎn)(附上答案)爽丹,在Foo函數(shù)里面加多一個公有方法getName筑煮,對于下面這題如果用在面試題上那通過率可能就更低了,因?yàn)殡y度又大了一點(diǎn)粤蝎,又多了兩個坑真仲,但是明白了這題的原理就等同于明白了上面所有的知識點(diǎn)了

                function Foo() {
            this.getName = function() {
                console.log(3);
                return {
                    getName: getName//這個就是第六問中涉及的構(gòu)造函數(shù)的返回值問題
                }
            };//這個就是第六問中涉及到的,JS構(gòu)造函數(shù)公有方法和原型鏈方法的優(yōu)先級
            getName = function() {
                console.log(1);
            };
            return this
        }
        Foo.getName = function() {
            console.log(2);
        };
        Foo.prototype.getName = function() {
            console.log(6);
        };
        var getName = function() {
            console.log(4);
        };

        function getName() {
            console.log(5);
        } //答案:
        Foo.getName(); //2
        getName(); //4
        console.log(Foo())
        Foo().getName(); //1
        getName(); //1
        new Foo.getName(); //2
        new Foo().getName(); //3
                //多了一問
        new Foo().getName().getName(); //3 1
        new new Foo().getName(); //3

最后初澎,其實(shí)我是不建議把這些題作為考察面試者的唯一評判秸应,但是作為一名合格的前端工程師我們不應(yīng)該因?yàn)楦≡旰雎粤宋覀兊囊恍┳罨镜幕A(chǔ)知識,當(dāng)然我也祝愿所有面試者找到一份理想的工作碑宴,祝愿所有面試官找到心中那匹千里馬~
@Wscats 原題最初版來源:
碼農(nóng)網(wǎng)
cnblogs
Github

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末软啼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子延柠,更是在濱河造成了極大的恐慌焰宣,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捕仔,死亡現(xiàn)場離奇詭異,居然都是意外死亡盈罐,警方通過查閱死者的電腦和手機(jī)榜跌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盅粪,“玉大人钓葫,你說我怎么就攤上這事∑惫耍” “怎么了础浮?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長奠骄。 經(jīng)常有香客問我豆同,道長,這世上最難降的妖魔是什么含鳞? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任影锈,我火速辦了婚禮,結(jié)果婚禮上蝉绷,老公的妹妹穿的比我還像新娘鸭廷。我一直安慰自己,他們只是感情好熔吗,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布辆床。 她就那樣靜靜地躺著,像睡著了一般桅狠。 火紅的嫁衣襯著肌膚如雪讼载。 梳的紋絲不亂的頭發(fā)上轿秧,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音维雇,去河邊找鬼淤刃。 笑死,一個胖子當(dāng)著我的面吹牛吱型,可吹牛的內(nèi)容都是我干的逸贾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼津滞,長吁一口氣:“原來是場噩夢啊……” “哼铝侵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起触徐,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤咪鲜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后撞鹉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疟丙,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年鸟雏,在試婚紗的時候發(fā)現(xiàn)自己被綠了享郊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡孝鹊,死狀恐怖炊琉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情又活,我是刑警寧澤苔咪,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站柳骄,受9級特大地震影響团赏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜夹界,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一馆里、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧可柿,春花似錦鸠踪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至目锭,卻和暖如春评汰,著一層夾襖步出監(jiān)牢的瞬間纷捞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工被去, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留主儡,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓惨缆,卻偏偏與公主長得像糜值,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子坯墨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法寂汇,類相關(guān)的語法,內(nèi)部類的語法捣染,繼承相關(guān)的語法骄瓣,異常的語法,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理耍攘,服務(wù)發(fā)現(xiàn)榕栏,斷路器,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 最近在網(wǎng)上看了一道有關(guān)前端的面試題感覺很不錯蕾各,就在這里分享給大家臼膏。 題目: function Foo() { g...
    穿越人海遇見你閱讀 991評論 0 12
  • 題目 題目如上,這道題的經(jīng)典之處在于它綜合考察了面試者的JavaScript的綜合能力示损,包含了變量定義提升、thi...
    庸者的救贖閱讀 2,224評論 12 27
  • 你還記得上次哭脆贵,是什么時候? 要我回答這個問題起暮,大概就是因?yàn)樯洗慰匆徊侩娪暗臅r候被感動哭卖氨,而不是因?yàn)殡y過「号常可是明明...
    我是棒東東閱讀 800評論 0 0