http://perfectionkills.com/javascript-quiz/
下面是我關於這些題目的,一些關於自己的理解. 如果有什麼不同的意見或者見解,歡迎拍磚.
復制代碼 代碼如下:
(function(){
return typeof arguments;
})();
這個題目比較簡單, 只要大家不覺得 arguments 是 array ,就可以了.
返回是 object.
復制代碼 代碼如下:
var f = function g(){ return 23; };
typeof g();
翻翻 aiming 的書,會發現裡面對function 的解釋, 以及幾種創建方式有比較完全的描敘的, 這個陷阱,在下面的多個題目中有出現. 小心.
返回是 undefined.
復制代碼 代碼如下:
(function(x){
delete x;
return x;
})(1);
Javascript 的delete, 刪除的不是引入或者指向的對象. 而是對象本身.
/*
資料
delete 運算符
從對象中刪除一個屬性,或從數組中刪除一個元素。
delete expression
expression 參數是一個有效的 JScript 表達式,通常是一個屬性名或數組元素
所以,這裡的形參的改變, 與他是沒關系的.
*/
關於delete的具體解析,有園友給出了那個題目部分原本的解釋,粗心了沒去看,呵呵
http://perfectionkills.com/understanding-delete/
返回 1.
復制代碼 代碼如下:
var y = 1, x = y = typeof x;
x;
這個部分有個小陷阱. 呵呵.
x= undefined , 大家知道. 然後 typeof x, 實際上也就是 typeof "undefined". 呵呵
返回的,當然是 string 了.
復制代碼 代碼如下:
(function f(f){
return typeof f();
})(function(){ return 1; });
恩, 陷阱又來拉.哈哈. 此f 是什麼呢? 於形參是沒關系的,而且,你也取不到的.
所以, 形參沒任何改變.
所以, 返回 number .
復制代碼 代碼如下:
var foo = {
bar: function() { return this.baz; },
baz: 1
};
(function(){
return typeof arguments[0]();
})(foo.bar);
這個地方. 主要是考慮的 this的上下文. 傳入的是 foo.bar,而非他的父級.
所以, 返回 undefined .
復制代碼 代碼如下:
var foo = {
bar: function(){ return this.baz; },
baz: 1
}
typeof (f = foo.bar)();
有了上面那個題目, 這個題目也就可以理解了.
所以, 返回 undefined .
復制代碼 代碼如下:
var f = (function f(){ return "1"; }, function g(){ return 2; })();
typeof f;
這裡, 考究的是 () 的返回. () 是返回最後一個.
返回 Number.
復制代碼 代碼如下:
var x = 1;
if (function f(){}) {
x += typeof f;
}
x;
if 裡的東西,是肯定可以執行的.因為他是一個實際的存在(object). 非null|underfined的對象,在if下都是可以繼續的 . 但是, 和上面的都是一樣的原理, f ,卻是不存在的.
所以 返回 1undefined.
復制代碼 代碼如下:
var x = [typeof x, typeof y][1];
typeof typeof x;
這裡 ,typeof y ,undefined. 然後, typeof typeof undefined => vtypeof "undefined"
返回 "string".
復制代碼 代碼如下:
(function(foo){
return typeof foo.bar;
})({ foo: { bar: 1 } });
呵呵, 這裡是個小陷阱, 如果看得太快了容易進去的哦.
簡單的描敘下, var fo = {foo:{bar:1}}; function(foo){})(fo);
return typeof foo.bar ==> return typeof fo.bar
所以返回 "undefined".
復制代碼 代碼如下:
(function f(){
function f(){ return 1; }
return f();
function f(){ return 2; }
})();
這個題目, 是關於編譯器對function的解析了. 於return 沒關系. 當他把return 只看成一個string的時候, 編譯器已經解析過了所有的function . 與var f = function(){} 這樣的是不同的.
所以, 會返回 2.
復制代碼 代碼如下:
function f(){ return f; }
new f() instanceof f;
這個地方理解不夠, 瓶子給出的解釋貌似看得過去
new f() 得到的是f 的本身, 而不是一個new的對象, 因此,不是f 的實例.
所以, 返回 false.
with (function(x, undefined){}) length;
關於 with 這塊, 如果我把 with也看成一個function(和想像alert一樣).
那這個length, 就是with的形參長度了.
返回 2.
好了. 看來很多關於js的問題, 其實還是需要梳理下的. aiming 大大的書,關於這部分的講解很給力. 可以讓人繞過一些陷阱和問題.剩下的就是一些自己的測試了.
這些題目並不能夠完全的反映出一個人的js能力, 但是至少能夠讓人知道編譯器是怎麼樣去處理js的