成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【轉(zhuǎn)載】十三道JavaScript基礎(chǔ)題,你是否都做對了?

raoyi / 3240人閱讀

摘要:題目二答案會報(bào)錯未定義這段代碼中混合了函數(shù)聲明和函數(shù)表達(dá)式的形式,而函數(shù)實(shí)際上是綁定到了上而不是。除此之外函數(shù)聲明與函數(shù)表達(dá)式的語法其實(shí)是等價(jià)的。因此,在外層函數(shù)函數(shù)體內(nèi)的兩個函數(shù)聲明,都會提升到之前執(zhí)行。

這是我在Javascript微信公眾號上看到的一篇文章,覺得挺有意思的,所以轉(zhuǎn)載過來跟大家分享一下,同時(shí),對這些題目也加上了一些我個人的理解,如果有不對的地方,請大家指正。

題目一

(function(){
   return typeof arguments;
})();

答案:Object

typeof所返回的可能值為:numberstring、boolean、undefinedobjectfunction。而我們知道arguments是一個偽數(shù)組,而偽數(shù)組也是一個對象,所以答案應(yīng)該是Object。那么,如果把typeof arguments改成arguments instanceof Array呢?

可以看到,返回的是false。因此,偽數(shù)組不是一個數(shù)組,只有在使用了Array.prototype.slice.call()進(jìn)行了轉(zhuǎn)換后,才能轉(zhuǎn)化成一個真數(shù)組。

題目二

var f = function g(){ return 23; };
typeof g();

答案:會報(bào)錯(g()未定義)

這段代碼中混合了函數(shù)聲明和函數(shù)表達(dá)式的形式,而函數(shù)實(shí)際上是綁定到了f上而不是g。但是這么寫是否符合Javascript的要求呢?在《Javascript高級程序設(shè)計(jì)》中:

也可以同時(shí)使用函數(shù)聲明和函數(shù)表達(dá)式,例如:var sum = function sum(){}。不過,這種語法在safari中會導(dǎo)致錯誤。

既然在除了safari以外的瀏覽器可以同時(shí)使用函數(shù)聲明和函數(shù)表達(dá)式來聲明函數(shù),那么為什么題目中的代碼會報(bào)錯呢?我的理解是,這樣寫的結(jié)果是導(dǎo)致了函數(shù)名g被包裝進(jìn)了f中,變成了f的一個局部變量,只能在f函數(shù)內(nèi)部訪問到g,我把代碼修改了一下:

var f = function g(){ 
            alert(g);
            return 23; 
        };
f();

我在f函數(shù)內(nèi)部訪問g,彈框彈出的內(nèi)容為function g(){ alert(g);return 23; },沒有報(bào)錯并且訪問成功,g的函數(shù)體內(nèi)容與f是一樣的,只是函數(shù)名不一樣。

————————我是一條分割線——————————

我們再來回顧一下函數(shù)聲明與函數(shù)表達(dá)式吧(因?yàn)樵谥暗囊淮蚊嬖囍斜粏柕搅怂鼈兊膮^(qū)別,我一下沒打上來……所以還是增強(qiáng)一下記憶)

函數(shù)聲明的形式:

function funcName(){ /*some code*/}

函數(shù)表達(dá)式的形式:

var funcName = function(){/*some code*/}

在《Javascript高級程序設(shè)計(jì)》中有一段話:

解析器在向執(zhí)行環(huán)境中加載數(shù)據(jù)時(shí),對函數(shù)聲明和函數(shù)表達(dá)式并非一視同仁的。解析器會率先讀取函數(shù)聲明,并使其在執(zhí)行任何代碼之前可用(可以訪問);至于函數(shù)表達(dá)式,則必須等到解析器執(zhí)行到它所在的代碼行,才會真正被解釋執(zhí)行。

也就是說,在函數(shù)聲明的代碼段之前訪問函數(shù),是能夠訪問到的(函數(shù)聲明提升)。而在函數(shù)表達(dá)式的代碼段之前訪問函數(shù),則會發(fā)生錯誤,因?yàn)樵趫?zhí)行到函數(shù)所在語句之前,函數(shù)表達(dá)式聲明的變量名中不會保存對函數(shù)的的引用。
除此之外函數(shù)聲明與函數(shù)表達(dá)式的語法其實(shí)是等價(jià)的。

