美文网首页
javascript 判断数组的方法

javascript 判断数组的方法

作者: 李湘华 | 来源:发表于2019-03-25 15:19 被阅读0次

    最近闲得无聊翻看了下util.js(0.11.0), 其判断数组的方法是:

    function isArray(arr){
      return Array.isArray(arr)
    }
    

    Array.isArray()早在ES5就己经有了,util.js再单独定义本没必要,不过新版本中己经废弃,直接使用Array.isArray()来判断。

    关于数组判断的基础知识:

    typeof A:检测数据 A 类型。

    A instanceof B:检测数据 A 的原型链上是否有 B 的原型对象 。

    A.constructor:返回初始化 A 的构造函数。

    typeof运算符判断数组时,返回object,此时我们们以结合使用上面的判断写出如下判断方法:

    function isArray(arr){
      return typeof arr === "object" && arr instanceof Array
    }
    
    function isArray(arr){
      return typeof arr === "object" && arr.constructor === Array
    }
    

    以上两个方法可以判断数组,但是得注意了,如果我们使用框架(iframe),每个框架都有其全局window和各自不同的内置javascript对象,这时要防止引用混乱的情况

    var iframe = document.createElement('iframe');
    document.body.appendChild(iframe);
    xArray = window.frames[window.frames.length-1].Array;
    var arr = new xArray("1","2","3","4","5");
    //这个写法IE下是不支持的,标准浏览器firefox,chrome下有
    
    console.log(arr);  // 打印出 ["1", "2", "3", "4", "5"]
    console.log(arr instanceof Array); // false 
    console.log(arr.constructor === Array); // false
    

    在查看jquery源码可以看到它所用的另一种方法,这种方法也被很多开发者所借鉴

    Object.portotype.toString.call(value)//or
    {}.portotype.toString.call(value)
    

    以上方法返回值如下:

    Object.prototype.toString.call("jerry");//[object String]
    Object.prototype.toString.call(12);//[object Number]
    Object.prototype.toString.call(true);//[object Boolean]
    Object.prototype.toString.call(undefined);//[object Undefined]
    Object.prototype.toString.call(null);//[object Null]
    Object.prototype.toString.call({name: "jerry"});//[object Object]
    Object.prototype.toString.call(function(){});//[object Function]
    Object.prototype.toString.call([]);//[object Array]
    Object.prototype.toString.call(new Date);//[object Date]
    Object.prototype.toString.call(/\d/);//[object RegExp]
    function Person(){};
    Object.prototype.toString.call(new Person);//[object Object]
    var obj = Object.create( null );
    Object.prototype.toString.call(obj);//"[object Object]"
    Object.getPrototypeOf(obj)//null
    

    Jquery获取类型的方法:

    var class2type = {};
      "Boolean Number String Function Array Date RegExp Object Error Symbol".split(" ").forEach(function(name,i,arr){
        class2type["[object " + name + "]"] = name.toLowerCase();
      })
      function toType( obj ) {
        if ( obj == null ) {
          return obj + "";
        }
        return typeof obj === "object" || typeof obj === "function" ? class2type[ {}.toString.call( obj ) ] || "object" : typeof obj;
      }
    

    关于instanceofconstructor再说点题外话:

    let obj = Object.create(null);
    console.log(typeof obj);
    console.log(obj instanceof Object);
    console.log(obj.constructor);
    //object
    //false
    //undefined
    

    Object.create():该方法可以指定原型对象和属性,返回一个新的对象。

    关于哎,到处都是坑~~~

    http://www.tensweets.com/article/5c988057362e5434baf63364

    相关文章

      网友评论

          本文标题:javascript 判断数组的方法

          本文链接:https://www.haomeiwen.com/subject/kxtbvqtx.html