这篇文章将为大家详细讲解有关对象。分配如何在JavaScript中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
<强>深拷贝与浅拷贝强>
在JavaScript中,对于基本数据类型(未定义,null,布尔、数字、字符串)来说,在变量中存储的就是这个变量本身的值,复制是对<强>值的复制>强,不存在深浅之说。但C系语言的共同特点中有,存储引用类型(对象),实际中在变量里存的是它的地址。因此对JavaScript中的复杂数据类型(对象)来说,也会有浅拷贝和深拷贝的概念:<强>浅拷贝指两个不同的变量存的是同一个对象的地址,即两个变量指向同一块内存区域;深拷贝则是重新分配了一块内存区域来存储复制后的对象,两个变量存的是真正的两个互不影响的变量。强>
注。有些资料认为<强>浅拷贝是重新分配内存,并把原对象中的各个属性进行依次复制而不进行递归复制属性值是对象的情况,也就是只复制对象的最外面一层>强。本文将这种情况归于“深拷贝和浅拷贝的中间情况”,文中以“是否划分新的内存”为界限划分深浅拷贝,这种划分方式与C/c++, c#、Java等C系语言保持概念一致。
<强>浅拷贝在JavaScript中的实现强>
浅拷贝在js中很简单,例如:
let objA =, { ,,名字:& # 39;对象一个# 39;, ,,内容:& # 39;我是一个# 39; }; let copyA =, objA; console.log (objA.name);,//,==祝辞,“对象A" console.log (copyA.name);,//,==祝辞,“对象A"
如此即得到了objA的一份浅拷贝copyA,由于指向的是同一个对象,因此在修改objA的同时也是修改了copyA,反之亦然。
<强> Object.assign() 强>
Object.assign(目标,…来源)MDN上对该方法的描述是<强>将所有可枚举属性的值从一个或多个源对象复制到目标对象>强,字符串类型和符号类型的属性都会被拷贝,并且<强>该方法会忽略值为或者未定义的源对象>强。例如:
var o1 =,{,答:1,}; var o2 =,{,[符号(& # 39;foo # 39;)]:, 2,}; var obj =, Object.assign ({},, o1,, o2); console.log (obj);,//, {, a :, 1日,[符号(“foo")]:, 2,}, (cf只bug 1207182,提醒Firefox) Object.getOwnPropertySymbols (obj);,//,[符号(foo)]
<强>对象。分配的深拷贝与浅拷贝强>
注意前面说的是可枚举属性,这是一个介于完全的深拷贝和完全的浅拷贝之间的方法:如果我们把它的第一个参数目标设置为一个空对象{},同时保证剩余的源对象中来源的属性类型不包含引用类型,则该方法的返回值就是一个与源对象相同的但并不在同一块内存空间另一个对象,即获得了源对象的深拷贝。但是,如果源对象的属性中包含某个对象,也就是这个属性的值指向某个对象,就像下面这样:
var obj =, { ,,名字:& # 39;obj 名字# 39; ,,内容:{ ,,,,,, ,,,b: 2 ,,} };
则使用<代码>对象。分配({},obj) 代码>时,返回的目标对象中的内容属性与源对象obj中的内容属性指向的同一块内存区域,即对obj下的内容属性进行了<强>浅拷贝>强。因此针对深拷贝,需要使用其他方法,比如自己实现一个深拷贝的方法,或者使用<代码> JSON.parse (JSON.stringify (obj))> 代码,因为<代码> Object.assign()> 代码拷贝的是属性值。
<强>对象。分配的属性覆盖强>
如果目标对象中的属性具有相同的键,则属性将被源中的属性覆盖。后来的源的属性将类似地覆盖早先的属性,因此可以用来合并对象(常用的一个场景是使用还原剂更新反应应用的状态)。
var o1 =, {,, 1,,,,,,,, 1,}; var o2 =, {, b: 2, c:, 2,}; var o3 =, {, c: 3,}; var obj =, Object.assign ({},, o1,, o2,, o3); console.log (obj);,//, {,, 1,,,,,,,, 3,}
<强>关于对象的继承属性和不可枚举属性强>
前文有提到,<代码>对象。分配> 代码拷贝的是对象的可枚举属性,该方法使用源对象的<代码>[[有]]> 代码和目标对象的<代码>[[设置]]> 代码,所以它会调用相关<代码> getter 代码>和<代码>设置> 代码。因此,不如说它是分配属性,而不仅仅是复制或定义新的属性。如果合并源包含getter,这可能使其不适合将新属性合并到原型中,将属性定义(包括其可枚举性)复制到原型应使用<代码> Object.getOwnPropertyDescriptor()