javascript - javascript 对象被覆盖
问题描述
我正在尝试获取用户输入并将值推送到数组。但是该数组只是将输入的最后一个值复制到所有先前的值。不知道我哪里错了。
var arrTest = [];
var objTest = {};
var inputName = prompt("Enter name");
var inputValue = prompt("Enter value");
while (inputName.length > 0 && inputValue > 0) {
objTest.name = inputName;
objTest.value = inputValue;
arrTest.push(objTest);
inputName = prompt("Enter name");
inputValue = prompt("Enter value");
}
printDetails(arrTest);
}
function printDetails(arrN){
var vOutput = ""
for(var vIndex = 0; vIndex < arrN.length ; vIndex++){
vOutput = vOutput +" Name: " + arrN[vIndex].name+ " Value :" + dogN[vIndex].value+ ";
}
document.getElementById("output").innerHTML=vOutput;
}
如果只输入 1 个值 test 1,则输出为
名称:测试值:1
如果只输入 2 个值测试 1,最好 2 输出是
名称:最佳价值:2 名称:最佳价值:2
我的期望是值应该是:
名称:测试值:1 名称:最佳值:2
我究竟做错了什么?
解决方案
观察到的行为的原因是,当您调用时,arrTest.push(objTest)
您实际上是在向数组添加对对象的引用,而不是对象本身。然后,当您更改对象并再次推送它时,您正在添加对同一对象的另一个引用,该对象随后仅包含更新的值。
您可以通过根本不使用变量来解决这个问题:
while (inputName.length > 0 && inputValue > 0) {
arrTest.push({ name: inputName, value: inputValue });
inputName = prompt("Enter name");
inputValue = prompt("Enter value");
}
您可以在循环内定义对象,这样您就不用处理引用的对象:
while (inputName.length > 0 && inputValue > 0) {
const objTest = {}
objTest.name = inputName;
objTest.value = inputValue;
arrTest.push(objTest);
inputName = prompt("Enter name");
inputValue = prompt("Enter value");
}
使用新的扩展语法,您甚至可以实现类似这样的东西,您可以在其中使用变量,在循环之外定义它,但仍然不能像这样使用引用:
while (inputName.length > 0 && inputValue > 0) {
objTest.name = inputName;
objTest.value = inputValue;
arrTest.push({ ...objTest });
inputName = prompt("Enter name");
inputValue = prompt("Enter value");
}
推荐阅读
- apache-camel - 当大量消息连续失败时暂停 Camel 消费者
- python - 是否可以更改 Tkinter 中每个菜单选项的字体
- swiftui - mapType SwiftUI 按钮/SegmentedControl
- javascript - 如何在 Javascript 中创建构造函数类的实例?
- c# - 检测鼠标右键单击WPF中的NotifyIcon
- python - deluge 是如何为 windows 打包的?
- java - Java 中的 K8s pod 数量
- selenium-webdriver - 如何在 JUnit 5 中参数化 beforeEach()?
- angularjs - 如何选择 ng-option 选择 angularjs?
- jquery - 如何使用 Jquery 在单击按钮时隐藏 div