zoukankan      html  css  js  c++  java
  • 尝试回答js问题

      看到@玉伯的这篇文章《Sea.js 源码解析(三)》给的几个问题,在综合下面的评论,写出自己的总结:

    1. 我们知道 typeof new String("xxx") 返回 "object",请问 typeof String("xxx") 返回什么?为什么?

       typeof String("xxx")返回的是string。直接调用构造函数Srtring返回的是字面量,和定义一个字面量一样,var str = "xxx";

       当使用new String时候,则创造的是一个对象。像这样:

     function A(){};
     var a1 = new A();
     typeof a1;    //返回的是一个"object";

      2.  为什么我用的是 typeof obj == "string" 而不是 typeof obj === "string" ?

        这个不知如何解释!

      3.  下面这种写法,有什么不妥?

    function isString(obj) { return obj.constructor === String };

      这则代码是:传入的obj的构造函数是否是String。这个判断是不够严谨的,首先,并没判断是否为空。其次,因为obj的constructor是可以变化的,例如:

    function A(){};
    
        var str = new String("XXX");  //
    
        str.constructor = A;
    
       console.log(isString(str));

      创建一个new  String的实例,能够修改prototype上面的constructor属性。 但创建字面量形式就不会:

    function A(){};
    
        var str = "XXXX";
    
        str.constructor = A;
    
       console.log(isString(str));

      创建字面量时,会创建一个临时的对象转换,创建立马就被销毁,所以在字面量上面不能定义属性,也就改变不了对象的constructor指向。

      总之,判断的不够严谨。

      3. Object.prototype.toString.call(obj) 和 ({}).toString.call(obj) 的区别是什么?哪个好?  

        前者要好点,直接调用Object.prototype上面的方法,要比({})去创建一个对象然后去原型链上找方法要快很多。

      4. 鸭子判断究竟好不好?那些异常情况,真的需要关注吗?

        If it looks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck.
        如果它看起来像鸭子,会像鸭子一样游泳,也会嘎嘎叫,那么它很可能就是一只鸭子。

        像这样去判断一个Array:

    function isArray(object) {
      return object != null && typeof object === "object" &&
        'splice' in object && 'join' in object
    };
    console.log(isArray([])); // true

      那么在这样去判断:

    var json = {
        
        splice:function(){},
        join:function(){}
    }
    console.log(isArray(json)); //true

      明显不正确。鸭子不是完美的解决方案,却在固定的模式下可以使用。

      

      以上回答了几个问题,感觉学到好多东西,虽然有点答非所问,但也经过一番验证得到。希望拍砖!

  • 相关阅读:
    Spark Streaming源码解读之Receiver生成全生命周期彻底研究和思考
    linux 修改时间时区,修改语言
    远程链接mysql error 2003
    Android NDK r10c 编译boost 1.55 (使用Cygwin)
    linux上cocos2dx Android打包环境
    linux上cocos2dx 环境配置
    linux, windows编译安装 boost库 (boost 1.56)
    编译安装 gcc 4.8.3
    vim配置添加python
    mvn设置
  • 原文地址:https://www.cnblogs.com/floatboy/p/question_1.html
Copyright © 2011-2022 走看看