我经常使用此代码来确定数组是否真的是一个数组......
Object.prototype.toString.call(array) == '[object Array]'
我最近开始将我的回调测试从typeof callback == 'function'
更改为callback instanceof Function
,因为我读到Safari和Chrome会告诉你正则表达式字面值是使用前者的函数(当我测试它时它会这样做) )。
现在,我决定检查这段代码,看看我是否可以替换上面的详细代码......
array instanceof Array
有效。
Comparison of both on jsFiddle
那么,后一种方法有什么问题吗?我认为可能是因为第一个代码示例在Google中出现得更频繁。
答案 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。
答案 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函数的对象(并且不是一个数组),那么这会失败,但是你可能不应该首先这样做。