在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ a={v:1}, b=a, b.v=3, b==a?

a={v:1}, b=a, b.v=3, b==a?

這個(gè)問題怎么取名我有點(diǎn)楞,是和內(nèi)存有關(guān)吧(⊙o⊙)…

var a = {v: 1}
var b = a
b.v = 2

a.v == b.v  // true

我希望在改變b.v的時(shí)候a不變,應(yīng)該怎么寫?

回答
編輯回答
萌小萌

問題解析

var a = {v: 1}
這一步假設(shè)分布了內(nèi)存0x001給a,此時(shí)a => 0x001, 0x001存放了{(lán)v: 1}(簡(jiǎn)單理解成這樣)
var b = a
這一步相當(dāng)于b => 0x001
也就是說(shuō)b = {v: 1},因?yàn)閎地址也指向0x001
b.v = 2
這一步的時(shí)候,0x001中的v = 2
b => 0x001 => .v => 2
a => 0x001 => .v => 2
所以 a.v == b.v // true
這些都是因?yàn)橹羶蓚€(gè)變量指向了同一個(gè)地址

解決思路

使兩個(gè)變量的指向?yàn)椴煌牡刂?/p>

  1. 可以轉(zhuǎn)換成字符串再轉(zhuǎn)成對(duì)象()

var b = JSON.parse(JSON.stringify(a))

  1. es6中 合并兩個(gè)對(duì)象,源是a,目標(biāo)是空對(duì)象。也能達(dá)到不同地址的目的

var b = Object.assign({}, a);

2017年7月28日 12:41
編輯回答
蔚藍(lán)色

var a = {v : 1}
var b = Object.assign({},a)
b.v = 2
a.v == b.v //false

2017年1月30日 09:34
編輯回答
冷溫柔

像a這種情況,可以使用深度拷貝將值賦給b

var b = JSON.parse(JSON.stringify(a));

當(dāng)然這里a只有一層屬性,也可以使用

var b = Object.assign({}, a);
2018年3月3日 22:30
編輯回答
涼汐

對(duì)于一層的對(duì)象可以這樣

b = {...a}

題目的語(yǔ)法過(guò)程。

在生成一個(gè){v:1}存在堆地址0x0001
a指向地址0x0001
b指向a的地址0x0001
修改此地址的v的值
a/b指向相同,所以。。。
2017年3月24日 07:21
編輯回答
半心人

正如你說(shuō),就是和內(nèi)存有關(guān)。
var a = {v: 1}
開辟一塊內(nèi)存,存放{v:1},變量a指向這個(gè)內(nèi)存塊??衫斫鉃?code>a為這塊內(nèi)存了引用。
var b = a;
a的內(nèi)容復(fù)制到變量b,也就是存放{v:1}的內(nèi)存引用,此時(shí)b也指向了那塊內(nèi)存。
b.v = 2;
修改了b指向的那塊內(nèi)存的內(nèi)容。所以a指向的內(nèi)存內(nèi)容也就修改了。所以a.v == b.v;

想要他們不相等,只要定義b變量的時(shí)候,重新開辟一塊內(nèi)存就好了。
樓上有回答已經(jīng)給出了方法。
實(shí)戰(zhàn)項(xiàng)目中,我們常常采用lodashcloneDeep方法

2018年3月25日 02:18
編輯回答
刮刮樂

這個(gè)方法有很多,Object.assign() ...運(yùn)算符。還有上面說(shuō)的stringify 和parse。
其實(shí)是一個(gè)拷貝的問題:Object.assign 和 ... 屬于淺拷貝。JSON.parse(JSON.stringify())不能拷貝原型對(duì)象。這之中的問題。樓主可以自己搜索下。
另外 內(nèi)存儲(chǔ)存類型:堆和棧。也可以去baidu/google下。

2017年3月23日 03:16
編輯回答
尛憇藌
var a = {v: 1}
    var b = JSON.parse(JSON.stringify(a))
    b.v = 2
    
    a.v == b.v  // false
    
    
    

或者

var a = {v: 1}
var b = Object.assign({}, a);
b.v = 2

a.v == b.v  // false

2017年2月26日 01:36