For*_*ood 4 javascript arrays type-conversion
我一直在玩javascript数组,我遇到了,我觉得,有些不一致,我希望有人可以为我解释.
让我们从这开始:
var myArray = [1, 2, 3, 4, 5];
document.write("Length: " + myArray.length + "<br />");
for( var i in myArray){
document.write( "myArray[" + i + "] = " + myArray[i] + "<br />");
}
document.write(myArray.join(", ") + "<br /><br />");
Run Code Online (Sandbox Code Playgroud)
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] + "<br />");
}
document.write(myArray.join(", ") + "<br /><br />");
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的两个非数字特性?
Chr*_*oph 12
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
Run Code Online (Sandbox Code Playgroud)
此外,通过循环迭代数组条目的不良做法for..in- 如果有人搞砸了一些原型(并且它也不是很快),你可能会得到意想不到的结果.请改用标准for(var i= 0; i < array.length; ++i).