2011-03-17 63 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的函數(而不是數組),那麼這會失敗,但是你可能不應該這樣做。

相關問題