gpt4 book ai didi

javascript - 实例化并推送新对象后,数组中的每个对象都会被覆盖

转载 作者:行者123 更新时间:2023-11-30 20:04:14 24 4
gpt4 key购买 nike

我正在尝试根据用户输入创建一个对象数组。

对象被插入数组,但在下一步输入覆盖数组中的每个对象。

我试过传递 category.value 并且效果很好,但我想传递整个类别。

例如:

  1. 选择 A,提交,输出 - “a”(如预期)
  2. 选择 B,提交,输出 - "b","b"(expected "a","b")

为什么会这样?

let form = document.getElementById('form');

let category = form.category;

let submit = document.getElementById('formSubmit');

let arr = [];

submit.addEventListener("click",(e)=>{
e.preventDefault();

let c = new C(category);

arr.push(c);

for(let i=0;i<arr.length;i++)
{
console.log(arr[i].category.value);
}
})



class C {
constructor(category)
{
this.category = category;
}

}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>

<form id="form">
<select name="category">
<option value="-">choose category</option>
<option value="a">A</option>
<option value="b">B</option>
<option value="c">C</option>
</select>
<button id="formSubmit" type="submit">submit</button>

</form>

<script src="test.js"></script>
</body>
</html>

最佳答案

在您的代码让类别中是对您选择的 HTML 元素(而不是 Javascript 对象)的直接引用。此引用被插入数组。每次您请求该值时,您都会直接从您的选择中获取值属性。因此它每次都会更新。

如果你想要一个带有值的 Javascript 对象,你必须构造一个并将它提供给你的类:

let form = document.getElementById('form');

let category = form.category;

let submit = document.getElementById('formSubmit');

let arr = [];

submit.addEventListener("click",(e)=>{
e.preventDefault();

let c = new C({ value: category.value });

arr.push(c);

for(let i=0;i<arr.length;i++)
{
console.log(arr[i].category.value);
}
})



class C {
constructor(category)
{
this.category = category;
}

}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>

<form id="form">
<select name="category">
<option value="-">choose category</option>
<option value="a">A</option>
<option value="b">B</option>
<option value="c">C</option>
</select>
<button id="formSubmit" type="submit">submit</button>

</form>

<script src="test.js"></script>
</body>
</html>

请注意,它之所以有效,是因为 Javascript 中的字符串是按值传递的,而对象是按引用传递的(实际上是引用的值)。如果您有一个更新了值并将其插入数组的全局类别对象,您会遇到同样的问题:

let form = document.getElementById('form');

let category = form.category;

let categoryObj = { value: null };

let submit = document.getElementById('formSubmit');

let arr = [];

submit.addEventListener("click",(e)=>{
e.preventDefault();

categoryObj.value = category.value;
let c = new C(categoryObj);

arr.push(c);

console.log('same problem you had because all items in the array are the same reference to the global object!');
for(let i=0;i<arr.length;i++)
{
console.log(arr[i].category.value);
}
})



class C {
constructor(category)
{
this.category = category;
}

}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>

<form id="form">
<select name="category">
<option value="-">choose category</option>
<option value="a">A</option>
<option value="b">B</option>
<option value="c">C</option>
</select>
<button id="formSubmit" type="submit">submit</button>

</form>

<script src="test.js"></script>
</body>
</html>

关于javascript - 实例化并推送新对象后,数组中的每个对象都会被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53083737/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com