首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ecmascript-6函数用于反转数组中的值。

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

Stack Overflow用户
提问于 2018-05-22 12:33:24
回答 2查看 43关注 0票数 1

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

谁能给我解释一下诀窍在哪里?

代码语言:javascript
复制
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]));

代码语言:javascript
复制
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]));

我非常感谢你的阅读!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-22 12:43:44

因为在JavaScript中,不能通过引用传递基元值,而只能通过值传递。只有复合值(对象、数组)可以通过引用进行赋值。

代码语言:javascript
复制
let arr = ["one", 2, {name: "foo"}];

如果你这样做了

代码语言:javascript
复制
let item = arr[0];

那么你只是在复制它的价值。更改item不会修改arr[i]的值,因为没有对它的引用。

但如果你想做的话

代码语言:javascript
复制
let obj = arr[2];

在第三个位置,你会有一个对象的引用。您可以用不同的东西重新分配obj,这不会改变arr[2]。但是,如果您访问并更改了name属性,则需要更改引用对象的属性。

代码语言:javascript
复制
obj.name = "bar";
console.log(obj === arr[2]);
console.log(arr[2].name === "bar");

obj = "something else";
console.log(arr[2] !== obj);
票数 0
EN

Stack Overflow用户

发布于 2018-05-22 12:35:53

但是,在交换tempnewR时,原始数组项保持不变,不进行交换。因此,输出与输入保持不变。

代码语言:javascript
复制
 let temp = arr[i];   
 let newR = arr[random];
 [temp, newR] = [newR, temp];

稍后您将交换数组项,因此将更新数组。

代码语言:javascript
复制
[arr[i], arr[random]] = [arr[random], arr[i]];
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50467832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档