今天晚上研究了下perfectionkills上的14道js题目,说实话,还挺搞脑子的,那么我们下面来分析分析吧~
1.
(function(){ return typeof arguments; })();
结果是"object",arguments是一个类数组,不论它到底是数组还是对象,typeof的结果肯定是"object"啦,当然类数组本身就是对象,Object.prototype.toString.call(arguments)的结果是[object Arguments]。
2.
var f = function g(){ return 23; }; typeof g();
结果是Error, 会报错Uncaught ReferenceError: g is not defined,这里的g是不存在的,因为这里已经是一个函数表达式了,而不是一个函数声明。
3.
(function(x){ delete x; return x; })(1);
结果为1,delete是删除对象中的属性的,对于普通变量或者函数参数无效。
4.
var y = 1, x = y = typeof x; x;
结果为"undefined",=赋值是从右向左的,y=typeof x时x还未定义,所以当时的x为undefined,typeof undefined的结果就是"undefined",这里两个undefined是有区别的,x的值的undefined类型是object,但是typeof之后的类型是string。
5.
(function f(f){ return typeof f(); })(function(){ return 1; });
结果为"number",这个玩过闭包的同学都知道function() {return 1}被传入了自执行函数中,所以f()的结果是1,那typeof 1的结果自然是number了。
6.
var foo = { bar: function() { return this.baz; }, baz: 1 }; (function(){ return typeof arguments[0](); })(foo.bar);
此题结果为"undefined",foo.bar被传入了匿名闭包中,然后在闭包中调用了bar方法,此时bar中的this指向谁呢,当然是谁调用指向谁啦,那就是我们的匿名闭包了,匿名闭包中有baz吗,答案是没有,so~
7.
var foo = { bar: function(){ return this.baz; }, baz: 1 } typeof (f = foo.bar)();
此题依旧"undefined",情况与上题差不多,只不过这里的this指向了window,f虽然得到了bar方法,但是确实在window下调用的。
8.
var f = (function f(){ return "1"; }, function g(){ return 2; })(); typeof f;
这题答案是"number",这题可能比较晕,里面有两个看似函数声明的东西,是不是会报错呢,其实不会,这里其实可以看作是个表达式,先是var f = function f() {return '1'},再是var f = function g() {return '2'},当然取后定义的啦,所以f妥妥的是2了。
9.
var x = 1; if (function f(){}) { x += typeof f; } x;
这题也很晕,答案更晕"1undefined",我个人是这么理解的,首先function f(){}在if里是true了,而且没有报错,用var在if里可是会报错的哦,但是这里其实并没有声明f函数,不信就在if里console.log(f)试试。
10.
var x = [typeof x, typeof y][1]; typeof typeof x;
答案是"string",这个好像没有什么悬念,x = typeof y,typeof y是undefined,后面就是之前提到过的故事,姓object的undefined变成string,然后再typrof一次,当然就是string了。
11.
(function(foo){ return typeof foo.bar; })({ foo: { bar: 1 } });
答案是"undefined",这里的foo本来就在一个对象下面了,那foo.bar肯定找不到东西啊,后面不解释了。
12.
(function f(){ function f(){ return 1; } return f(); function f(){ return 2; } })();
答案是2,函数声明提前了,而且覆盖了之前的f。
13.
function f(){ return f; } new f() instanceof f;
答案是false,这个f不论怎么引用都是f自己,当然不存在谁是谁的实例了。。。把return f换成return 1就true了。
14.
with (function(x, undefined){}) length;
答案是2,最伤我脑细胞的一题,其实是我概念不清楚,with的用法请自行百度的,这里想说的是,函数的length值等于参数的个数。。。于是答案是2了,我2了。。。
这套题目虽然很费脑细胞,但是仔细思考一下还是能加强自己对于javascript的理解的。