[英]Differentiating between arrays and “hashes” in Javascript
為了使我的一個函數的語法更好,我需要能夠判斷一個特定的參數是一個數組還是“哈希”(我知道它只是對象)。
Typeof不起作用,因為它們都返回相同的東西
typeof {foo:"bar"} // Object
typeof ["foo","bar"] // Object
那么我如何區分這兩者呢?
我知道這有效 ,但我希望有更好的方法
({foo:"bar"}).constructor // Object()
(["foo","bar"]).constructor // [ undefined ]
編輯啊,似乎[firebug中的[undefined]與Array是一樣的。 有點奇怪。
你可以像SLaks建議的那樣檢查長度屬性,但是一旦你傳遞了一個函數對象,你就會感到驚訝,因為它實際上有一個length屬性。 此外,如果對象定義了一個length屬性,你將再次得到錯誤的結果。
你最好的選擇可能是:
function isArray(obj) {
return Object.prototype.toString.call(obj) === "[object Array]";
}
jQuery使用它,還有一對“其他人”...... :)
它比實例方式更失敗。 以下文章還建議了該方法:
'instanceof'被認為是有害的(或者如何編寫一個強大的'isArray') (@ kagax)
另外要補充一點,這個函數幾乎與ES 5規范中的Array.isArray
函數相同:
15.4.3.2 Array.isArray(arg)
- 如果Type( arg )不是Object,則返回false 。
- 如果arg的[[Class]]內部屬性的值是“Array” ,則返回true 。
- 返回false 。
something instanceof Array
在單個文檔中工作正常,但如果您開始在不同窗口之間傳遞數組,則會失敗,因為一個窗口中的Array
與另一個窗口中的Array
不同。 如果你不打算做跨窗口腳本(一般來說,值得避免),我建議堅持這一點。
如果您需要跨窗口支持,事情就會復雜一些。 在未來,故事很簡單,因為ECMAScript第五版定義了一個函數來完成這個:
Array.isArray([1]); // -> true
您應該使用此功能,因為它是唯一可靠且標准認可的方式。 但是,今天的許多瀏覽器還不支持它。
在它不可用的地方你必須依賴於Object#toString
序列化,這是一種丑陋且略顯狡猾的。 雖然它通常可以與當今的瀏覽器一起可靠地工作,但是可以想象它可能不會(主要與宿主對象有關)。
您可以在不支持它的瀏覽器上將此回退方法破解為Array
,然后Array.isArray
使用Array.isArray
:
if (!('isArray' in Array)) {
Array.isArray= function(o) {
return Object.prototype.toString.call(o)==='[object Array]';
};
}
至於constructor
,永遠不要使用它。 它並非在任何地方都可用,它沒有按照您的想法行事。 使用它幾乎總是一個錯誤。
我認為最優雅的方法是簡單地使用instanceof
運算符:
if (myVar instanceof Array)
doSomething();
例子:
[] instanceof Array // true
{} instanceof Array // false
{length:100} instanceof Array // false
null instanceof Array // false
請注意,從另一個iFrame測試對象時它會失敗(請參閱@galambalazs和@bobince的答案)
檢查length
屬性:
"length" in {foo:"bar"} //false
"length" in ["foo","bar"] //true
此類型的函數用於更正typeof運算符的數組/對象碰撞以及 null / object碰撞。 但是它不能跨框架或跨窗口工作。 請參閱源代碼以獲取適用於這些版本的更高級版本。
function typeOf(value) {
var s = typeof value;
if (s === 'object') {
if (value) {
if (value instanceof Array) {
s = 'array';
}
} else {
s = 'null';
}
}
return s;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.