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

posted @ 2016-03-30 15:12  愤怒的二档  阅读(211)  评论(0编辑  收藏  举报