这是一种可接受的方法来确定对象是否是JavaScript中的数组?

时间:2011-03-17 07:27:48

标签: javascript types

我经常使用此代码来确定数组是否真的是一个数组......

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

我最近开始将我的回调测试从typeof callback == 'function'更改为callback instanceof Function,因为我读到Safari和Chrome会告诉你正则表达式字面值是使用前者的函数(当我测试它时它会这样做) )。

现在,我决定检查这段代码,看看我是否可以替换上面的详细代码......

array instanceof Array

有效。

Comparison of both on jsFiddle

那么,后一种方法有什么问题吗?我认为可能是因为第一个代码示例在Google中出现得更频繁。

6 个答案:

答案 0 :(得分:3)

在ES5中,您可以致电:

Array.isArray(obj);

请参阅https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray

另请参阅their note,他们说纯Javascript实现不能保证100%仿真本机代码版本。

答案 1 :(得分:2)

如果有任何帮助,这就是在jQuery.isArray中完成的方式:

isArray: Array.isArray || function( obj ) {
    return jQuery.type(obj) === "array";
}

type: function( obj ) {
    return obj == null ?
             String( obj ) :
             class2type[ toString.call(obj) ] || "object";
}

的toString:

toString = Object.prototype.toString

class2type是一个关联数组,初始化为:

jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "),
             function(i, name) {
                 class2type[ "[object " + name + "]" ] = name.toLowerCase();
             });

如果有任何迹象,jQuery正在使用您的第一种方法,并对其进行广泛测试。

答案 2 :(得分:2)

对数组使用instanceof的两个问题是:

  • 当数组来自另一个窗口或框架时返回false
  • 如果Array构造函数被覆盖则中断

以下是kangax的一篇文章,我第一次看到你的第一个技术(也用于jQuery):http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/

答案 3 :(得分:0)

如果有人覆盖您的全局数组变量,则会出现问题。相当不太可能,但如果你想要一个非常安全的方法,坚持#1。

Demonstration on jsFiddle

答案 4 :(得分:0)

方法

没有问题
array instanceof Array

你可以使用功能

function is_array( mixed_var ) {    // Finds whether a variable is an array
    return ( mixed_var instanceof Array );
}

答案 5 :(得分:0)

另一种选择是Ext的方式:

function isArray (obj) {
    return obj != null && typeof obj == 'object' && 'splice' in obj && 'join' in obj;
}

这依赖于检查拼接和连接的存在。两个应该只在数组中的函数。当然,如果你传递了一个具有splice和join函数的对象(并且不是一个数组),那么这会失败,但是你可能不应该首先这样做。