我想为数组分配一些属性,但前提是它们是数组索引。否则,某些实现可能会将底层结构切换到哈希表,我不希望这样。
例如,这些是数组索引:"0"
,"1"
,"2"
,"3"
,"4"
,"4294967294"
但这些不是:"abcd"
,"0.1"
,"-0"
,"-1"
," 2"
,"1e3"
,"4294967295"
< / p>
是否有一种简单的方法可以测试字符串是否为数组索引?
答案 0 :(得分:6)
在ECMAScript 5中,Array indices定义如下:
属性名称 P (以String值的形式)是数组 索引当且仅当ToString(ToUint32( P ))等于 P 和ToUint32( P )不等于2 32 -1。
(definition in ECMAScript 2015的措辞不同,但应该是等效的。)
然后,代码将是
function isArrayIndex(str) {
return (str >>> 0) + '' === str && str < 4294967295
}
一步一步,
ToUint32( P )可以通过使用unsigned right shift operator
移位0位来完成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 32 -1可以使用strict does-not-equal operator检查
(P >>> 0) !== 4294967295
但是一旦我们知道ToString(ToUint32( P ))等于 P ,以下之一就足够了:
P !== "4294967295"
P < 4294967295