与 for 的结果混淆..在语句 JS 输出中

Confused with a result of a for...in statement JS output

本文关键字:语句 JS 输出 for 结果      更新时间:2023-09-26

我只是在测试Java脚本...在(只是一个新手:P :D)。

我尝试了以下代码:

var arr=[];
arr['n1']='name1';
arr['n2']='name2';
arr['n3']='name3';
arr['n4']='name4';
var i,j;
for(i in arr)
{
    for(j in i)
        document.writeln(j+"-");
}

输出为:

0- 1- 0- 1- 0- 1- 0- 1-

我想知道为什么我会得到这样的输出。

为...in 循环中,如果尝试输出"i"而不是"j",我将获得索引名称。

当我检查"j"的类型时,我将其作为字符串。

请帮助我理解输出。

Javascript 没有关联数组。
您不能以这种方式填充常规数组:arr['n1']='name1'; .

如果使用命名索引,JavaScript 会将数组重新定义为标准对象。之后,所有数组方法和属性将 产生不正确的结果

var arr=[];
arr['n1']='name1';
arr['n2']='name2';
arr['n3']='name3';
arr['n4']='name4';
var x = arr.length;         // arr.length will return 0
var y = arr[0];             // arr[0] will return undefined

至于 for-in 循环 - 这个循环有一个非常特殊的目的:它枚举任何对象的命名属性。

for(i in arr)
{
    for(j in i)
        document.writeln(j+"-");
}

"parent"循环将迭代命名属性,例如n1n2等。嵌套循环期望第二个操作数是一个对象:i应该是此表达式中的对象(j in i)。但实际值是一个字符串(n1n2n2)。因此,Javascript 将在幕后的每次迭代中为每个字符串创建原始包装器对象:

...
for(j in i) // actually would be (for j in new Object('n1'))
   // console.log(new Object('n1'));
   // String {0: "n", 1: "1", length: 2, [[PrimitiveValue]]: "n1"}
   document.writeln(j+"-");
...

如您所见,基元包装器对象对于每个字符串有两个"编号"属性。这就是它给你输出的方式:

0- 1- 0- 1- 0- 1- 0- 1- 

这就是你的代码的工作方式,

var arr=[];
arr['n1']='name1';
arr['n2']='name2';
arr['n3']='name3';
arr['n4']='name4';
var i,j;
for(i in arr) {
 // i will be the keys, n1,n2,n3,n4
 // And those keys are strings.
 // You are traversing over the enumerable properties of strings "n1","n2"..
 // So enumerable property of "n1" will be 0 and 1. 
 // So it is getting printed in the internal loop
 for(j in i) {
  document.writeln(j+"-");
 }
}
最好

不要将 for 与数组一起使用,因为它将遍历整个原型链中的所有可枚举属性。请改用简单的 for 循环。或者只是使用 .hasOwnProperty() 来确保可枚举属性属于即时/自己的原型链。

每个人似乎都想回答一个你没有问过的问题。 所以这是你问题的答案。

当您用于..在数组中,您只会获得数组键。 在您的情况下为"n1"、"n2"等。

当您用于..在字符串中,您将获得该字符串的索引。 在你的例子中,你有一堆两个字符串,所以你会得到0和1。

要了解发生了什么,请尝试以下操作:

for (i in 'test') {
    console.log(i)
}

输出: 0 1 2 3

因为它是一个 4 个字符的字符串。

但所有评论都是正确的。 别这样。 阅读他们提供的一些链接。