索引为Number.MAX_VALUE的Javascript数组

时间:2017-03-12 06:47:44

标签: javascript arrays

任何人都可以解释一下javascript数组的这种行为

//create an empty array
var arr=[];

//added an entry with index Number.MAX_VALUE
arr[Number.MAX_VALUE]="test"

//On printing the array, its showing as empty
arr
//[]

//even its length=0
arr.length
//0

//on accessing the same value its showing the correct value
arr[Number.MAX_VALUE]
//"test"

我用Number.MIN_VALUE尝试了这个。

有人知道背后的原因吗?

2 个答案:

答案 0 :(得分:7)

Number.MAX_VALUE不是有效的数组索引。 According to the spec:

  

整数索引是一个字符串值属性键,它是一个规范数字字符串(见7.1.16),其数值为+0或正整数≤2 53 -1。 数组索引是整数索引,其数值i在+0≤i<1的范围内。 2 32 -1。

根据此定义,不是数组索引的任何属性名称只是一个常规属性名称,您可以通过键排序看到(数组索引按顺序排列;其他属性按插入顺序排列):

var a = {};
a.prop = 'foo';
a[2 ** 32 - 2] = 'bar';
a[Number.MAX_VALUE] = 'baz';
console.log(Object.keys(a));
// ["4294967294", "prop", "1.7976931348623157e+308"]

答案 1 :(得分:-1)

Number.MAX_VALUE不像索引,而是属性名称。 您可以看到任何字符串值的相同行为

  

属性名称P(以字符串的形式)   当且仅当ToString(ToUint32(P))等于P且ToUint32(P)不等于(2 ^ 32)-1

时才是数组索引

http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%201st%20edition,%20June%201997.pdf第65页,第15.4节)