我一直在玩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的两个非数字特性?
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)
.