【问题标题】:Memory of Reference Values in JavascriptJavascript 中的参考值记忆
【发布时间】:2020-11-24 01:15:02
【问题描述】:

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?

那么,这里的逻辑(“引擎盖下的想法”)是什么?

【问题讨论】:

  • newCols 在第二个代码中被赋值——它没有“指向”一个值

标签: javascript memory


【解决方案1】:

当你这样做时

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' 的原始项目不受影响。指向#5432的newCols仍然指向'pink'

当你这样做时

var newCols=cols

整个数组容器由两个变量指向。例如,colsnewCols 都指向 #55555。所以变异一个会导致另一个看起来也发生变化。

(“内存位置”是一个有用的可视化,但它不一定是引擎盖下的工作方式——这只是一种简单的思考方式)

【讨论】:

  • 它现在更干净了,但很难清楚地掌握这个想法。是否有任何视觉资源可以准确地以图形方式解释这个问题?顺便谢谢你的回答。
  • 我想人们可以获取上述信息并将其制作成视频或其他内容,或者可能已经存在,但我不会制作 - 如果有任何不清楚的地方,只是问
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
相关资源
最近更新 更多