有段时间没来冒泡了,前些天,同事发了一个JavaScript Quiz的链接,也解答了一下,下面贴出相应的题目及解答思路。顺便祝大家圣诞快乐! 1.    (function(){       return typeof arguments;    })(); A “object”B “array”C “arguments”D “undefined”  答案为:Aarguments是由控制器进入到function执行环境时创建的对象,其[[prototype]]为Object.prototype,参见ES262-3 10.1.6 2.    var f = function g(){ return 23; };    typeof g(); A “number”B “undefined”C “function”D Error 答案为:D和A都可以,需要区别浏览器,如果按照ES262的标准实现,应该是D参见:ES262-3 13 Notehttp://www.jslab.org.cn/?tag=FunctionDeclarationaAndFunctionExpression 3.    (function(x){      delete x;      return x;    })(1); A 1B nullC undefinedD Error  答案为:A参见ES262-311.4.1, The delete Operator, If Type(Evaluate(UnaryExpression)) is not Reference, return true.8.7, A Reference is a reference to a property of an object. A Reference consists of two components, the base object and the property name.附加信息:8.6.1,  DontDelete, Attempts to delete the property will be ignored. See the description of the delete operator in section 11.4.1.10.1.6,活动对象中的arguments属性为{DontDelete} 4.    var y = 1, x = y = typeof x;    x; A 1B “number”C undefinedD “undefined” 答案为:D这里容易将C和D搞混,首先,理解var的预编译,所有var声明会在控制器进入到执行环境时做的第一步事情,创建活动对象时进行处理,对应值都为undefined,接下来才是赋值操作.var y = 1, x = y = typeof x;等同于var y,x;y=1;x=(y = typeof x);前面的y=1;可以忽略,所以只剩下x = (y = typeof x);x为undefined,经过typeof运算后,返回"undefined", typeof运算符返回结果都为string类型参见:ES262-3 11.4.3 5.    (function f(f){       return typeof f();     })(function(){ return 1; }); A “number”B “undefined”C “function”D Error  答案为:A作用域问题,标识符查找的顺序,控制器进入函数时,活动对象将创建,arguments对象和其他声明都会被初始化到该对象,该活动对象会被插入到作用域链的顶端。参见:ES262-3 10.2.3 6.    var foo = {       bar: function() { return this.baz; },       baz: 1    };    (function(){       return typeof arguments[0]();    })(foo.bar); A “undefined”B “object”C “number”D “function”  答案为:Athis的标识问题,注意arguments[0]();其实就是要去执行function() { return this.baz; },此时,this为global Object,即window,而window上木有baz属性或变量。参见:ES262-3 10.1.7 ~ 10.2.3

解决方案 »

  1.   

    7.    var foo = {      bar: function(){ return this.baz; },      baz: 1    }    typeof (f = foo.bar)(); A “undefined”B “object”C “number”D “function”  答案为:Athis的确定和上一题相同,这里还要注意一下()运算符,它可以用作虚拟参数表,传值参数表,限定表达式的词法元素及强制表达式运算。 8.    var f = (function f(){ return "1"; }, function g(){ return 2; })();    typeof f; A “string”B “number”C “function”D “undefined”  答案为:B这里除了()的意义外还要注意“,”运算符的二义性,它可以是数组声明时的语法分隔符,也可以是连续运算符。 9.    var x = 1;    if (function f(){}) {      x += typeof f;    }    x; A 1B “1function”C “1undefined”D NaN  答案为:C和B都可以,如果按照ES262的标准实现,应该是C条件表达式判断部分只要条件不为false,0,null,undefined,NaN,都将认为是true,所以进入该分支,f的存在与否和第2题一样,具名函数表达式的问题。 10.    var x = [typeof x, typeof y][1];    typeof typeof x; A “number”B “string”C “undefined”D “object”  答案为:B首先过掉var的预编译部分,得到x最后的取值为undefined,但是注意,这里是经过typeof运算后的结果,也就是说,这个undefined是String类型的值,所以,后面的连续两个typeof稍微有点多余,一个就好了,结果都是string. 11.    (function(foo){      return typeof foo.bar;    })({ foo: { bar: 1 } }); A “undefined”B “object”C “number”D Error  答案为:A函数体中的foo其实为{foo:{bar:1}},该对象上没有只有一个属性:foo,所以,函数体内的foo.bar为undefined 12.    (function f(){      function f(){ return 1; }      return f();      function f(){ return 2; }    })(); A 1B 2C Error (e.g. “Too much recursion”)D undefined  答案为:B预编译和作用域问题,控制器进入到function f执行环境中创建的活动对象中,后面定义的function f覆盖了前面的f,所以,return f()执行的结果是B 13.    function f(){ return f; }    new f() instanceof f; A trueB false 答案为:B这个主要看new操作原理,如果构造器执行过程中返回值是一个对象,那么将返回该对象,而该对象却不是在执行construct过程中期望的那个对象,参见:ES262-3 13.2.2 14.    with (function(x, undefined){}) length; A 1B 2C undefinedD Error 答案为:Bwith语句块中的操作上下文将是with(表达式)中的表达式,而这个部分是一个function,那么,它的length自然是函数的形参个数。 See also:http://perfectionkills.com/javascript-quiz/ECMA262深入浅出
      

  2.   

    不错
    不过个人以为了解下语法就可以了 没必要在 这样的表达方式上面 化太多时间去深究
    写代码关键是 良好的结构 可读 可维护 可扩展第2题 var f=function g(){..} 难道不应该写成 var f,g;f=g=function(){}
    第3题 很难理解 为什么要删除形参
    第4,10题 为什么不写成 var x,y ;y=...;x=...; 先声明后赋值 要分开写
    第6,7,8,9,12,13题  歧义表达(上午我说晚上请你看电影,下午我说晚上请你吃饭,晚上你到底准备和我干什么呢)
    以上都是浮云
      

  3.   

    沙发
    最重要的还是要学解决问题的能力,即使google,baidu之也是一种能力
      

  4.   

    不可否认,楼主对javascript的语法非常熟悉和精通,而有时这样的熟悉和精通也是需要的。但是,何苦。
      

  5.   

    有一本书是 精通JAVASCRITP 稍微翻下,上面的 东西 都 看 的 明白了。至于要怎么写 那 再说了。
      

  6.   

    在森林里辛辛苦苦地挖了几个陷阱,可是从来没有人走到跟前过。
    楼主贴的这些题,实际Javascript编程中大家很少会走近这些陷阱,即使靠近也可以绕道。
    不过还是要支持楼主一下的,用这些题验证一下对Javascript的理解也还是可以的。
      

  7.   

    saffffffffffffffffffffffffffffffffffffffffffff
      

  8.   

    呵呵,还好,大部分我都做对了,唯一一个我不能理解的是第9题,不知为何f函数未被定义。
        var x = 1;    if (function f(){}) {      x += typeof f;    }    x;忘高手指教