題目三:

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

答案:1

注意:delete是用來刪除對象的屬性,無法刪除普通變量。

題目四

var y = 1, x = y = typeof x;
x;

答案:undefined
因?yàn)橘x值運(yùn)算是從右往左的,因此題目中的代碼展開來等價(jià)于:

var y = 1;
y = typeof x;
var x = y;
x;

第二行代碼在訪問x時(shí),x并沒有聲明,值為undefined,所以typeof x也就是undefined了。

題目五

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

答案:number

把代碼分開來看會比較清楚:

var baz = function(){ return 1; };
(function f(f){
  return typeof f();
})(baz);

先將function(){ return 1; }賦值給baz,則baz()應(yīng)該是1。再把baz當(dāng)成參數(shù)傳入到立即執(zhí)行函數(shù)中,立即執(zhí)行函數(shù)返回的是傳入的參數(shù)的類型,即baz()的類型,baz()返回1類型為number。

題目六

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

答案:undefined
這里關(guān)鍵要理解this的所指。arguments[0]foo.bar,而函數(shù)中的this指的就是調(diào)用arguments[0]()這個函數(shù)的對象,即window對象。但是window對象并沒有baz這個屬性,因此,返回的是undefined。

題目七

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

答案:undefined
將代碼改寫一些變成:

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

foo.bar是一個函數(shù),將foo.bar賦值給了f,那么f變成了一個函數(shù)名。直接調(diào)用f()時(shí),調(diào)用它的對象為window,而window中并沒有baz屬性,所以輸出的是undefined。

題目八

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

答案:number
在這里,我們需要了解一下逗號操作符的作用:

在用于賦值時(shí),逗號操作符總會返回表達(dá)式中的最后一項(xiàng)。

所以,這個立即執(zhí)行函數(shù)返回的應(yīng)該是后面那個函數(shù)的返回值,返回值為2,類型為number。

題目九

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

答案:1undefined
首先,第一個問題是:函數(shù)在判斷語句中判斷的結(jié)果是true還是false?,我們可以運(yùn)行一下以下代碼:

Boolean(function f(){});//true

將一個空函數(shù)轉(zhuǎn)換為布爾型,結(jié)果為true,所以題中的代碼是能夠進(jìn)入if語句的。那么第二個問題是:為什么typeof f會是undefined?因?yàn)?b>if判斷條件中并不能真正的聲明一個函數(shù),因此,f是一個沒有被聲明過的函數(shù)名,它的類型為undefined

題目十

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

答案:2
我們在題目四里說過:Javascript解析器會率先讀取函數(shù)聲明,使它在任何代碼之間可用。因此,在外層函數(shù)f函數(shù)體內(nèi)的兩個函數(shù)聲明,都會提升到return f()之前執(zhí)行。而又因?yàn)镴avascript沒有重載,因此以最后執(zhí)行的同名函數(shù)輸出結(jié)果為準(zhǔn)。

題目十一

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

答案:false
1、首先我們要了解instanceof的作用:instanceof是用來檢測變量是否是給定引用類型的實(shí)例。
2、然后再看f()函數(shù)體中return f,返回了自己。
3、通過new來調(diào)用構(gòu)造函數(shù)生成實(shí)例的過程為:1)創(chuàng)建一個空對象;2)將類的prototype中的屬性和方法復(fù)制到實(shí)例中;3)將第一步創(chuàng)建的空對象做為類的參數(shù)調(diào)用類的構(gòu)造函數(shù);4)返回一個新的實(shí)例對象。
然而,在以new形式調(diào)用構(gòu)造函數(shù)f()時(shí),f()返回了自身,將new返回的實(shí)例對象覆蓋掉了,因此,new之后的結(jié)果不是f的一個引用了。

題目十二

var x = [typeof x, typeof y][1];
typeof typeof x;

答案:string
很明顯的可以看出typeof x = undefinedtypeof y = undefined,那么xundefined。其實(shí)其他的都不看,光看typeof typeof就能確定輸出的是string了。

