检查属性名称是否为数组索引

时间:2016-07-02 19:11:47

标签: javascript arrays indexing

我想为数组分配一些属性,但前提是它们是数组索引。否则,某些实现可能会将底层结构切换到哈希表,我不希望这样。

例如,这些是数组索引:"0""1""2""3""4""4294967294"

但这些不是:"abcd""0.1""-0""-1"" 2""1e3""4294967295" < / p>

是否有一种简单的方法可以测试字符串是否为数组索引?

1 个答案:

答案 0 :(得分:6)

在ECMAScript 5中,Array indices定义如下:

  

属性名称​​ P (以String值的形式)是数组   索引当且仅当ToStringToUint32 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