为什么这两个代码不做同样的事情?
有人可以向我解释诀窍在哪里?
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]));
&#13;
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]));
&#13;
我非常感谢您的阅读!
答案 0 :(得分:2)
使用以下内容,您正在交换temp
和newR
但是,原始数组项保持不变并且不会交换。因此,输出保持与输入相同。
let temp = arr[i];
let newR = arr[random];
[temp, newR] = [newR, temp];
随后您将交换数组项,因此,数组会更新。
[arr[i], arr[random]] = [arr[random], arr[i]];
答案 1 :(得分:0)
因为在JavaScript中,您无法通过引用传递原始值,而只能通过值传递原始值。只能通过引用分配复合值(对象,数组)。
let arr = ["one", 2, {name: "foo"}];
如果你这样做
let item = arr[0];
然后你只是复制它的价值。
更改item
不会修改arr[i]
的值,因为没有引用它。
但如果你愿意做以下
let obj = arr[2];
你会在第3个位置引用该对象。
你可以用不同的东西重新分配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);