数组中的对象是否通过引用传递?
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;
它会反映出来。
假设我们有一个这样的对象数组:
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;
它会反映出来。