这种方式在JavaScript中确定一个对象是否为数组是可接受的吗?

4

我经常使用这段代码来确定数组是否为真正的数组...

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

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

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

array instanceof Array

它起作用了。

在jsFiddle上进行比较

那么,后一种方法是否存在任何问题?我认为可能存在问题,因为第一个代码示例在Google中出现得更多。

6个回答

3

从最新的Chrome快速测试中,我可以编写Array.isArray = function(){return false;}。那真的解决了问题吗?或者这不可能吗?(我对新的JavaScript不是很熟悉,所以很可能我错过了一些基本事实) - Kobi
有趣 - 我本来以为他们会将那个函数设为不可变的。 - Alnitak

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

0

该方法没有任何问题

array instanceof Array

你可以使用函数

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

如果您查看Alnitak答案中非常有趣的链接,您会发现它并不适用于所有情况,例如当mixed_var来自另一个窗口时,这被称为“Pfui”场景。 - Kobi

0

另一种选择是Ext的方式:

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

这依赖于检查splice和join的存在。这两个函数应该只在数组中出现。当然,如果您传递了一个具有名为splice和join的函数(并且不是数组)的对象,则此方法将失败,但是您可能本来就不应该这样做。


0

如果有人覆盖了你的全局数组变量,那么就会出现问题。虽然这种情况不太可能发生,但如果你想要一个真正安全的方法,就坚持使用#1。

在jsFiddle上演示


谢谢,但是如果我覆盖了Object,那么同样的事情不也会发生吗? - alex
你不能轻易地覆盖 Object.toString 吗? - Object.prototype.toString = function(){return ":-)";} - 演示:http://jsbin.com/awixe4 。我怀疑 JavaScript 是疯了。 - Kobi
没有绝对可靠的方法。 - Alnitak
1
@alex 如果你覆盖了 Object,所有的JS开发者都会找到你并批评你。 - Raynos
@Raynos 我只是举个例子。 - alex
@alex,这种情况绝不能发生,就像 window.undefined = true 或者 window.$ = window.jQuery = function() { return null; } 一样。 - Raynos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接