【发布时间】:2021-09-11 20:45:18
【问题描述】:
假设我们有一个这样的对象数组:
let cards = [
{
suit: 'spades',
"value": '10'
},
{
suit: 'hearts',
value: 'Q'
},
{
suit: 'clubs',
value: '5'
}
]
现在要洗牌,我看到了这样的函数:
function shuffle(cards) {
for (let i = cards.length - 1; i > 0; i --) {
const newIndex = Math.floor(Math.random() * (i + 1));
const oldValue = cards[newIndex]; // cards[newIndex] is an object, and we're assigning its address to oldValue
cards[newIndex] = cards[i]; // Now we're changing cards[newIndex] address to an address of another object
// So the oldValue address we set one line higher should change too
// Yet it stays unchanged
}
}
我不明白的地方在上面代码的cmets中有描述。
我想问,为什么它会这样 - 这不是经典的“通过引用”示例吗? 为什么我们更改了传递给它的对象的地址后,oldValue变量没有改变?
【问题讨论】:
-
您的
shuffle错误。您移动了一个项目,但没有先保存前一个项目。因此,如果您将索引2移动到0,您现在拥有索引2处的任何项目的两个副本。即使您有像["a", "b", "c"]这样的原语数组,情况也是如此。请参阅How to randomize (shuffle) a JavaScript array? 以了解正确的实现方式。 -
这样想......如果你这样做了
let X = cards[1]; x= cards[2]- 你会期望cards[1]会改变吗? -
我知道,它少了一行。我只是想了解我所描述的问题。
标签: javascript arrays pass-by-reference