javascript 对象深拷贝

javascript  中对象深拷贝

在看到jq.extend 时发现javascript 中的深拷贝,一直没有详细了解深拷贝怎么实现的。

 1     var isType = function(obj, type){
 2         var toString = Object.prototype.toString, undefined;
 3         return    (obj === null && type === "Null") || (obj === undefined && type ==="Undefined") ||
 4         ( toString.call(obj).slice(8,-1) === type);
 5     };
 6 //类型判断,如果是对象,或者是数组 toString 返回的是[object Object] [object Array]
 7
 8     var deepCopy = function(result, source){
 9         for(var key in source){
10
11             var copy = source[key];
12             if(source === source[key]) continue;  //如window.window === window这种情况
13             if(isType(copy,"Object")){// copy Object
14                 result[key] = arguments.callee(result[key] || {}, copy);
15             }else if(isType(copy, "Array")){// copy Array
16                 result[key] = arguments.callee(result[key] || [], copy);
17             }else{// 字符串,数字等
18                 result[key] = copy;
19             }
20         }
21         return result;
22     };
23
24     var original = {
25         memNum:1,
26         memStr:"this is a string",
27         memObj:{
28             test1: "object in object"
29         },
30         memArr:[
31             "this is another string",
32             {
33                 test2:" object in array"
34             }
35         ]
36     };
37
38     var copy = deepCopy({},original);
39     copy.memObj.test1="object in copy object";
40
41     console.log(original.memObj.test1);  //object in object
42     console.log(copy.memObj.test1);        //object in copy object
43 //从这里看出,深拷贝了对象original ,在改变新对象的属性时,原对象的属性未受到影响        

实现关键:如果对象的某一个属性是对象或者数组,那么要递归拷贝一遍,直到最终属性为string ,number。 这样在改变新对象上的属性就不会影响到原对象。

javascript 对象深拷贝

时间: 2024-10-25 11:49:44

javascript 对象深拷贝的相关文章

深入学习JavaScript对象

JavaScript中,除了五种原始类型(即数字,字符串,布尔值,null,undefined)之外的都是对象了,所以,不把对象学明白怎么继续往下学习呢? 一.概述 对象是一种复合值,它将很多值(原始值或其他对象)聚合在一起,可通过属性名访问这些值.而属性名可以是包含空字符串在内的任意字符串.JavaScript对象也可以称作一种数据结构,正如我们经常听说的“散列(hash)”.“散列表(hashtable)”.“字典(dictionary)”.“关联数组(associative array)”

也说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大杂烩4 - 理解JavaScript对象的继承机制

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

深入浅出 JavaScript 对象 v0.5

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

JavaScript对象(三)

序列化对象: 对象序列化:对象的状态转化为字符串,也可以将字符串还原为对象.方法:JSON.stringify(),用来序列化,JSON.parse(),用来还原对象. JSON(JavaScript Object Notation),即JavaScript对象表示法.var o = {x:1}; var s = JSON.stringify(o);  //s是o的深拷贝 var p = JSON.parse(s); //p是s的深拷贝 对象方法:1,toString() //返回对象值的字符串

es6 javascript对象方法Object.assign()

es6 javascript对象方法Object.assign() 2016年12月01日 16:42:34 阅读数:38583 1  基本用法 Object.assign方法用于对象的合并,将源对象( source )的所有可枚举属性,复制到目标对象( target ). [javascript] view plain copy var target = { a: 1 }; var source1 = { b: 2 }; var source2 = { c: 3 }; Object.assig

JavaScript 对象拷贝

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

JavaScript 对象

JavaScript 中的所有事物都是对象:字符串.数值.数组.函数... 此外,JavaScript 允许自定义对象. JavaScript 对象 JavaScript 提供多个内建对象,比如 String.Date.Array 等等. 对象只是带有属性和方法的特殊数据类型. 建 JavaScript 对象 通过 JavaScript,您能够定义并创建自己的对象. 创建新对象有两种不同的方法: 定义并创建对象的实例 使用函数来定义对象,然后创建新的对象实例

javascript对象简介

javascript对象可分为三大类: 1.javascript本地对象和内置对象 2.浏览器对象(BOM) 3.文档对象(DOM) 一:javascript内置对象 1.Array(数组对象) 2.Number(数字对象) 3.String(字符串对象) 4.Boolean(布尔对象) 5.Math(数学对象) 6.RegExp(正则对象) 7.Date(日期时间对象) 二:浏览器对象(BOM) 1.Window对象: 2.Screen对象:可以获取屏幕的信息 3.Navigator:可以获取