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

时间:2016-03-01 15:52:22

标签: 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中的对象相同吗?

6 个答案:

答案 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不会更改数组中的值。这由varconst共享,只是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

varr[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