• 关于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的理解的。

  • 相关阅读:
    axios的使用/
    jQuery好玩的双向控制轮播
    vue的路由跳转方式/两种
    vfor的某些注意事项
    vue使用插件时不能撑满页面?
    swiper中的双向控制器不生效问题
    sass的安装及使用
    .net必懂题
    软件架构初读01
    EJB
  • 原文地址:https://www.cnblogs.com/junhua/p/4477756.html
Copyright © 2020-2023  润新知