ecmascript-6函数用于反转数组中的值

时间:2018-05-22 12:33:25

标签: javascript ecmascript-6

为什么这两个代码不做同样的事情?

有人可以向我解释诀窍在哪里?



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;
&#13;
&#13;

&#13;
&#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;
&#13;
&#13;

我非常感谢您的阅读!

2 个答案:

答案 0 :(得分:2)

使用以下内容,您正在交换tempnewR但是,原始数组项保持不变并且不会交换。因此,输出保持与输入相同。

 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);