首页 > 代码库 > javaScript| 对象的拷贝
javaScript| 对象的拷贝
javaScript| 对象的拷贝
上一遍是我们基本素组的拷贝,当然少不了我们对象的拷贝,当然也有我们的浅拷贝和我们的深拷贝滴啦;
然后,深拷贝,从某个角度来说就是我们对象的继承;
对象拷贝分为浅拷贝(shallow)和深拷贝(deep)两种。浅拷贝只复制一层对象的属性,并不会进行递归复制,而javascript存储对象都是存地址的,所以浅拷贝会导致对象中的子对象指向同一块内存地址;而深拷贝则不同,它不仅将原对象的各个属性逐个复制出去,而且将原对象各个属性所包含的对象也依次采用深拷贝的方法递归复制到新对象上
先补充一点基础知识,然后我们再:
ECMAScript将对象的属性分为两种:数据属性和访问器属性。每一种属性内部都有一些特性,这里我们只关注对象属性的[[Enumerable]]特征,它表示是否通过 for-in 循环返回属性,也可以理解为:是否可枚举。
然后根据具体的上下文环境的不同,我们又可以将属性分为:原型属性和实例属性。原型属性是定义在对象的原型(prototype)中的属性,而实例属性一方面来自己构造函数中,然后就是构造函数实例化后添加的新属性。
先来复习个方法;
Object.getOwnPropertyNames
返回一个数组,该数组对元素是 obj
自身拥有的枚举或不可枚举属性名称字符串。 数组中枚举属性的顺序与通过 for...in
循环(或 Object.keys
)迭代该对象属性时一致。 数组中不可枚举属性的顺序未定义。
for in,Object.keys(),Object.getPropertyNames(),for 其实这几个方法之间的差异主要在属性是否可可枚举,是来自原型,还是实例。
方法 | 适用范围 | 描述 |
---|---|---|
for..in | 数组,对象 | 获取可枚举的实例和原型属性名 |
Object.keys() | 数组,对象 | 返回可枚举的实例属性名组成的数组 |
Object.getPropertyNames() | 数组,对象 | 返回除原型属性以外的所有属性(包括不可枚举的属性)名组成的数组 |
for..of | 可迭代对象(Array, Map, Set, arguments等) | 返回属性值 |
参考文献:http://www.cnblogs.com/wujie520303/p/4931384.html
javaScript| 对象的拷贝