首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >javascript数组如何存储诸如"02“这样的键?

javascript数组如何存储诸如"02“这样的键?
EN

Stack Overflow用户
提问于 2013-08-11 17:30:45
回答 3查看 167关注 0票数 3

我正在阅读Javascript,这是一本权威的指南,我偶然看到了一段话,我引用它。

如果索引数组的字符串恰好是非负整数,则它的行为是数组索引,而不是对象属性。

因此,像a["4"]这样的东西将存储在索引为5的地方,而像a["-1.26"]这样的东西将作为属性"1.26"存储。

我有点冒险性,尝试了a["02"] = 2;,现在我可以设置它,检索它,但是它既没有被设置为a[2] (基本上是a[parseInt("02")]),也不能在打印数组时得到它。

这是我的密码。我试着用节点和浏览器。

代码语言:javascript
复制
> 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

我只想知道到底发生了什么。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-11 17:46:31

从规格

属性名P(以字符串值的形式)是数组索引当且仅当ToString( ToUint32(P) )等于P和ToUint32(P)不等于2^32-1。

所以这本书是误导性的,因为它需要精确的整数,没有前导零等等。

因此,"02"被视为"hellokitty" --而不是任何意义上的索引属性。

考虑:

代码语言:javascript
复制
var P = "02"
console.log( ( P ) === ( ( +P >>> 0 ).toString() ) );
//false

var P = "2"
console.log( ( P ) === ( ( +P >>> 0 ).toString() ) );
//true

这是一个函数

代码语言:javascript
复制
function isStringConsideredArrayIndex( P ) {
    if( typeof P !== "string" ) throw new Error( "strings only" );
    return ( (P >>> 0).toString() ) === P && 
        ( P >>> 0 ) !== ( Math.pow( 2, 32 ) - 1 );
}
票数 3
EN

Stack Overflow用户

发布于 2013-08-11 17:39:13

主要要知道的是,您的“数组”实际上更像是一个映射(除了一些例外);

代码语言:javascript
复制
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“键):

代码语言:javascript
复制
for(var i in a){
    console.log(i,a[i])
}
票数 1
EN

Stack Overflow用户

发布于 2013-08-11 17:38:19

在设置数组索引之前,JavaScript将在数组索引上运行以下函数:

代码语言:javascript
复制
    function ToUint32(x) {
        return x >>> 0;
    }

因此,只有数字或字符串是有效的数组索引。

索引还必须在0,2^32−1范围内。

如果一个字符串不是数字,则默认返回对象键。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18174701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档