排序数组后JavaScript返回数值而不是字符串

mla*_*717 6 javascript arrays sorting

我正在进行一项练习,其中提示用户输入名称列表,将名称列表存储在数组中,按升序对数组进行排序,并打印名称列表(每行一个).当我这样做时,我看到显示的数值而不是每行一个名称.为什么会这样?

var namesArray = [];

do {
  var names = prompt("Enter a name: ");
  namesArray.push(names);
} while (names != "")

namesArray.sort();

for (var name in namesArray) {
  document.write(name);
}
Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 8

当您使用此构造时:

for (var name in namesArray) {
Run Code Online (Sandbox Code Playgroud)

name将是数组中的索引(属性名称).如果您想要数组中的实际值,则必须使用该属性名称/索引来获取值:

document.write(namesArray[name]);
Run Code Online (Sandbox Code Playgroud)

当然,你真的不应该首先以这种方式迭代数组,因为它会迭代数组对象的所有可枚举属性(可能包括非数组元素),如本例所示.相反,您应该使用传统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]);
    }
Run Code Online (Sandbox Code Playgroud)

迭代数组的其他选项:

namesArray.forEach(function(value) {
    document.write(value)
});
Run Code Online (Sandbox Code Playgroud)

或者,在ES6中,您可以使用for/of语法,该语法实际上与您尝试使用for/in的方式有关:

for (let value of namesArray) {
    document.write(value);
}
Run Code Online (Sandbox Code Playgroud)

您还可能希望了解document.write()在已经解析并加载文档之后使用将导致浏览器清除当前文档并启动新文档.我不知道这个代码适合的更大的上下文,但这可能会导致你的问题.