這些題目都是針對 Ecmascript 第三版的,原題里面全部都是選擇題,有備選答案,這里我把答案都去掉了,因為有的題目如果不看答案,你反而知道為什么,看了答案你卻遲疑了,所以,直接來做吧,給自己一點自信,相信自己!
//題目 1
(function(){ return typeof arguments; })();
//題目 2 var f = function g(){ return 23; }; typeof g(); //題目 3 (function(x){ delete x; return x; })(1); //題目 4 var y = 1, x = y = typeof x; x; //題目 5 (function f(f){ return typeof f(); })(function(){ return 1; }); //題目 6 var foo = { bar: function() { return this.baz; }, baz: 1 }; (function(){ return typeof arguments[0](); })(foo.bar); //題目 7 var foo = { bar: function(){ return this.baz; }, baz: 1 } typeof (f = foo.bar)(); //題目 8 var f = (function f(){ return "1"; }, function g(){ return 2; })(); typeof f; //題目 9 var x = 1; if (function f(){}) { x += typeof f; } x; //題目 10 var x = [typeof x, typeof y][1]; typeof typeof x; //題目 11 (function(foo){ return typeof foo.bar; })({ foo: { bar: 1 } }); //題目 12 (function f(){ function f(){ return 1; } return f(); function f(){ return 2; } })(); //題目 13 function f(){ return f; } new f() instanceof f; //題目 14 with (function(x, undefined){}) length;
怎么樣,是不是感覺有些棘手。
1.這一題如果理解了 arguments 到底是個什么東西,就知道答案是什么了。原題里面,疑惑的答案有兩個:"object", "array"。準確答案是:"object" ,雖然 arguments 可以采用數(shù)組下標的方式來使用,但是它不是數(shù)組,而且,typeof 的返回值里面,從來都不會有 array
2.這一題的答案是:會報錯。要弄懂這一題,需要知道 function 的作用。在 JavaScript 里面,function 有兩個作用,一是作為函數(shù)聲明,這個想必都可以理解,聲明函數(shù)時,函數(shù)會被提升到當前代碼的最頂端(被稱作函數(shù)提升);二是作為函數(shù)表達式,比如:
var f = function test(){}
此時,test 是可選的,如果加上 test ,并不會出現(xiàn)函數(shù)提升效果,test只是作為當前函數(shù)表達式的一個內(nèi)部屬性(f.name)
3.這一題的答案是:1 。函數(shù)中的 delete 并沒有生效,在函數(shù)內(nèi)部,delete 無法刪除形參,刪除時也不會報錯,所以 x 依舊是 x 。如果確實要刪除 x,使用 undefined 取消它的值吧
4.這一題的答案是:undifined 。賦值符號 = 具有右結(jié)合性,執(zhí)行代碼的時候,先執(zhí)行右邊的代碼,再執(zhí)行左邊的代碼。所以 typeof x 是 undifined ,于是 x = y = undefined
5.這一題的答案是:“number"。這個比較有疑惑性。函數(shù)接受本身作為自己的參數(shù),然后調(diào)用,此時就看誰更具有更高的優(yōu)先級了,顯然,參數(shù)的優(yōu)先級更高,所以實際執(zhí)行的是:return typeof 1;
6.這一題的答案是 ”undefined"。這道題個人覺得有點疑惑,測試的 this 的用法。雖然 foo.bar 傳遞給了函數(shù),但是真正執(zhí)行的時候,函數(shù) bar 的上下文環(huán)境是 arguments ,并不是 foo,arguemnts[0] 可以理解為 arguments.0(不過寫代碼就不要這樣了,語法會錯誤的),所以這樣看來,上下文環(huán)境是 arguemnts 就沒問題了
7.這一題的答案還是: “undefined"。對 foo.bar 來說,執(zhí)行的時候上下文是 foo,但是當 把 foo.bar 賦值給 f 的時候,f 的上下文環(huán)境是 window ,是沒有 baz 的,所以是 ”undefined"
8.這一題的答案是:”number"。這道題測試的逗號表達式的語法,不詳細說了,不懂的話看下資料吧。
9.這一題的答案是:“1undefined"。理解這一題的關(guān)鍵與第 2 題類似,不懂的多看看第二題吧。
10.這一題的答案是:"string"。typeof 的結(jié)果一定是字符串。所以對字符串 再次 typeof ,肯定是 "string“ 了
11.這一題的答案是:"undefined"。太具有迷惑性了,純文字游戲。形參 foo = {foo:{bar:1}} ,不存在 foo.baz ,所以結(jié)果是:”undefined"
12.這一題的答案是:2 。函數(shù)提升了兩次,第二次把第一次覆蓋了,所以 return 后面的 f 是 return 語句的下一條語句聲明的函數(shù) f 。注意自執(zhí)行函數(shù) (function f (){})(); 中的 f 并沒有函數(shù)提升效果,它是表達式
13.這一題的答案是:false。構(gòu)造函數(shù)本身在 new 的過程中會返回一個表示該對象的實例。但是函數(shù)的返回值覆蓋了這個實例,所以答案是 false。話說,這個真的有點變態(tài)………………
14.這一題的答案是:2 。這道題開始是我在百度知道上面回答問題時看見的,一開始覺得寫錯了,后來問了一下,把這個變態(tài)題的網(wǎng)址給問出來了,然后沒有看答案,研究了一下,才知道為什么。with的用法是這樣的:with(object) {},在大括號里面,可以引用object的屬性而不用使用object.attr這種形式。這道題里面,with接受了一個對象,只不過這個對象是函數(shù),函數(shù)有l(wèi)ength屬性,代表形參的個數(shù),所以上面返回的值是2