Ori*_*iol 2 javascript arrays indexing
我想为数组赋予一些属性,但前提是它们是数组索引.否则一些实现可能会将底层结构切换到哈希表,我不希望这样.
例如,这些是数组索引:"0","1","2","3","4","4294967294"
但这些都不是:"abcd","0.1","-0","-1"," 2","1e3","4294967295"
有没有一种简单的方法来测试字符串是否是数组索引?
在ECMAScript 5中,Array索引定义如下:
当且仅当ToString(ToUint32(P))等于 P且ToUint32(P)不等于2 32 -1时,属性名P(以String值的形式)是数组索引.
(ECMAScript 2015中的定义措辞不同,但应该是等效的.)
然后,代码将是
function isArrayIndex(str) {
return (str >>> 0) + '' === str && str < 4294967295
}
Run Code Online (Sandbox Code Playgroud)
一步步,
ToUint32(P)可以通过使用无符号右移运算符移位0位来完成
P >>> 0
Run Code Online (Sandbox Code Playgroud)ToString(ToUint32(P))可以通过将空字符串与加法运算符连接来完成.
(P >>> 0) + ''
Run Code Online (Sandbox Code Playgroud)的ToString(ToUint32(P))等于P可与被检查的严格等于运算符.
(P >>> 0) + '' === P
Run Code Online (Sandbox Code Playgroud)
请注意,这也将确保P确实是String值的形式.
ToUint32(P)不等于2 32 -1可以使用strict does-not-equal运算符进行检查
(P >>> 0) !== 4294967295
Run Code Online (Sandbox Code Playgroud)
但是一旦我们知道ToString(ToUint32(P))等于P,下面的一个就足够了:
P !== "4294967295"
P < 4294967295
Run Code Online (Sandbox Code Playgroud)