这个问题怎么取名我有点楞,是和内存有关吧(⊙o⊙)…
var a = {v: 1}
var b = a
b.v = 2
a.v == b.v // true
我希望在改变b.v
的时候a
不变,应该怎么写?
这个问题怎么取名我有点楞,是和内存有关吧(⊙o⊙)…
var a = {v: 1}
var b = a
b.v = 2
a.v == b.v // true
我希望在改变b.v
的时候a
不变,应该怎么写?
正如你说,就是和内存有关。var a = {v: 1}
开辟一块内存,存放{v:1}
,变量a
指向这个内存块。可理解为a
为这块内存了引用。var b = a;
将a
的内容复制到变量b
,也就是存放{v:1}
的内存引用,此时b
也指向了那块内存。b.v = 2;
修改了b
指向的那块内存的内容。所以a
指向的内存内容也就修改了。所以a.v == b.v
;
想要他们不相等,只要定义b变量的时候,重新开辟一块内存就好了。
楼上有回答已经给出了方法。
实战项目中,我们常常采用lodash的cloneDeep
方法
像a这种情况,可以使用深度拷贝将值赋给b
var b = JSON.parse(JSON.stringify(a));
当然这里a只有一层属性,也可以使用
var b = Object.assign({}, a);
这个方法有很多,Object.assign() ...运算符。还有上面说的stringify 和parse。
其实是一个拷贝的问题:Object.assign 和 ... 属于浅拷贝。JSON.parse(JSON.stringify())不能拷贝原型对象。这之中的问题。楼主可以自己搜索下。
另外 内存储存类型:堆和栈。也可以去baidu/google下。
var a = {v: 1}
这一步假设分布了内存0x001给a,此时a => 0x001, 0x001存放了{v: 1}(简单理解成这样)var b = a
这一步相当于b => 0x001
也就是说b = {v: 1},因为b地址也指向0x001b.v = 2
这一步的时候,0x001中的v = 2
b => 0x001 => .v => 2
a => 0x001 => .v => 2
所以 a.v == b.v // true
这些都是因为至两个变量指向了同一个地址
使两个变量的指向为不同的地址
var b = JSON.parse(JSON.stringify(a))
var b = Object.assign({}, a);
对于一层的对象可以这样
b = {...a}
题目的语法过程。
在生成一个{v:1}存在堆地址0x0001
a指向地址0x0001
b指向a的地址0x0001
修改此地址的v的值
a/b指向相同,所以。。。
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
1 回答1.6k 阅读✓ 已解决
4 回答5k 阅读✓ 已解决
2 回答2.5k 阅读✓ 已解决
7 回答5.4k 阅读✓ 已解决
2 回答4.6k 阅读✓ 已解决
或者