一、溫故知新

做做題,總是能有溫故知新的體驗(yàn)。這套題是年的了,比較老了,

http://perfectionkills.com/  還有一套http://perfectionkills.com/javascript-quiz-es6 比較新ES6相關(guān)的。

在這個(gè)頁(yè)面有14道ECMAScript相關(guān)的題,我試了下答錯(cuò)了6道題,有些知識(shí),感覺(jué)著會(huì)了,別人說(shuō)出來(lái)肯定能懂,但是自己做題卻不一定對(duì),就是因?yàn)檎莆盏倪€不夠深刻,或者記憶出錯(cuò)等,下面來(lái)分析一下。

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

 

二、分析一下每道題的考點(diǎn)和原理

不會(huì)把每個(gè)知識(shí)點(diǎn)都詳細(xì)講解,有些是點(diǎn)到為止,有些會(huì)給出參考鏈接。

1、考點(diǎn):typeof和arguments

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

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

分析:typeof返回值有"string"/"number"/"undefined"/"boolean"/ "function"/"object"。了解更多。

而arguments是一個(gè)類數(shù)組,并不是真正的數(shù)組,所以很明顯是typeof返回值是"object"。了解更多

2、考點(diǎn):命名式函數(shù)表達(dá)式NFE【我答錯(cuò)了】

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

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

分析:var f=function g(){} 是一個(gè)命名函數(shù)表達(dá)式(NFE)。

typeof g()返回g函數(shù)調(diào)用后的結(jié)果的typeof值。

在作用域鏈上找g這個(gè)變量時(shí)根本找不到,所以會(huì)報(bào)錯(cuò):g is not a function。

所以正確答案就是D了。

規(guī)范規(guī)定:命名函數(shù)表達(dá)式名字(標(biāo)識(shí)符)在函數(shù)體的作用域內(nèi)有效,且不能被覆蓋。了解更多

3、考點(diǎn):delete【我答錯(cuò)了】

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

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

IIFE對(duì)應(yīng)的變量對(duì)象上有一個(gè)x值為傳入的1,相當(dāng)于是var聲明的,所以是不能被delete掉的。

delete x返回false。return x返回的值還是1.

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

所以正確答案是1

記住一點(diǎn):delete運(yùn)算符不能刪除變量,不能刪除參數(shù),用來(lái)刪除對(duì)象上configurable為true的屬性 了解更多

4、考點(diǎn):變量聲明,執(zhí)行上下文

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

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

分析:var y=1,x=y=typeof x;相當(dāng)于

第一步:y=undefined,x=undefined;

第二步:typeof x返回“undefined”字符串,把這個(gè)字符串賦值給y變量,然后賦值給x變量,所以最后x和y的值都是字符串“undefined”。了解更多

5、考點(diǎn):優(yōu)先級(jí)

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

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

 

分析:函數(shù)調(diào)用()優(yōu)先級(jí)比 typeof優(yōu)先級(jí)高

IIFE中傳入?yún)?shù)是一個(gè)函數(shù),調(diào)用后,先執(zhí)行這個(gè)函數(shù),得到結(jié)果數(shù)字1, typeof 1返回"number"所以答案就是"number"。了解更多

6、考點(diǎn):this

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

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

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

 

分析:

foo是一個(gè)對(duì)象,對(duì)象里面有一個(gè)屬性baz,一個(gè)方法bar。在IIFE中傳入一個(gè)參數(shù)foo.bar,foo.bar是一個(gè)函數(shù),

調(diào)用的時(shí)候,函數(shù)先執(zhí)行,返回一個(gè)this.baz。此時(shí)this指向window對(duì)象,window.baz不存在,所以返回undefined,而typeof undefined返回"undefined"。了解更多

7、考點(diǎn):this

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

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

 

把foo.bar屬性賦給f,此時(shí)f是一個(gè)函數(shù),調(diào)用后this執(zhí)向window,window.bar不存在,返回undefined,typeof undefined返回“undefined”。

8、考點(diǎn):逗號(hào)運(yùn)算符【我答錯(cuò)了】

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

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

這道題考察的是逗號(hào)運(yùn)算符。

f是一個(gè)立即執(zhí)行的表達(dá)式,逗號(hào)表達(dá)式的值是最后一個(gè)表達(dá)式既f(wàn)unction g(){},所以立即調(diào)用g函數(shù)返回2,typeof 2就是“number”。

逗號(hào)表達(dá)式會(huì)從左到右依次計(jì)算表達(dá)式的值,最后取最右邊的。了解更多

我把逗號(hào)運(yùn)算符取值記成左邊了,所以答錯(cuò)了。

9、【我答錯(cuò)了】

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

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

分析:function f(){}是個(gè)變量聲明,我們平時(shí)寫代碼不可能把一個(gè)函數(shù)聲明放到if語(yǔ)句中,但是測(cè)試一下if中放一個(gè)函數(shù)聲明的話條件為真內(nèi)容是會(huì)執(zhí)行的。

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

而typof f去查找f的時(shí)候,在它的作用域中找不到,所以typeof f返回"undefined"字符串,所以x+="undefined"最終x的值就是"1undefined"。

10、考點(diǎn)

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

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

分析:typefo返回的本身就是個(gè)字符串,再來(lái)一次typeof肯定"string"。這是個(gè)投機(jī)取巧的思維。

 

11、

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

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

 

分析:IIFE中傳入一個(gè)對(duì)象字面量有一個(gè)屬性foo,foo的值是一個(gè)包含一個(gè)bar屬性的對(duì)象。調(diào)用時(shí),獲取參數(shù)對(duì)象中的bar屬性,并沒(méi)有這個(gè)屬性,所以返回undefined,typeof undefined返回“undefined”。

12、考點(diǎn):函數(shù)聲明預(yù)解析【我答錯(cuò)了】

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

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

立即執(zhí)行的f函數(shù)里面,在變量聲明階段聲明一個(gè)f值是一個(gè)函數(shù)聲明,被后面的函數(shù)聲明覆蓋了,所以是f的值是function f(){return 2;}

我記錯(cuò)了,變量聲明階段函數(shù)的聲明直接就賦值了,所以答案就是2。了解更多

13、考點(diǎn):instanceof【我答錯(cuò)了】

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

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

構(gòu)造函數(shù)function f(){

return f;//返回值是f,作用域鏈向上查找,能找到f=>function f(){return f;} 因?yàn)閒不是基本類型,所以會(huì)返回f。

}

所以new f()調(diào)用的結(jié)果是f函數(shù)本身。所以現(xiàn)在問(wèn)題就變成了f instanceof f是true還是false。

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

function A(){}是Function的實(shí)例,A的原型鏈上找不到A.prototype屬性,所以instanceof返回false。

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

了解更多

14、考點(diǎn):with語(yǔ)句

with (function(x, undefined){}) length;

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

分析:相當(dāng)于獲取with中匿名函數(shù)的實(shí)際參數(shù)的個(gè)數(shù)

 

 

本文作者starof,因知識(shí)本身在變化,作者也在不斷學(xué)習(xí)成長(zhǎng),文章內(nèi)容也不定時(shí)更新,為避免誤導(dǎo)讀者,方便追根溯源,請(qǐng)諸位轉(zhuǎn)載注明出處:http://www.cnblogs.com/starof/p/6816474.html有問(wèn)題歡迎與我討論,共同進(jìn)步。

如果覺(jué)得本文對(duì)您有幫助或者您心情好~可以支付寶(左)或微信(右)支持一下:



iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

http://www.cnblogs.com/starof/p/6816474.html