Javascript 中参考值的记忆

JavaScript 将引用值存储在堆内存中,因此变量存储到指针/地址。因此,如果我们更改原始变量,它也会更改分配的变量:


var cols = ['red', 'blue', 'green']

var newCols = cols


cols.push('orange')


console.log(cols) 

// returns ["red", "blue", "green", "orange"]

console.log(newCols)

// returns ["red", "blue", "green", "orange"]

然而,当我尝试引用类型时,我发现,当我使用索引进行赋值和推送方法时,它们的行为逻辑与我没想到的不同:


var cols = ['red', 'blue', 'green']

var newCols=cols[1]

cols[1] = "pink"

console.log(cols)

// returns > ["red", "pink", "green"]

console.log(newCols)

// returns > "blue"  WHY?

但:


var cols = ['red', 'blue', 'green']

var newCols=cols

newCols[3] = 'orange'

cols.push('yellow')


console.log(cols)

// returns > ["red", "blue", "green", "orange", "yellow"]

console.log(newCols)

// returns > ["red", "blue", "green", "orange", "yellow"] WHY?

那么,这里的逻辑(“引擎盖下的想法”)是什么,在一个样本中,它影响原始内容,但在另一个样本中则不影响?


红颜莎娜
浏览 93回答 1
1回答

Qyouu

当你这样做时var newCols=cols[1]您本质上是引用cols[1]当前持有的值,并且newCols也指向它。例如cols[1],当前'blue'字符串位于内存位置#5432。然后所做的也newCols=cols[1]指向newCols#5432。该数组cols也是对内存位置的引用的数组。所以['red', 'blue', 'green']可以认为是[#987, #5432, #123]. 重新分配其中一个索引会在该位置放置一个新的引用。之后cols[1] = "pink",你可以认为cols是现在包含[#987, #333, #123]。#5432- -处的原始项目'pink'不受影响。newCols,它指向#5432,仍然指向'pink'.当你这样做时var newCols=cols整个数组容器由两个变量指向。例如,cols和 都newCols指向#55555。因此,改变其中一个会导致另一个也发生变化。(“内存位置”是一种有用的可视化,但它不一定不是事物在幕后工作的方式 - 这只是一种简单的思考方式)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript