Javascript中复合类型变量的复制

对于学习C语言的同学来说,将一个struct变量赋予另外一个struct变量,相当于开辟了另外一个内存块。如下面的程序块所示:

struct person{
   char *name;
   int age;
} a,b;
a.name = "tom";
a.age = 35;
b = a;
b.age = 45;
printf("%d",a.age); //35

同样的代码,如果用 javascript 写成下面的样子,结果是不一样的:

> let a = {name:'tom',age:35}
undefined
> let b = a
undefined
> b.age
35
> b.age=45
45
> a.age
45

从两段代码的比较中,我们可以发现,对于javascript的复合类型来说,变量始终是个参考(对应)至变量的名称,相当于C语言的指针。

那么,how to copy objects in JavaScript ? 有以下几种办法:

办法一:一个一个循环复制给新的变量


> function copy(obj) { let res = {};let k;for(k in obj){res[k]=obj[k]};return res }
undefined
> let c = copy(a)
undefined
> c
{ name: 'tom', age: 45 }
> c.age=35
35
> a
{ name: 'tom', age: 45 }
> c
{ name: 'tom', age: 35 }

注意:这种方法如果原来的变量中包含Object类型,复制时相当于复制了指针。

办法二:利用JSON转换来复制变量

> let d = JSON.parse(JSON.stringify(a))
undefined
> d
{ name: 'tom', age: 45 }
> d.age = 35
35
> a
{ name: 'tom', age: 45 }
> c
{ name: 'tom', age: 35 }

注意:变量很多的时候非常耗内存。

办法三:使用Object.assign()

> let e = Object.assign({},a)
undefined
> e
{ name: 'tom', age: 45 }
> e.age=35
35
> a
{ name: 'tom', age: 45 }
> e
{ name: 'tom', age: 35 }

注意:同方法一,这种方法如果原来的变量中包含Object类型,复制时相当于复制了指针。

版权声明:本文为本站原创,转载需取得本站同意。
参考原文出处:https://www.digitalocean.com/community/tutorials/copying-objects-in-javascript