为什么这两个代码不做相同的事情?
谁能给我解释一下诀窍在哪里?
function randomize(arr){
for(var i = 0; i < arr.length; i++){
const random = Math.floor(Math.random()*arr.length);
let temp = arr[i];
let newR = arr[random];
[temp, newR] = [newR, temp];
}
return arr;
}
console.log(randomize([1,2,3,4,5]));
function randomize(arr){
for(var i = 0; i < arr.length; i++){
const random = Math.floor(Math.random()*arr.length);
[arr[i], arr[random]] = [arr[random], arr[i]];
}
return arr;
}
console.log(randomize([1,2,3,4,5]));
我非常感谢你的阅读!
发布于 2018-05-22 12:43:44
因为在JavaScript中,不能通过引用传递基元值,而只能通过值传递。只有复合值(对象、数组)可以通过引用进行赋值。
let arr = ["one", 2, {name: "foo"}];如果你这样做了
let item = arr[0];那么你只是在复制它的价值。更改item不会修改arr[i]的值,因为没有对它的引用。
但如果你想做的话
let obj = arr[2];在第三个位置,你会有一个对象的引用。您可以用不同的东西重新分配obj,这不会改变arr[2]。但是,如果您访问并更改了name属性,则需要更改引用对象的属性。
obj.name = "bar";
console.log(obj === arr[2]);
console.log(arr[2].name === "bar");
obj = "something else";
console.log(arr[2] !== obj);发布于 2018-05-22 12:35:53
但是,在交换temp和newR时,原始数组项保持不变,不进行交换。因此,输出与输入保持不变。
let temp = arr[i];
let newR = arr[random];
[temp, newR] = [newR, temp];稍后您将交换数组项,因此将更新数组。
[arr[i], arr[random]] = [arr[random], arr[i]];https://stackoverflow.com/questions/50467832
复制相似问题