【问题标题】:Is an object inside an array passed by reference?数组中的对象是否通过引用传递?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-09-30
    • 2014-02-08
    • 2012-07-08
    • 1970-01-01
    • 2011-05-11
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    相关资源
    最近更新 更多