JavaScript變態題目


剛才發現的一些變態的 JavaScript 題目,做了一下,只對了一半,特此發到園子里,和友友們分享一下。這些題目都是針對 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 可以采用數組下標的方式來使用,但是它不是數組,而且,typeof 的返回值里面,從來都不會有 array

2.這一題的答案是:會報錯。要弄懂這一題,需要知道 function 的作用。在 JavaScript 里面,function 有兩個作用,一是作為函數聲明,這個想必都可以理解,聲明函數時,函數會被提升到當前代碼的最頂端(被稱作函數提升);二是作為函數表達式,比如:

var f = function test(){}

此時,test 是可選的,如果加上 test ,並不會出現函數提升效果,test只是作為當前函數表達式的一個內部屬性(f.name)

3.這一題的答案是:1 。函數中的 delete 並沒有生效,在函數內部,delete 無法刪除形參,刪除時也不會報錯,所以 x 依舊是 x 。如果確實要刪除 x,使用 undefined 取消它的值吧

4.這一題的答案是:undifined 。賦值符號 = 具有右結合性,執行代碼的時候,先執行右邊的代碼,再執行左邊的代碼。所以 typeof x 是 undifined ,於是 x = y = undefined

5.這一題的答案是:“number"。這個比較有疑惑性。函數接受本身作為自己的參數,然后調用,此時就看誰更具有更高的優先級了,顯然,參數的優先級更高,所以實際執行的是:return typeof 1;

6.這一題的答案是 ”undefined"。這道題個人覺得有點疑惑,測試的 this 的用法。雖然 foo.bar 傳遞給了函數,但是真正執行的時候,函數 bar 的上下文環境是 arguments ,並不是 foo,arguemnts[0] 可以理解為 arguments.0(不過寫代碼就不要這樣了,語法會錯誤的),所以這樣看來,上下文環境是 arguemnts 就沒問題了

7.這一題的答案還是: “undefined"。對 foo.bar 來說,執行的時候上下文是 foo,但是當 把 foo.bar 賦值給 f 的時候,f 的上下文環境是 window ,是沒有 baz 的,所以是 ”undefined"

8.這一題的答案是:”number"。這道題測試的逗號表達式的語法,不詳細說了,不懂的話看下資料吧。

9.這一題的答案是:“1undefined"。理解這一題的關鍵與第 2 題類似,不懂的多看看第二題吧。

10.這一題的答案是:"string"。typeof 的結果一定是字符串。所以對字符串 再次 typeof ,肯定是 "string“ 了

11.這一題的答案是:"undefined"。太具有迷惑性了,純文字游戲。形參 foo = {foo:{bar:1}} ,不存在 foo.baz ,所以結果是:”undefined"

12.這一題的答案是:2 。函數提升了兩次,第二次把第一次覆蓋了,所以 return 后面的 f 是 return 語句的下一條語句聲明的函數 f 。注意自執行函數 (function f (){})(); 中的 f 並沒有函數提升效果,它是表達式

13.這一題的答案是:false。構造函數本身在 new 的過程中會返回一個表示該對象的實例。但是函數的返回值覆蓋了這個實例,所以答案是 false。話說,這個真的有點變態………………

14.這一題的答案是:2 。這道題開始是我在百度知道上面回答問題時看見的,一開始覺得寫錯了,后來問了一下,把這個變態題的網址給問出來了,然后沒有看答案,研究了一下,才知道為什么。with的用法是這樣的:with(object) {},在大括號里面,可以引用object的屬性而不用使用object.attr這種形式。這道題里面,with接受了一個對象,只不過這個對象是函數,函數有length屬性,代表形參的個數,所以上面返回的值是2


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM