¿Puede alguien explicarme por qué la salida es diferente? Elimino un elemento en ambos casos, entonces, ¿por qué el ciclo for marca la diferencia entre empalmar y reasignar el valor?
filtrar:
1 2 3 4 5
empalme:
1 2 3 5
let arr = []; let arr2 = []; class test { constructor(s) { this.s = s; } destroy() { arr = arr.filter((e) => e !== this); } destroy2() { var index = arr2.indexOf(this); if (index !== -1) { arr2.splice(index, 1); } } } arr.push(new test("1")); arr.push(new test("2")); arr.push(new test("3")); arr.push(new test("4")); arr.push(new test("5")); arr2.push(new test("1")); arr2.push(new test("2")); arr2.push(new test("3")); arr2.push(new test("4")); arr2.push(new test("5")); console.log("filter: "); for (let t of arr) { if (ts === "3") { t.destroy(); } console.log(ts); } console.log("\nsplice: "); for (let t of arr2) { if (ts === "3") { t.destroy2(); } console.log(ts); }Consulte el siguiente fragmento de código.
Aquí el arr es parte del iterador, y está cambiando la matriz dentro del bucle for, pero el iterador se referirá a la ubicación de memoria de arr.
Pero acaba de asignar una ubicación/memoria diferente a la variable arr, pero el iterador aún se refiere a la memoria/ubicación anterior.
En caso de empalme, modifica el contenido de la memoria, en caso de filtro es solo una nueva asignación de objeto.
for(let a of arr) { arr = arr.filter(i => i!=3); console.log(a); console.log(arr); }