• 考验你的JavaScript底细


    原文链接 http://sentsin.com/jsquiz.html?from=timeline&isappinstalled=1

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

    这里return 返回的是一个对象,arguments是一个对象

    但是它有length这个属性。该对象的属性:

    1、callee
     对当前正在执行的函数的引用
    2、length
     传递给函数参数的个数(实际传递给函数参数的个数)

    二 

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

    undefined

    +function g(){
      return 23;
    };

    console.log(typeof g());

    undefined

     

    只要是函数表达式。然后是定义的g是一个有独立空间的函数,

    但是,变量负值以后,这个右侧的命名空间就消失了,命名空间。

    因此,就挂了。如果想保留的话,OK这样。

    var c = ""

    var f = function g() {

      console.log(111);

          c = g;

    }

    c();

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

    返回值——1

    这里要思考一下delete干了什么,delete可以删除对象内的属性.
    但是delete无法删除普通变量,如上面的delete x; 是无法删除的。
    并且注意:delete x; 是有返回值的。删除成功返回true;失败是flase;
    虽然无法删除局部变量,但是可以删除全局变量。
    test = 'test';

    delete window.test;



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

    x --->   undefined
    y --->   undefined

      五

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

    返回值是 number

    因为 f() 函数自执行了。return 1; 然后就是number。

      六

    var foo = {
      bar: function hg() {
               console.log(this);  
        return this.baz;
      },

      baz: 1
    };


    (function(){
      return typeof arguments[0]();
    })(foo.bar);

    'undefined"

    这个题目其实挺酷,我很喜欢,

    注意:这是定义在foo对象中,对象顺序执行,因此,foo.bar == 1 (true); 并不是函数。

    当然如果是function中的话,function内定义的函数 》 传入的参数 》 函数内的变量。很有意思吧。哈哈

    这里因为是一个闭包中执行,将函数以参数的形式传入,作用域是闭包的作用域。this指向了hg这个函数本身。

    因此,在下面自执行的函数中, foo.bar() ---> 找不到 baz 这个变量。

    var foo = {

      bar: function (){

         console.log(this, "  ", this.baz);

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

    undefined   

    这个跟上面的很像,

    对比一下: 直接输出 foo.bar() ---> 1

    而,选择 f = foo.bar ---> f()---> undefined  是因为改变了作用域。

    f() 的作用域是全局,并没有baz这个变量。

    八 

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

    这个题目很有意思啊,哈哈,结果是 number 我其实第一反应是 var a  = (1, 2, 3); 有点像逗号赋值运算,

    OK,如果这么理解也就容易了。但是有个问题,为什么这么玩呢?看下面的测试。

    var f = (
      function f(){
        console.log("1111");
        return "1";
      },
      function g(){
        console.log('22222');
        return 2;
      }
    )();
    typeof f;
    22222
    "number"

    这样就说的通了,选择了第二个function,然后再自执行。

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

    这个玩法碉堡了。。。。我靠!

    function f () {}   ==  true  这个怎么破???

    function f() {} ---> 是一个对象。

    就好比 if( {} ) {

      console.log(111);

    }

    一样也可以打印出来。

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

    这个例子也是很酷毙的。x, y 最开始并没有什么值,都是undefined。
    首先 x = ["undefined", "undefined"] ---> x[1] ---> "undefined"字符串。
    然后 typeof x ---> "string"
    而, typeof typeof x ---> string.

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

       

    这段代码很贼。考的是细心,注意传入的参数,{foo: {bar:1}}

    这里传入的是一个对象,对象里面包着对象。

    因此,foo.bar 。并没有这个属性,有的只是 foo.foo。

    这个需要细心一点,foo.foo.bar 才有意义。

    因此是 undefined

    十二

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

     这个问题其实前面提到过,在函数中定义函数,

    OK,都会跑一遍的,所有最后一个f会覆盖第一个,

    因此,返回 2。

     十三 

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

    false

    这个亚童也分享了,很酷,我觉得这个例子比较爽,很有意思。

    这里需要关注的问题是new,new 干了什么事情,这里就不写了,字有点多,

    重点是 function Object() {
      return AA;

    主要关注的是,这里返回的AA是什么,如果是AA对象,

    那么,返回值就是AA,它会脱落Object这个对象的实例,就是 返回值的 __proto__的指向问题,

    那么我们已经有两种方式改变这个了,一种是在返回值设定一个一对象,另一种直接改变 __proto__的指向来改变。

    那这就很明显了,肯定是false了,因为new f()的 __proto__指向并没有指向 f.prototype.

    这个技能很爽!!!哈哈。

    十四 

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

     OK 这个亚童分享了,

    with作用,之前并没有理解的很透彻,这回感觉很酷炫,

    var obj = {

       a : 1,

       b : 2,

       c : 3

    }

    with (obj) {

      console.log(a);

      console.log(b);

      console.log(c);

     上面的length是函数参数的length,

     function 本身也是有length这个属性的。

    用arguments.length 获取实际传入的参数。

    function.length 可以获取函数声明的参数个数。

     

  • 相关阅读:
    高阶函数 map
    高阶函数_filter
    sort和sorted方法的使用
    一个函数作为另外一个函数的参数
    匿名函数
    jenkins+Xcode+蒲公英实现ipa自动打包发布全攻略
    iOS 画贝塞尔曲线 连续曲线 平滑曲线 曲线图表
    基于WebRTC实现iOS端音频降噪功能
    苹果ios音频的回声消除处理
    iOS实现录音功能
  • 原文地址:https://www.cnblogs.com/hgonlywj/p/5354149.html
Copyright © 2020-2023  润新知