为了账号安全,请及时绑定邮箱和手机立即绑定

Javascript 中参考值的记忆

Javascript 中参考值的记忆

红颜莎娜 2023-08-24 21:11:19
JavaScript 将引用值存储在堆内存中,因此变量存储到指针/地址。因此,如果我们更改原始变量,它也会更改分配的变量:var cols = ['red', 'blue', 'green']var newCols = colscols.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=colsnewCols[3] = 'orange'cols.push('yellow')console.log(cols)// returns > ["red", "blue", "green", "orange", "yellow"]console.log(newCols)// returns > ["red", "blue", "green", "orange", "yellow"] WHY?那么,这里的逻辑(“引擎盖下的想法”)是什么,在一个样本中,它影响原始内容,但在另一个样本中则不影响?
查看完整描述

1 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

当你这样做时

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。因此,改变其中一个会导致另一个也发生变化。

(“内存位置”是一种有用的可视化,但它不一定不是事物在幕后工作的方式 - 这只是一种简单的思考方式)


查看完整回答
反对 回复 2023-08-24
  • 1 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信