资讯专栏INFORMATION COLUMN

javascript 判断是否为数组 isArray()

liaoyg8023 / 1303人阅读

摘要:开发人员自定义的任何构造函数都将返回。在任何值上直接调用的原生方法,都会返回格式的字符串,每个类内部都有一个属性,这个属性中就指定了上述字符串中构造函数名。

JavaScript 在类型判断上确实是有比较多的坑,在不使用 ES5 的 Array.isArray() 的情况下,如何判断呢?

首先放弃typeof

javascript 弱类型的语言就是有比较多的坑,单纯的typeof 是很无力的。所以用它来判断数组肯定是不行的。

    typeof 1    // number
    typeof undefined  // undefined
    typeof null // object
    typeof []   // object
    typeof {}   //object
    typeof function (){} // function

那么言归正传正传,该如何判断。

思路一:length 属性判断

Array 对象都是有length 属性的,可不可以判断length

  function isArray(array) {
      return (typeof array === "object" && typeof array.length === "number")
  }

与这个类似的是

  function isArray(array) {
      return (typeof array === "object" && !isNaN(array.length))
  }

但是这个存在的问题是,对于有length属性的对象,则会出现判断失误的问题
比如:

    var fakeArray = {
        length: 10,
        value: "Fake Array"
    }
    
思路二:对Array实例对象的原型进行判断。
    var arr = [1, 2, 3]
    arr instanceof Array
    
    // constructor 指向了原型
    arr.constructor === Array
    

但在多iframe的情况下,由于每个iframe 是一个独立的环境,它们之间不不共享原型链,则通过原型进行判断会出现错误

var iframe = document.createElement("iframe")
document.body.appendChild(iframe)
xArray = window.frames[window.frames.length-1].Array
var arr = new xArray(1,2,3) // [1,2,3]

// 正确的判断
Array.isArray(arr)  // true
// 有问题的判断
arr instanceof Array // false
arr.constructor === Array // false 
思路三: Object.prototype.toString.call() 方法

适用于所有环境,只支持原生的对象,Object的toString()方法不能检测非原生构造函数的构造函数名。开发人员自定义的任何构造函数都将返回[object Object]。在任何值上直接调用Object的原生toString()方法,都会返回[object NativeConstrctorName]格式的字符串,每个类内部都有一个class属性,这个属性中就指定了上述字符串中构造函数名。
 

    Object.prototype.toString.call(array) === "[object Array]"

不过,上面的方案也存在一定问题,在ES6 中这样的判断可以被欺骗

    var obj = {};
    // ES6 Symbol
    obj[Symbol.toStringTag] = "Array";
    // true
    console.log(isArray(obj)); 
结论

在ES5 之后,就老老实实用Array.isArray 来判断,ES5之前可以使用上面pollyfill。

    if (!Array.isArray) {
        return Object.prototype.toString.call(array) === "[object Array]";
    }
结论延伸

以此延伸,那么判断其他类型就可以使用类似的方法

    var is = function (obj,type) { 
        return (type === "Null" && obj === null) || 
            (type === "Undefined" && obj === void 0 ) || 
            (type === "Number" && isFinite(obj)) || 
            Object.prototype.toString.call(obj).slice(8,-1) === type; 
    }

参考:

1.Javascript isArray 数组类型检测函数

2.JavaScript数组的isArray方法实现

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107885.html

相关文章

  • JavaScript中,如何判断数组数组

    摘要:比如我们今天要讨论的,在当中如何判断一个数组是数组。在数组的原型链上也能找到构造函数由上面的几行代码可以看出,使用运算符可以分辨数组和对象,可以判断数组是数组。用判断实例化的数组拥有一个属性,这个属性指向生成这个数组的方法。 如果你没有注意过这个问题,那么这个标题应该会让你感到困惑,判断数据类型这么基础的问题能有什么坑呢? 少年,你不能太天真了,我们朝夕面对的这门语言,可是JavaSc...

    kohoh_ 评论0 收藏0
  • javascript判断一个对象是否数组

    摘要:多个窗口意味着多个全局环境,不同的全局环境拥有不同的全局对象,从而拥有不同的内置类型构造函数。这可能会引发一些问题。上面我们提到使用原生的方法来判断值是否为数组的实例。这也意味着不是一个十分可靠的识别对象类型的方式。 在JavaScript中,可以通过typeof操作符来判断基本数据类型(Undefined、Null、Boolean、Number和String),同时相信大家也熟知ty...

    BearyChat 评论0 收藏0
  • javascript 判断变量是否数组(Array)

    摘要:过完春节又有好多人寻找新的机会,旁边的人面试完就会分享一些问题,明明会的但是面试的时候,想不全,面试官不满意这个懊恼的行为,今天的文章跟大家分享下如何判断便是是数组。 过完春节又有好多人寻找新的机会,旁边的人面试完就会分享一些问题,明明会的但是面试的时候,想不全,面试官不满意...这个懊恼的行为,今天的文章跟大家分享下:javascript如何判断便是是数组。 1. typeof真的那...

    lyning 评论0 收藏0
  • javascript 判断变量是否数组(Array)

    摘要:过完春节又有好多人寻找新的机会,旁边的人面试完就会分享一些问题,明明会的但是面试的时候,想不全,面试官不满意这个懊恼的行为,今天的文章跟大家分享下如何判断便是是数组。 过完春节又有好多人寻找新的机会,旁边的人面试完就会分享一些问题,明明会的但是面试的时候,想不全,面试官不满意...这个懊恼的行为,今天的文章跟大家分享下:javascript如何判断便是是数组。 1. typeof真的那...

    RayKr 评论0 收藏0
  • javascript 判断变量是否数组(Array)

    摘要:过完春节又有好多人寻找新的机会,旁边的人面试完就会分享一些问题,明明会的但是面试的时候,想不全,面试官不满意这个懊恼的行为,今天的文章跟大家分享下如何判断便是是数组。 过完春节又有好多人寻找新的机会,旁边的人面试完就会分享一些问题,明明会的但是面试的时候,想不全,面试官不满意...这个懊恼的行为,今天的文章跟大家分享下:javascript如何判断便是是数组。 1. typeof真的那...

    RichardXG 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<