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

时间: 2024-12-29 07:52:30

javaScript| 对象的拷贝的相关文章

JavaScript对象的拷贝

如何赋值一个对象a到另一个变量b,另一个变量b发生改变原对象a保持不变. 参考资料: http://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-clone-an-object/5344074#534407 http://web.archive.org/web/20140328224025/http://jsperf.com/cloning-an-object/2 http://stackoverflow

也说Javascript对象拷贝及疑问

也说Javascript对象拷贝及疑问 一.浅拷贝 当我们需要将一个对象拷贝至另一个对象时,我们一般会这么实现 function shadowCopy(source,target){ var target=target||{}; for(var i in source) { target[i]=source[i]; } return target; } var a={name:'Lily',age:19}; var b=shadowCopy(a);//b={name:'Lily',age:19}

Javascript对象拷贝(clone)

1. [代码]方法代码     function cp(source, target) {    function isBaseType(v) {        var type = typeof v;        var basetype = {            "string": true,            "number": true,            "boolean": true,            "

JavaScript 对象拷贝

JavaScript 对象拷贝 JavaScript 如何复制一个对象?浅拷贝可以复制出原始值属性,但是对于引用值属性仅仅复制了一份引用.利用递归对每个引用值属性的属性进行复制,这种方式称之为深拷贝 问题引入 var person1 = { name: '张三', age: "22" } var person2 = person1; 我们希望拷贝一份 person1 的属性给 person2,赋值是最简单的做法,但是这并不是我们想要的结果. 因为这仅仅是将 person1.person

JavaScript大杂烩5 - JavaScript对象的若干问题

1. 类型检查:instanceof与typeof 这是两个相似的操作符,instanceof用于检测函数的实例类型,主要是在面向对象编程中检查new出来的对象类型,需要注意instanceof是检查function对象的,前面实现的复制继承中的例子就不适用于使用instanceof来检查继承关系了.typeof,它用于检测变量的类型,在实际情况中应用的不是很多,稍微了解一下就可以了. 在使用typeof之前,有一点需要确认,那就是string与String不是同一个类型,这个不用多说了,我们前

JavaScript大杂烩4 - 理解JavaScript对象的继承机制

面向对象之继承 JavaScript是单根的面向对象语言,它只有单一的根Object,所有的其他对象都是直接或者间接的从Object对象继承(没有指定父类的对象,都被认为是从Object继承的). 在前面我们讨论了面向对象的封装性,在最后的地方也谈到了JavaScript的继承是通过原型和原型链实现的,下面我们就详细的展开这个问题:JavaScript到底是如何实现继承的? 继承的本质 继承的本质是重用,从语法上来讲,继承就是"D是B"的描述,其中B是基类,描述共性,D是子类,描述特性

深入浅出 JavaScript 对象 v0.5

JavaScript 没有类的概念,因此它的对象与基于类的语言中的对象有所不同.笔者主要参考<JS 高级程序设计>.<JS 权威指南>和<JS 精粹> 本文由浅入深的讲解了对象的概念,特性,和使用,由于笔者水平的确有限,有些观点也是边理解,边查证,边分享. 希望大家都能感受到分享的乐趣,祝我们共同进步,请大家不吝交流. 目录 对象是什么? 对象有什么特性? 对象有什么用? 如何创建对象? 对象直接量 工厂方法创建对象 通过 new 创建对象 对象属性的查询与设置(检索与

JavaScript语言精粹读书笔记- JavaScript对象

JavaScript 对象 除了数字.字符串.布尔值.null.undefined(都不可变)这5种简单类型,其他都是对象. JavaScript中的对象是可变的键控集合(keyed collections). 对象是属性的容器,其中每个属性都拥有名字和值. JavaScript中的对象是无类别的(class-free)的.它对新属性的名字和值没有约束. JavaScript包括一个原型链特性,允许对象继承另一对象的属性. 对象的检索: stooge[“first-name”]或者stooge.

JSON不是JavaScript对象

一篇短小精悍的文章,我觉得不错就翻译了. 原文作者 Fizer Khan 原文地址 http://www.fizerkhan.com/blog/posts/JSON-is-not-Javascript-Object.html 很多人都把JSON当作JavaScript对象,但它根本不是.JSON只是一种灵感来自JavaScript对象结构的字符串表示法.JSON被设计得简单松散,用来在服务器和浏览器之间传输数据.因为它的简洁性,也在浏览器和服务器之外的其他应用中被使用. 我尝试拷贝一些JavaS