一些js 题的解析

  今天做了群友发的一个链接, 关于js 的一些题目的. 这样的题目常常有很多陷阱在里面,等着别人去踩. 很不幸,洒家踩了, 还蛮悲剧.

  http://perfectionkills.com/javascript-quiz/

  下面是我关于这些题目的,一些关于自己的理解. 如果有什么不同的意见或者见解,欢迎拍砖.

 

(function(){ 
      return typeof arguments;
    })();

   这个题目比较简单, 只要大家不觉得 arguments 是 array ,就可以了.

 

   返回是 object.

 

 

 var f = function g(){ return 23; };
    typeof g();

  翻翻 aiming 的书,会发现里面对function 的解释, 以及几种创建方式有比较完全的描叙的, 这个陷阱,在下面的多个题目中有出现. 小心.

 

  返回是 undefined.

 

 

    (function(x){
      delete x;
      return x;
    })(1);

  Javascript 的delete, 删除的不是引入或者指向的对象. 而是对象本身. 

 /*

  资料

  delete 运算符
    从对象中删除一个属性,或从数组中删除一个元素。

  delete expression

    expression 参数是一个有效的 JScript 表达式,通常是一个属性名或数组元素

  所以,这里的形参的改变, 与他是没关系的.

*/

关于delete的具体解析,有园友给出了那个题目部分原本的解释,粗心了没去看,呵呵

http://perfectionkills.com/understanding-delete/

  返回  1.

 

 

   var y = 1, x = y = typeof x;
    x;

 这个部分有个小陷阱. 呵呵. 

 

 x= undefined , 大家知道. 然后 typeof x, 实际上也就是 typeof "undefined". 呵呵

 返回的,当然是 string 了.

 

 

  (function f(f){ 
      return typeof f(); 
    })(function(){ return 1; });

 

恩, 陷阱又来拉.哈哈. 此f 是什么呢?  于形参是没关系的,而且,你也取不到的.

所以, 形参没任何改变.

所以, 返回 number .

 

 

var foo = { 
      bar: function() { return this.baz; }, 
      baz: 1
    };
    (function(){ 
      return typeof arguments[0]();
    })(foo.bar);

 

这个地方.  主要是考虑的 this的上下文. 传入的是 foo.bar,而非他的父级.

所以, 返回 undefined . 

 

 

var foo = {
      bar: function(){ return this.baz; },
      baz: 1
    }
    typeof (f = foo.bar)();

 

有了上面那个题目, 这个题目也就可以理解了.

所以, 返回 undefined .

 

 

 var f = (function f(){ return "1"; }, function g(){ return 2; })();
    typeof f;

这里, 考究的是 ()  的返回. () 是返回最后一个.

 

返回 Number.

 

 

 var x = 1;
    if (function f(){}) {
      x += typeof f;
    }
    x;

if 里的东西,是肯定可以执行的.因为他是一个实际的存在(object). 非null|underfined的对象,在if下都是可以继续的 . 但是, 和上面的都是一样的原理, f ,却是不存在的.

 

所以 返回 1undefined.

 

 

 var x = [typeof x, typeof y][1];
    typeof typeof x;

这里 ,typeof y ,undefined. 然后, typeof typeof undefined => vtypeof "undefined"

 

返回  "string".

 

 

 (function(foo){
      return typeof foo.bar;
    })({ foo: { bar: 1 } });

 呵呵, 这里是个小陷阱, 如果看得太快了容易进去的哦.

 

 简单的描叙下, var fo = {foo:{bar:1}};  function(foo){})(fo);

 return typeof foo.bar  ==>  return typeof fo.bar

 所以返回 "undefined".

 

 

(function f(){
      function f(){ return 1; }
      return f();
      function f(){ return 2; }
    })();

这个题目, 是关于编译器对function的解析了.  于return 没关系. 当他把return 只看成一个string的时候, 编译器已经解析过了所有的function . 与var f = function(){} 这样的是不同的.

 

所以, 会返回 2.

 

 

  function f(){ return f; }
    new f() instanceof f;

这个地方理解不够, 瓶子给出的解释貌似看得过去

 

new f() 得到的是f 的本身, 而不是一个new的对象, 因此,不是f 的实例.

所以, 返回 false.

 

 

   with (function(x, undefined){}) length;

关于 with 这块, 如果我把 with也看成一个function(和想像alert一样).

 

那这个length, 就是with的形参长度了.

返回 2.

 

好了. 看来很多关于js的问题, 其实还是需要梳理下的. aiming 大大的书,关于这部分的讲解很给力. 可以让人绕过一些陷阱和问题.剩下的就是一些自己的测试了.

这些题目并不能够完全的反映出一个人的js能力, 但是至少能够让人知道编译器是怎么样去处理js的

 

解释得不正确的地方, 欢迎拍砖, 洒家会根据情况修复的

:-)

posted on 2010-12-24 17:09  Hehe123  阅读(562)  评论(12编辑  收藏  举报