JavaScript中不可变性的含义及变量赋值内存机制疑问
JavaScript原始值赋值的内存机制解析
- 核心结论:
'foo'与'bar'处于不同的内存位置,当x被重新赋值为'bar'后,若没有其他引用指向旧值'foo',它会被垃圾回收机制回收。
原因说明
JavaScript的原始值(字符串、数字、布尔值、null、undefined、Symbol、BigInt)本身是不可变的——你无法直接修改一个原始值的内容,比如不能把'foo'直接改成'bar'。
- 执行
let x = 'foo';时,变量x会指向内存中存储'foo'的位置; - 执行
x = 'bar';时,并非修改'foo'所在内存的内容,而是让x转而指向内存中存储'bar'的新位置。
补充:字符串驻留优化
部分JavaScript引擎会对短字符串做字符串驻留优化——相同的字符串会被存在同一个内存位置。比如如果有另一个变量let y = 'foo';,x和y会共享'foo'的内存地址。但这只是引擎的优化策略,不改变原始值不可变的本质,重新赋值依然是切换变量的指向,而非修改原有值。
内容的提问来源于stack exchange,提问作者Yousef Dawood
相关产品推荐
相关产品推荐

