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