Cuando ejecuto el código:
async function test(){ let table=[]; setTimeout(() => { table[0]='resolved'; }, 300); return table; } let result; test().then(res=>{ result=res; console.log("first -" + result); }); setTimeout(() => { console.log("second -" + result) }, 4000);espero obtener:
first - [] second - []pero el resultado es:
first - [] second - ['resolved']¿Por qué pasó esto? Dado que la prueba de función ya se completó cuando llega al primer archivo console.log, ¿por qué cambia el resultado?
JavaScript pasa y devuelve por valor , pero la matriz [] es un objeto, y devolver el resultado o asignarlo a una variable no hace una copia de ese objeto. Los tres nombres, table , res y result , se refieren al mismo objeto de matriz, por lo que cuando el código en setTimeout cambia la matriz, lo verá en result más adelante.
// primitives like numbers and strings pass by value let string1 = "abc"; let string2 = string1; string2 = "def"; console.log(string1 + " / " + string2); // abc / def let number1 = 123; let number2 = number1; number2 = 456; console.log(number1 + " / " + number2); // 123 / 456 // if you replace the reference to the array, then they coexist let array1 = [234]; let array2 = array1; array2 = [567]; console.log(array1 + " / " + array2); // 234 / 567 // but if you modify it in place, then there's only one object // so the modification shows in both places let array3 = [345]; let array4 = array3; array4.push(678); console.log(array3 + " / " + array4); // 345,678 / 345,678 Su test función devuelve un objeto de matriz, y ese objeto es el objeto pasado then guardado en result . Sin embargo, el navegador (u otro entorno) aún ejecuta el código setTimeout , cambiando el contenido de la matriz incluso después de que la referencia a la matriz se haya guardado en res y result .
Por esta razón, debe tener mucho cuidado cuando trabaje con una matriz que recibió como variable: si necesita asegurarse de que no cambie inesperadamente, es posible que deba hacer su propia copia de la matriz. De lo contrario, la persona que llama podría cambiar la matriz debajo de usted, exactamente de la misma manera que lo hace su setTimeout en test .