我正在阅读Javascript,这是一本权威的指南,我偶然看到了一段话,我引用它。
如果索引数组的字符串恰好是非负整数,则它的行为是数组索引,而不是对象属性。
因此,像a["4"]这样的东西将存储在索引为5的地方,而像a["-1.26"]这样的东西将作为属性"1.26"存储。
我有点冒险性,尝试了a["02"] = 2;,现在我可以设置它,检索它,但是它既没有被设置为a[2] (基本上是a[parseInt("02")]),也不能在打印数组时得到它。
这是我的密码。我试着用节点和浏览器。
> a[3] = 3;
3
> a["-1.2"] = 10;
10
> a
[ , , , 3, '-1.2': 10 ]
> a["02"] = 2;
2
> a
[ , , , 3, '-1.2': 10 ]
> a["02"]
2
> a.length
4我只想知道到底发生了什么。
发布于 2013-08-11 17:46:31
从规格
属性名P(以字符串值的形式)是数组索引当且仅当ToString( ToUint32(P) )等于P和ToUint32(P)不等于2^32-1。
所以这本书是误导性的,因为它需要精确的整数,没有前导零等等。
因此,"02"被视为"hellokitty" --而不是任何意义上的索引属性。
考虑:
var P = "02"
console.log( ( P ) === ( ( +P >>> 0 ).toString() ) );
//false
var P = "2"
console.log( ( P ) === ( ( +P >>> 0 ).toString() ) );
//true这是一个函数
function isStringConsideredArrayIndex( P ) {
if( typeof P !== "string" ) throw new Error( "strings only" );
return ( (P >>> 0).toString() ) === P &&
( P >>> 0 ) !== ( Math.pow( 2, 32 ) - 1 );
}发布于 2013-08-11 17:39:13
主要要知道的是,您的“数组”实际上更像是一个映射(除了一些例外);
a = {}; // a is an empty object
a['02'] = 'foo';
a['2'] = 'bar';
console.log( a ); // { '02': 'foo', '2': 'bar' }如果a是一个数组,则同样适用,但打印的方式可能有所不同。例如,Google将只打印数组对象的类似数组的键(在本例中,您将看到[undefined, undefined, 'bar'] )。它仍然具有其他属性,但由于缺少更好的术语,它的“打印功能”只是显示类似数组的属性。
还有其他不同之处。数组具有某些属性,例如length (它将等于您定义的最大的数字索引+ 1)和各种操作函数('pop‘、'join’等等)。
正如已经指出的,如果索引可以被转换为无符号整数,则它被视为类似于数字的索引。也就是说,"2" -> 2 -> "2"没有什么损失,而"02" -> 2 -> "2"失去了领先的0。
要查看对象或数组中的所有内容的完整列表,可以使用以下内容(这将显示丢失的"02“键):
for(var i in a){
console.log(i,a[i])
}发布于 2013-08-11 17:38:19
在设置数组索引之前,JavaScript将在数组索引上运行以下函数:
function ToUint32(x) {
return x >>> 0;
}因此,只有数字或字符串是有效的数组索引。
索引还必须在0,2^32−1范围内。
如果一个字符串不是数字,则默认返回对象键。
https://stackoverflow.com/questions/18174701
复制相似问题