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。因此,改变其中一个会导致另一个也发生变化。
(“内存位置”是一种有用的可视化,但它不一定不是事物在幕后工作的方式 - 这只是一种简单的思考方式)
添加回答
举报
0/150
提交
取消