我想爲數組分配一些屬性,但前提是它們是數組索引。否則,某些實現可能會將底層結構切換到哈希表,我不希望這樣。檢查屬性名稱是否爲數組索引
例如,這些數組索引:"0"
,"1"
,"2"
,"3"
,"4"
,"4294967294"
但這些都不是:"abcd"
,"0.1"
,"-0"
,"-1"
," 2"
,"1e3"
,"4294967295"
是有一種簡單的方法來測試一個字符串是否是一個數組索引?
我想爲數組分配一些屬性,但前提是它們是數組索引。否則,某些實現可能會將底層結構切換到哈希表,我不希望這樣。檢查屬性名稱是否爲數組索引
例如,這些數組索引:"0"
,"1"
,"2"
,"3"
,"4"
,"4294967294"
但這些都不是:"abcd"
,"0.1"
,"-0"
,"-1"
," 2"
,"1e3"
,"4294967295"
是有一種簡單的方法來測試一個字符串是否是一個數組索引?
在ECMAScript中5,Array indices定義如下:
屬性名稱P(在一個字符串值的形式)是一個陣列 索引當且僅當ToString(ToUint32( P))等於 P和ToUint32(P)不等於2 -1。
(該definition in ECMAScript 2015不同的措詞,但應該是等效的。)
然後,代碼將是
function isArrayIndex(str) {
return (str >>> 0) + '' === str && str < 4294967295
}
一步一步
ToUint32(P)可以通過將unsigned right shift operator
P >>> 0
的ToString(ToUint32(P))可通過用the addition operator串聯空字符串來完成。
(P >>> 0) + ''
的ToString(ToUint32(P))等於P可以與the strict equals operator進行檢查。
(P >>> 0) + '' === P
注意這也將確保P真的是一個字符串值的形式。
ToUint32(P)不等於2 -1可以與strict does-not-equal operator
(P >>> 0) !== 4294967295
檢查但是,一旦我們知道的ToString(ToUint32(P))等於P,執行下列操作之一應該是足夠了:
P !== "4294967295"
P < 4294967295