JS-数组被引用了吗



需要一些帮助来理解JS中的数组-从我刚才尝试的一些代码来看,它们似乎被引用了?这是正确的吗?

const generatedNumbers = [1, 2, 3, 4, 5];
const shuffleArrayNumbers = shuffleArray(generatedNumbers);
shuffleArrayNumbers.shift();
console.log(shuffleArrayNumbers);
console.log(generatedNumbers);
function shuffleArray(array) {
return array.sort(() => Math.random() - 0.5);
}

所以我希望shuffleArrayNumbers在它自己的变量中,它的行为是唯一的,但事实并非如此。两个console.log输出产生相同的输出。

有人能解释一下发生了什么,以及我如何返回一个唯一的/新的数组吗。

谢谢。

sort方法更改数组(MDN:排序(。

您可以使用排列语法(MDN:排列语法(…((创建一个独立的数组

const generatedNumbers = [1, 2, 3, 4, 5];
const shuffleArrayNumbers = shuffleArray(generatedNumbers);
shuffleArrayNumbers.shift();
console.log(shuffleArrayNumbers);
console.log(generatedNumbers);
function shuffleArray(array) {
return [...array].sort(() => Math.random() - 0.5);
}

Js的数组是引用,所以当你这样做时:
let arr1 = [1, 2 ,3];
let arr2 = arr1;
arr2.pop();
// arr1 = [1, 2] and arr2 = [1, 2]

如果你想避免这种行为,你必须使用copy,例如使用slicespread运算符:

let arr1 = [1, 2, 3]
let arr2 = arr1.slice();
// or
let arr2 = [...arr1];
arr2.pop();
// arr1 = [1, 2, 3] and arr2 = [1, 2]

注意:此方法不适用于nested objectarray,因为object属性仍然是reference

在这种情况下,您必须使用structuredClone(浏览器不完全支持https://developer.mozilla.org/en-US/docs/Web/API/structuredClone):

let arr1 = [1, 2, 3];
let arr2 = structuredClone(arr1);

最新更新