2016-07-02 52 views
2

我想爲數組分配一些屬性,但前提是它們是數組索引。否則,某些實現可能會將底層結構切換到哈希表,我不希望這樣。檢查屬性名稱是否爲數組索引

例如,這些數組索引:"0""1""2""3""4""4294967294"

但這些都不是:"abcd""0.1""-0""-1"" 2""1e3""4294967295"

是有一種簡單的方法來測試一個字符串是否是一個數組索引?

回答

6

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

屬性名稱P(在一個字符串值的形式)是一個陣列 索引當且僅當ToStringToUint32P))等於 PToUint32P)不等於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