刚才发现的一些变态的 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