JavaScript 对象拷贝

JavaScript 对象拷贝

JavaScript 如何复制一个对象?浅拷贝可以复制出原始值属性,但是对于引用值属性仅仅复制了一份引用。利用递归对每个引用值属性的属性进行复制,这种方式称之为深拷贝

问题引入

var person1 = {
    name: '张三',
    age: "22"
}
var person2 = person1;

我们希望拷贝一份 person1 的属性给 person2,赋值是最简单的做法,但是这并不是我们想要的结果。 因为这仅仅是将 person1、person2 指向了同一对象,修改其一,会相互影响

对象浅拷贝

var person1 = {
    name: '张三',
    age: 22,
    son: {
        name: '张小三',
        age: 1
    }
}
var person2 = {};
for (var key in person1) {
    person2[key] = person1[key];
}

循环将 person1 的属性取出赋值给 person2,对于原始类型属性,不相互影响,可以成功拷贝,但是对于引用类型的属性,如 person2.son 和 person1.son 指向了同一对象,修改其一,会相互影响

如果不需要 person1 原型链上的属性,赋值时使用 hasOwnProperty() 判断

对象深拷贝

浅拷贝复制引用值只是将引用指向这个值,并不是复制了一份,修改其一,会相互影响。我们可以将属性中的引用值也循环其属性,复制到目标对象的属性。这种需求适合递归

var person1 = {
    name: '张三',
    age: 30,
    son: {
        first: {
            name: '小一',
            age: 3
        }
    }
}

function deepClone(origin) {
    var target = {};
    var toStr = Object.prototype.toString;
    for (var key in origin) {
        if (!origin.hasOwnProperty(key)) continue;
        if (typeof(origin[key]) === 'object' && origin[key] !== null) {
            if (toStr.call(origin[key]) === "[objcet Array]") {
                target[key] = [];
            } else {
                target[key] = {};
            }
            target[key] = deepClone(origin[key]);
        } else {
            target[key] = origin[key];
        }
    }
    return target;
}

var person2 = deepClone(person1);
person2.son.sencond = {
    name: '小二',
    age: 2
}
console.log(person2);
console.log(person1);

person2 含有 person1 的所有属性,对于原始值属性进行修改,不会相互影响

原文地址:https://www.cnblogs.com/pgjett/p/12544115.html

时间: 2024-08-27 06:17:41

JavaScript 对象拷贝的相关文章

也说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| 对象的拷贝

上一遍是我们基本素组的拷贝,当然少不了我们对象的拷贝,当然也有我们的浅拷贝和我们的深拷贝滴啦: 然后,深拷贝,从某个角度来说就是我们对象的继承: 对象拷贝分为浅拷贝(shallow)和深拷贝(deep)两种.浅拷贝只复制一层对象的属性,并不会进行递归复制,而javascript存储对象都是存地址的,所以浅拷贝会导致对象中的子对象指向同一块内存地址:而深拷贝则不同,它不仅将原对象的各个属性逐个复制出去,而且将原对象各个属性所包含的对象也依次采用深拷贝的方法递归复制到新对象上 先补充一点基础知识,然

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

JavaScript 对象的用法

内容简介:JavaScript是面向对象语言,通过原型机制实现继承,通过『闭包』等方式可以实现封装. 本文来探讨JavaScript对象的特殊之处:原型链.引用.反射.属性遍历等特性. 一.对象创建 JavaScript拥有非常直观的对象创建方式: var emptyObject = {}; var person = { name: 'harttle', age: 24 }; 相当于: var xx = new Object(); xx.name = 'hartle'; xx.age = 24;