关于perfectionkills上的那些js题

今天晚上研究了下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的理解的。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。