javascript - js数组in - 如何判断一个对象是否为数组




你如何检查一个变量是否是JavaScript中的数组? (16)

这个问题在这里已经有了答案:

我想检查一个变量是JavaScript中的数组还是单个值。

我找到了一个可能的解决方案...

if (variable.constructor == Array)...

这是可以做到的最好的方式吗?


w3schools

function isArray(myArray) {
    return myArray.constructor.toString().indexOf("Array") > -1;
}


你也可以使用:

if (value instanceof Array) {
  alert('value is Array!');
} else {
  alert('Not an array');
}

这对我来说似乎是一个非常优雅的解决方案,但是对于他自己来说。

编辑:

从ES5开始,现在还有:

Array.isArray(value);

但是,除非你使用polyfills(基本上...... IE8或类似的),否则这将在较旧的浏览器上打破。


在Crockford的JavaScript Good Part中 ,有一个函数来检查给定的参数是否为数组:

var is_array = function (value) {
    return value &&
        typeof value === 'object' &&
        typeof value.length === 'number' &&
        typeof value.splice === 'function' &&
        !(value.propertyIsEnumerable('length'));
};

他解释说:

首先,我们问这个价值是否真实。 我们这样做是为了拒绝null和其他falsy值。 其次,我们询问类型值是否是“对象”。 这对于对象,数组和(奇怪)null都是如此。 第三,我们询问该值是否具有数字的长度属性。 对于数组来说,这总是如此,但通常不适用于对象。 第四,我们询问该值是否包含拼接方法。 对于所有阵列来说,这也是如此。 最后,我们问长度属性是否可枚举(将由for循环产生长度?)。 这对所有阵列都是错误的。 这是我发现的最可靠的阵列测试。 不幸的是,它太复杂了。


如果你只处理EcmaScript 5及以上版本,那么你可以使用内建的Array.isArray函数

例如,

Array.isArray([])    // true
Array.isArray("foo") // false
Array.isArray({})    // false


当我发布这个问题时,我使用的JQuery版本没有包含isArray函数。 如果它有,我可能只是用它相信这个实现是执行这个特定类型检查的最佳浏览器独立方式。

既然JQuery现在提供了这个功能,我会一直使用它...

$.isArray(obj);

(从版本1.6.2开始)它仍然使用表单中字符串的比较来实现

toString.call(obj) === "[object Array]"

我个人喜欢Peter的建议: https://.com/a/767499/414784 : Array.isArray()对于ECMAScript 3.对于ECMAScript 5,请使用Array.isArray()

但是,对帖子的评论表明,如果toString()完全改变,那么检查数组的方式将失败。 如果你真的想要具体,并确保toString()没有被改变,并且对象类属性没有问题( [object Array]是一个数组对象的类属性),那么我建议做像这样的东西:

//see if toString returns proper class attributes of objects that are arrays
//returns -1 if it fails test
//returns true if it passes test and it's an array
//returns false if it passes test and it's not an array
function is_array(o)
{
    // make sure an array has a class attribute of [object Array]
    var check_class = Object.prototype.toString.call([]);
    if(check_class === '[object Array]')
    {
        // test passed, now check
        return Object.prototype.toString.call(o) === '[object Array]';
    }
    else
    {
        // may want to change return value to something more desirable
        return -1; 
    }
}

请注意,在JavaScript权威指南第六版7.10中,它说Array.isArray()是使用ECMAScript 5中的Array.isArray()实现的。另外请注意,如果您要担心toString() '如果实施方式发生变化,您也应该担心其他内置方法也在变化。 为什么使用push() ? 有人可以改变它! 这种做法很愚蠢。 上述检查是为那些担心toString()更改的人提供的解决方案,但我相信检查是不必要的。


我创建了一小段代码,可以返回真实类型。

我还不确定表现如何,但它是试图正确识别这种类型的表现。

https://github.com/valtido/better-typeOf在这里也有一点关于它的博客http://www.jqui.net/jquery/better-typeof-than-the-javascript-native-typeof/

它的工作原理类似于现在的类型。

var user = [1,2,3]
typeOf(user); //[object Array]

它认为它可能需要一些微调,并考虑到事情,我还没有碰到或测试过它。 所以欢迎进一步的改进,无论是性能方面,还是错误地重新移植typeOf。


我喜欢Brian的回答:

function is_array(o){
    // make sure an array has a class attribute of [object Array]
    var check_class = Object.prototype.toString.call([]);
    if(check_class === '[object Array]')    {
        // test passed, now check
        return Object.prototype.toString.call(o) === '[object Array]';
    } else{
        // may want to change return value to something more desirable
        return -1; 
    }
}

但你可以这样做:

return Object.prototype.toString.call(o) === Object.prototype.toString.call([]);

我注意到有人提到jQuery,但我不知道有一个isArray()函数。 事实证明,它是在1.3版本中添加的。

jQuery按照Peter的说法来实现它:

isArray: function( obj ) {
    return toString.call(obj) === "[object Array]";
},

已经对jQuery产生了很大的信心(特别是他们的跨浏览器兼容技术),我会升级到1.3版本并使用它们的功能(假设升级不会导致太多问题),或者直接在我的码。

非常感谢您的建议。


我认为使用myObj.constructor == Object和myArray.constructor == Array是最好的方法。 它比使用toString()快近20倍。 如果使用自己的构造函数扩展对象,并希望这些创建被视为“对象”,那么这不起作用,否则其方式更快。 typeof与构造函数方法一样快,但typeof [] =='object'返回true,这通常是不可取的。 http://jsperf.com/constructor-vs-tostring

有一件事要注意的是,null.constructor会抛出一个错误,所以如果你可能正在检查空值,你将不得不首先做(testThing!== null){}


有各种各样的怪癖的解决方案。 本页面提供了一个很好的概述。 一个可能的解决方案是

function isArray(o) {
  return Object.prototype.toString.call(o) === '[object Array]'; 
}

由于.length属性对于JavaScript中的数组非常特殊,因此您可以简单地说

obj.length === +obj.length // true if obj is an array

Underscorejs和其他几个库使用这个简单而简单的技巧。


通用解决方案如下:

Object.prototype.toString.call(obj)=='[object Array]'

从ECMAScript 5开始,一个正式的解决方案是:

Array.isArray(arr)

另外,对于旧的JavaScript库,你可以找到下面的解决方案,虽然它不够准确:

var is_array = function (value) {
    return value &&
    typeof value === 'object' &&
    typeof value.length === 'number' &&
    typeof value.splice === 'function' &&
    !(value.propertyIsEnumerable('length'));
};

解决方案来自http://www.pixelstech.net/topic/85-How-to-check-whether-an-object-is-an-array-or-not-in-JavaScript


通过Crockford

function typeOf(value) {
    var s = typeof value;
    if (s === 'object') {
        if (value) {
            if (value instanceof Array) {
                s = 'array';
            }
        } else {
            s = 'null';
        }
    }
    return s;
}

Crockford提到的主要失败是无法正确确定在不同的上下文中创建的数组,例如window 。 如果这个页面不够完善,那么这个页面会有更复杂的版本。





variables