|
|
|
|
|
在上一文中,介紹了JavaScript檢查對象是否數組的5種方法,不過未對它們的性能進行比較,本文將介紹,這5種方法中,哪種方法最好用?哪種方法運行起來是最快的?
有開發(fā)人員使用 jsPerf 比較了在 JavaScript 中檢查數組的各種方法,下面是得到的結果:
你如果對這幾種方法還不夠了解,請參看文章JavaScript檢查對象是否數組的5種方法。
結果顯示,Array.isArray()
和 .constructor
或者 instanceof
一樣快,但是 Object.prototype.toString.call([])
比較慢。
這個結果可能讓一些人比較失望,因為更多人使用的方法是 Object.prototype.toString.call([])
,而這種方法卻是最慢的。
結果顯示Array.isArray()
的速度是最快的,盡管你的個人偏好可能并不是它。
使用帶有空檢查的 .constructor
,運行速度排在倒數第二。
但是,如果你是 Object.prototype.toString.call([])
的粉絲,請不要擔心!差異表明,這種稍慢的方法仍然非??欤涸谖业募矣?PC 上每秒執(zhí)行超過 700,000,000 次操作。
因此,除非你進行數萬億次數組檢查,否則通過將任何一種方法換成另一種方法,你不會看到代碼速度的顯著差異。
因為關鍵字 typeof
為 null
和所有對象(包括數組)返回“object”,所以檢查數組需要另外的方法。
ES5 輔助方法 Array.isArray()
將快速簡單地告訴你任何 JavaScript 變量是否為數組: Array.isArray([])
// true
,它適用于 null
和 undefined
(但不適用于未聲明的變量)。
自 Internet Explorer 9 以來,所有瀏覽器都廣泛支持 Array.isArray()
方法,因為它是 ECMAScript 5 規(guī)范的一部分。
你可能會看到使用了 instanceof:[] instanceof Array
// true
,但不推薦使用 instanceof
,因為它在 iframe
中不起作用。
有幾種方法可用于檢查數組,因為它們可用于確定任何 JavaScript 對象的類型。
更通用的方法 Object.prototype.toString.call([])
// "[object Array]"
將告訴你任何值是什么類型的對象,包括原語。
為了只捕獲類型,可以使用 .slice()
處理該字符串: Object.prototype.toString.call([]).slice(8,-1)
// Array
同樣, .constructor
屬性將返回 JavaScript 值的構造函數。對于數組,這是內置的全局函數 Array()
。
該函數可以與全局對象進行比較,或者構造函數的 .name
屬性可以作為字符串訪問:[].constructor.name
// "Array"
。
但是,.constructor
的缺點是可以為其分配一個新值,從而否定你的數組檢查: [].constructor = 3
// 有效
關鍵字 typeof
不會將數組與其他對象區(qū)分開來,盡管 typeof
對于篩選出未聲明的變量仍然很有用。
當 typeof
關鍵字返回“object”時,我們知道變量已被聲明并分配了一個對象或一個空值。
同時,typeof
將為未聲明的變量返回“undefined
”而不是拋出 ReferenceError
,如果你認為你可能正在使用未聲明的變量,則首先檢查 typeof
很有用。
一旦我們知道變量是使用 typeof
聲明的(無論是 === "object
" 還是 !== "undefined
"),我們就可以確定地使用 Array.isArray()
。
最后,當我們確定我們有一個數組時(即當 Array.isArray()
返回 true
時),我們可以使用 .length
檢查數組是否為空。
.length
為 0 表示一個空的 JavaScript 數組 []
,而一個 .length > 0
的數組表示一個非空數組。
請注意,空數組 []
是真實的,這意味著它在評估為布爾值時返回 true
。([]
是真實的,因為所有對象都是真實的。)
我介紹了 5 種不同的檢查 JavaScript 數組的方法。我在編碼時通常使用 Array.isArray()
有幾個原因:
有時,在我擔心未聲明變量的罕見情況下,我會將數組檢查包含在 if(typeof !== "undefined")
語句中。
本文介紹了JavaScript檢查對象是否數組的幾種方法的速度比較,以及各種方法的優(yōu)點和缺點。在使用任何一種方法的時候,都應該考慮其存在的問題,以免判斷失準。
參考文章
相關文章