与 for 的结果混淆..在语句 JS 输出中
Confused with a result of a for...in statement JS output
我只是在测试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"循环将迭代命名属性,例如n1
、n2
等。嵌套循环期望第二个操作数是一个对象:i
应该是此表达式中的对象(j in i)
。但实际值是一个字符串(n1
、n2
、n2
)。因此,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 个字符的字符串。
但所有评论都是正确的。 别这样。 阅读他们提供的一些链接。
- 可以't让我的if语句处理js中的html表单输入
- Node.js-承诺和锥形语句(if、switch等)-如何构建
- 我们可以在一个js文件中有多个module.exports语句吗
- JS定义的方法仅在语句的一部分中等于NaN
- 为什么模块级返回语句在 Node.js 中有效
- Node.js Jade:在 JavaScript 中使用条件语句
- 简单的JS计算器-为什么不是'这个if语句不起作用
- Js提示:“;期望一个赋值或函数调用,而看到一个表达式“;,Switch语句
- js事件,用于函数内部的when语句变为true
- 如何在js中等待if语句内部的结果
- PHP、JS和带有if-else语句的代码点火器脚本
- JS-如果是语句运算符,这是怎么编译的
- 使用JS'更正语法;onclick'PHP echo语句中的函数与嵌入的XML获取进行AND
- 通过.js将值传递到php,然后在SQL语句中使用
- 如果其他语句层次结构 JS
- 为什么我的JS"如果“;语句的求值结果总是为false
- js 函数中的 if 语句不起作用
- 尝试从开关语句 -JS- 中的函数返回值
- 与 for 的结果混淆..在语句 JS 输出中
- 全局变量在if语句JS之外不可见