数组中的对象是否通过引用传递?

Is an object inside an array passed by reference?

假设我们有一个这样的对象数组:

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
    }
}

我不明白的地方在上面代码的注释中描述了。

我想问一下,为什么它会这样 - 这不是经典的 'pass by reference' 示例吗? 为什么我们更改传递给它的对象的地址后,oldValue 变量没有改变?

您正在为 cards[newIndex] 分配新值。关于引用的规则在这里无效,因为现在 cards[newIndex] 仅指向其他内容(内存中的不同地址)。 原始变量仍然存在于不同的地址。因此 oldValue 仍然指向旧值。

如果您对 cards[newIndex] 进行了任何修改,例如: cards[newIndex]['value'] = 9;它会反映出来。