2011-03-17 84 views
4

我经常用这个代码,以确定如果数组是一个真正的数组...这是一个可接受的方式来确定一个对象是否是JavaScript中的数组?

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

如果有人覆盖您的全局数组变量,则存在问题。不太可能,但如果你想要一个真正的失败保险方法,坚持#1。

Demonstration on jsFiddle

+0

谢谢,但如果[我覆盖'Object'](http://jsfiddle.net/alexdickson/dQA2m/1/)会发生同样的情况吗? – alex 2011-03-17 08:41:53

+0

难道你不能轻易重写'Object.toString'吗? - 'Object.prototype.toString = function(){return“:-)”;}' - Demo:http://jsbin.com/awixe4。我怀疑JavaScript是疯了。 – Kobi 2011-03-17 08:43:25

+0

有** **无故障安全方法 – Alnitak 2011-03-17 09:13:42

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正在使用你的第一种方法od,并进行广泛的测试。

3

在ES5您可以拨打:

Array.isArray(obj); 

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

又见their note,他们说,一个纯粹的Javascript实现不可能的原生代码版本保证100%仿真。

+0

从最新的Chrome的快速测试中,我可以编写'Array.isArray = function(){return false;}'。这是否真的解决了这个问题?或者应该不可能? (我不是新的JavaScript大,所以这是非常有可能的,我错过了一些基本的事实) – Kobi 2011-03-17 09:23:29

+0

有趣 - 我本来期望他们做的是功能不变 – Alnitak 2011-03-17 10:35:00

0

没有与方法没有问题

array instanceof Array 

您可以使用功能

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

如果查看参宿一的回答非常有趣的联系,你”会看到它并不适用于所有情况,当'mixed_var'来自另一个窗口,被称为“Pfui”的场景等。 – Kobi 2011-03-17 09:15:33

+0

感谢您的评论,这是一个有趣的问题.. – Andrei 2011-03-17 09:27:37

0

另一种方法是内线做它的方式:

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

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

相关问题