• JavaScript变态题目


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

  • 相关阅读:
    闪回flashback
    Oracle数据文件在open状态被删除的恢复记录
    从浅到深掌握Oracle的锁
    Oracle 11g 11201_RHEL5.5_RAC_VBOX 详细搭建步骤
    AWR Report 关键参数详细分析
    16、Xtrabackup备份与恢复
    17、percona-toolkit
    插入排序
    选择排序
    冒泡排序
  • 原文地址:https://www.cnblogs.com/aaronzhang/p/3087811.html
Copyright © 2020-2023  润新知