題目十三

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

答案:undefined
這道題目有一個小陷阱,一不注意還真被忽悠進(jìn)去了。我們仔細(xì)看一個參數(shù)傳入的內(nèi)容最外面有一對{},那么我們把題目修改一下就一目了然了:

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

傳入的參數(shù)為temp這個對象,因此函數(shù)中的foo.bar實(shí)際上為temp.bar,但是temp里只有foo一個屬性,沒有bar,所以應(yīng)該是undefined。

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/91727.html

相關(guān)文章

  • JavaScript 設(shè)計(jì)模式(三):代理模式

    摘要:虛擬代理延遲執(zhí)行虛擬代理的目的,是將開銷大的運(yùn)算延遲到需要時(shí)再執(zhí)行。 showImg(https://segmentfault.com/img/bVbuitm?w=800&h=600); 代理模式:為一個對象提供一個代用品或占位符,以便控制它的訪問。 當(dāng)我們不方便直接訪問某個對象時(shí),或不滿足需求時(shí),可考慮使用一個替身對象來控制該對象的訪問。替身對象可對請求預(yù)先進(jìn)行處理,再決定是否轉(zhuǎn)交給...

    Keagan 評論0 收藏0
  • 前端開發(fā)應(yīng)屆生面試指南(含各大公司具體指南及面試真

    摘要:先介紹一下本人應(yīng)屆前端開發(fā)一枚,非科班出身,專業(yè)是化學(xué),大學(xué)期間開始自學(xué)前端開發(fā),在今年春招實(shí)習(xí)和秋招的時(shí)候投了一些公司,拿到一些京東拼多多虎牙等,總體來說還算滿意,特地寫一篇文章來總結(jié)一下面試的那些套路。 showImg(https://segmentfault.com/img/remote/1460000011897700); 先介紹一下本人應(yīng)屆前端開發(fā)一枚,非科班出身,專業(yè)是化學(xué)...

    sunnyxd 評論0 收藏0
  • 前端開發(fā)應(yīng)屆生面試指南(含各大公司具體指南及面試真

    摘要:先介紹一下本人應(yīng)屆前端開發(fā)一枚,非科班出身,專業(yè)是化學(xué),大學(xué)期間開始自學(xué)前端開發(fā),在今年春招實(shí)習(xí)和秋招的時(shí)候投了一些公司,拿到一些京東拼多多虎牙等,總體來說還算滿意,特地寫一篇文章來總結(jié)一下面試的那些套路。 showImg(https://segmentfault.com/img/remote/1460000011897700); 先介紹一下本人應(yīng)屆前端開發(fā)一枚,非科班出身,專業(yè)是化學(xué)...

    jeyhan 評論0 收藏0
  • 前端開發(fā)應(yīng)屆生面試指南(含各大公司具體指南及面試真

    摘要:先介紹一下本人應(yīng)屆前端開發(fā)一枚,非科班出身,專業(yè)是化學(xué),大學(xué)期間開始自學(xué)前端開發(fā),在今年春招實(shí)習(xí)和秋招的時(shí)候投了一些公司,拿到一些京東拼多多虎牙等,總體來說還算滿意,特地寫一篇文章來總結(jié)一下面試的那些套路。 showImg(https://segmentfault.com/img/remote/1460000011897700); 先介紹一下本人應(yīng)屆前端開發(fā)一枚,非科班出身,專業(yè)是化學(xué)...

    lentoo 評論0 收藏0
  • <LeetCode天梯>Day028 回文鏈表(雙指針+遞歸+棧+數(shù)組) | 初級算法 | Pyth

    摘要:先實(shí)現(xiàn)棧操作遍歷鏈表,把每個節(jié)點(diǎn)都進(jìn)中然后再遍歷鏈表,同時(shí)節(jié)點(diǎn)依次出棧,二者進(jìn)行比較。 ?作者簡介:大家好,我是車神哥,府學(xué)路18號的車神? ?個人主頁:應(yīng)無...

    miguel.jiang 評論0 收藏0

發(fā)表評論

0條評論

raoyi

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<