我正在进行一项练习,其中提示用户输入名称列表,将名称列表存储在数组中,按升序对数组进行排序,并打印名称列表(每行一个)。当我这样做时,我看到显示的数值而不是每行一个名称。为什么会这样?
var namesArray = [];
do {
var names = prompt("Enter a name: ");
namesArray.push(names);
} while (names != "")
namesArray.sort();
for (var name in namesArray) {
document.write(name);
}
答案 0 :(得分:8)
使用此构造时:
for (var name in namesArray) {
name
的值将是数组中的索引(属性名称)。如果您想要数组中的实际值,则必须使用该属性名称/索引来获取值:
document.write(namesArray[name]);
当然,你真的不应该首先以这种方式迭代数组,因为它会迭代数组对象的所有可枚举属性(可能包括非数组元素),正如你在this example中看到的那样。相反,您应该使用传统的for
循环,如下面的代码示例所示:
var namesArray = [];
do {
var names = prompt("Enter a name: ");
namesArray.push(names);
} while (names != "")
namesArray.sort();
for (var i = 0; i < namesArray.length; i++) {
document.write(namesArray[i]);
}
迭代数组的其他选项:
namesArray.forEach(function(value) {
document.write(value)
});
或者,在ES6中,您可以使用for/of syntax,它实际上与您尝试使用for / in的方式有关:
for (let value of namesArray) {
document.write(value);
}
您还可能希望了解在已经解析并加载文档后使用document.write()
将导致浏览器清除当前文档并启动新文档。我不知道这段代码适合的更大的上下文,但这可能会给你带来问题。
答案 1 :(得分:2)
首先,在for..in循环中,此处name
代表键而不是数组中的值(您应该使用namesArray[name]
)
另外还有一点需要注意。建议不要使用for..in来循环数组,如果是这样,你应该这样做:
for (var key in array) {
if (array.hasOwnProperty(key)) {
// then do stuff with array[key]
}
}
循环数组的常用首选方法如下:
for plain for循环
for (var i = 0, l = array.length; i < l; i++) {
// array[i]
}
或更高阶函数Array.prototype.forEach(IE9 +,如果你需要与IE竞争)
array.forEach(function (item) {
// do something with the item
});