当前位置:  开发笔记 > 编程语言 > 正文

数组键号和"数字"意外地被认为是相同的

如何解决《数组键号和"数字"意外地被认为是相同的》经验,为你挑选了1个好方法。

我一直在玩javascript数组,我遇到了,我觉得,有些不一致,我希望有人可以为我解释.

让我们从这开始:

var myArray = [1, 2, 3, 4, 5];
document.write("Length: " + myArray.length + "
"); for( var i in myArray){ document.write( "myArray[" + i + "] = " + myArray[i] + "
"); } document.write(myArray.join(", ") + "

");
Length: 5
myArray[0] = 1
myArray[1] = 2
myArray[2] = 3
myArray[3] = 4
myArray[4] = 5
1, 2, 3, 4, 5

这段代码没有什么特别之处,但我知道javascript数组是一个对象,因此可能会向数组添加特性,这些特性添加到数组的方式似乎与我不一致.

在继续之前,让我注意如何在javascript中将字符串值转换为数字值.

非空字符串 - >字符串或NaN的数字值

空字符串 - > 0

因此,由于javascript数组是一个对象,以下是合法的:

myArray["someThing"] = "someThing";
myArray[""] = "Empty String";
myArray["4"] = "four";

for( var i in myArray){ document.write( "myArray[" + i + "] = " + myArray[i] + "
"); } document.write(myArray.join(", ") + "

");

Length: 5
myArray[0] = 1
myArray[1] = 2
myArray[2] = 3
myArray[3] = 4
myArray[4] = four
myArray[someThing] = someThing
myArray[] = Empty String
1, 2, 3, 4, four

输出是意外的.

设置属性myArray ["4"]时,非空字符串"4"将转换为其数值,这似乎是正确的.但是,空字符串""不会转换为其数字值0,它将被视为空字符串.此外,非空字符串"something"未转换为其数值NaN,它被视为字符串.那是哪个呢?是数字或字符串上下文中myArray []内的语句?

另外,为什么myArray.length和myArray.join(",")中不包含myArray的两个非数字特性?



1> Christoph..:

JavaScript数组的键实际上是字符串.有关任意键的详细信息和地图类型的实现,请查看此答案.


澄清并添加Jason发布的内容:JavaScript数组是对象.对象具有属性.属性名称是字符串值.因此,在更多事情发生之前,数组索引也会转换为字符串.如果以下属性(ECMA-262,15.4),属性名称P将被视为数组索引(即将调用特殊数组魔术):

ToString(ToUint32(P))等于P,ToUint32(P)不等于2 ^ 32 - 1

可以轻松验证数字索引将转换为字符串(而不是相反):

var array = [];
array[1] = 'foo';
array['1'] = 'bar';
array['+1'] = 'baz';
document.writeln(array[1]); // outputs bar

此外,通过循环迭代数组条目的不良做法for..in- 如果有人搞砸了一些原型(并且它也不是很快),你可能会得到意想不到的结果.请改用标准for(var i= 0; i < array.length; ++i).

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有