如何使用For-of循环更改数组中的对象? 以下代码:
let arr = ['a', 'b', 'c', 'd', 'e'];
for (let v of arr) {
if (v === 'c') {
v = 'f';
break;
}
}
console.log(arr);
我想找到第一个字母c并将其更改为f,但是arr并没有被更改,可能是因为它没有被引用?但是,arr的v不应该使对象v与arr中的对象相同吗?
答案 0 :(得分:3)
Javascript不会创建对简单值 Math.pow(2, 54) // 18014398509481984 (not rounded)
Math.pow(2, 54) + 1 // 18014398509481984 (rounded)
Math.pow(2, 54) - 1 // 18014398509481984 (rounded)
Math.pow(2,57) + Math.pow(2,52) // 148618787703226370 (not rounded)
Math.pow(2, 57) + Math.pow(2, 52) + 1 // 148618787703226370 (rounded)
的引用。要获取数组引用,您需要让数组成为像String
这样的对象数组。然后在迭代器中,您可以通过更改[{char : 'a'}, {char : 'b'}, ...]
属性
char
答案 1 :(得分:2)
v
不是对数组元素的引用,它只是一个赋予数组迭代器产生的值的变量。如果您为其分配,则仅变量v
会更改,但不会更改数组。
为此,您需要使用其索引显式引用该属性并为其分配:
let arr = ['a', 'b', 'c', 'd', 'e'];
for (let [i, v] of arr.entries()) {
if (v === 'c') {
arr[i] = 'f';
break;
}
}
console.log(arr); // ['a', 'b', 'f', 'd', 'e']
迭代器不提供改变底层结构的方法,你需要自己动手。
答案 2 :(得分:1)
详见MDN规范,let
从数组元素的副本声明一个新变量。因此,更改v
不会更改数组中的值。这由var
和const
共享,只是javascripts行为。创建新对象时,它将开始为空。
你的循环基本上是说“对于arr
中的每个元素,声明一个包含它的副本的变量,然后如果该变量是c
,则将该副本更改为f
”< / p>
答案 3 :(得分:0)
尝试
let arr = ['a', 'b', 'c', 'd', 'e'];
arr.splice(arr.indexOf('c'), 1, 'f');
答案 4 :(得分:0)
在更改"Create"
两者之前,数组和<input type="submit" class="btn btn-lg btn-primary" name="submit" value="Create" />
指向 - 或者在这种情况下具有 - 相同的值:
v
更改v
后,它有不同的值,但您没有更改数组:
arr[2] -> 'c' <- v
v
和arr[2] -> 'c' v -> 'f'
只是占位符,但不同的占位符。
答案 5 :(得分:0)
正确答案:
let arr = ['a', 'b', 'c', 'd', 'e'];
let i = 0;
for (let v of arr) {
if (v == 'c') {
arr[i] = 'f';
break;
}
i++;
}
console.log(arr);
: - P