Javascript 如何更改for of循环中的元素

Javascript 如何更改for of循环中的元素,javascript,for-loop,ecmascript-6,Javascript,For Loop,Ecmascript 6,如何使用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中的对象v相同吗?如规范中所述,让从数组元

如何使用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中的对象v相同吗?

如规范中所述,
从数组元素的副本声明一个新变量。因此,更改
v
不会更改数组中的值。这是由
var
const
共享的,只是javascripts行为。创建新对象时,它将开始为空


您的循环基本上是说“对于
arr
中的每个元素,声明一个包含其副本的变量,然后如果该变量是
c
,则将该副本更改为
f

String等简单值的引用。要获得数组引用,您需要让数组成为对象数组,如
[{char:'a'},{char:'b'},…]
。然后在迭代器中,您可以通过更改
char
属性来更改数组的元素

let arr = [{char: 'a'}, {char :'b'}, ...];

for (let v of arr) {
    if (v.char === 'c')  {
      v.char = 'f';
      break;
    }       
}

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']

迭代器不提供改变底层结构的方法,您需要自己做。

在更改
v
之前,数组和
v
指向相同的值,或者在本例中具有相同的值:

arr[2] -> 'c' <- v
v
arr[2]
只是占位符,但不同。

正确答案:

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

否,JavaScript不允许属性别名。变量
v
是数组中值的副本。若要执行所需操作,可以使用
.map()
,或使用
.findinex()
查找目标元素的索引,然后修改数组。对于数组上的in-loop是一个坏主意。使用内置的数组方法在数组上循环@埃帕斯卡雷罗咖啡时间:)@Pointy啊,读这篇文章就像不在的。当你有forEach/filter/map/etcOk时,lol仍然认为of是一个糟糕的选择,明白吗。如果数组不包含字符串,而是包含属性的自定义对象,该怎么办?然后我可以像v=newObject那样改变整个对象吗?或者我必须要v.myProp=newObject.myProp吗?@williamwmy我不确定,但我认为只有
v.myProp=newObject.myProp
possible@williamwmy从技术上讲,
v
只包含对数组元素的引用,因此
v=newObj
将放置到
v
一个新引用,对数组元素的旧引用将被销毁谢谢,我试过了,你是对的,我不能只设置整个对象,因为对象有很多属性,我也必须循环遍历它们,这使得代码有点混乱。@williamwmy,你可以放置到array
[{obj:yourObjectWithTonsOfProperties}]
然后
v.obj=newObj
该行为与
let
无关。你会在
var
中看到同样的情况。我从来没有说过Let是问题所在,但它的行为会导致所发生的事情,但是
var
const
也可以这样说。这种行为决不是特定于
let
,它只是JS中值的一般工作方式。这是事实,也是一个公平的观点,尽管我从未说过它是特定的,但我会接受你的建议,并指出它并不是
let
专门导致问题的原因,它会记录:
[“a”、“b”、“c”、“d”、“e”
。为什么?@rv7我把
.entries()
中的索引和值弄混了。谢谢你的提醒!
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);