js对象简单、深度克隆(复制)
javascript的一切实例都是对象,只是对象之间稍有不同,分为原始类型和合成类型。原始类型对象指的是字符串(String)、数值(Number)、布尔值(Boolean),合成类型对象指的是数组(Array)、对象(Object)、函数(Function)。
既然对象分为这两类,他们之间的最大差别是复制克隆的差别。普通对象存储的是对象的实际数据,而引用对象存储的是对象的引用地址,而把对象的实际内容单独存放,因为引用对象通常比较庞大,这是数据开销和内存开销优化的手段。通常初学者很难理解这部分内容,就像对象的原型一样,也是同一个概念。对象的原型也是引用对象,把原型的方法和属性放在单独内存当中,而对象的原型链则指向这个内存地址。尽管这部分内容比较拗口复杂,那其中的原理都是一致的,目的也一致。
1、原始类型对象的克隆
1.1、字符串的克隆
- var x="1";
- var y=x;
- y="2";
- // "1"
- alert(x);
- // "2"
- alert(y);
1.2、数值的克隆
- var x=1;
- var y=x;
- y=2;
- // 1
- alert(x);
- // 2
- alert(y);
1.3、布尔值的克隆
- var x=true;
- var y=x;
- y=false;
- // true
- alert(x);
- // false
- alert(y);
2、合成类型对象的克隆
2.1、数组的克隆
如果采用普通克隆:
- var x=[1,2];
- var y=x;
- y.push(3);
- // 1,2,3
- alert(x);
- // 1,2,3
- alert(y);
由上可知,原始数组x,克隆数组y,修改了克隆数组y,但也同时修改了原始数组x,这就是引用对象的特点。那么如何才能达到完整的数组克隆呢?
- var x=[1,2];
- var y=[];
- var i=0;
- var j=x.length;
- for(;i<j;i++)
- {
- y[i]=x[i];
- }
- y.push(3);
- // 1,2
- alert(x);
- // 1,2,3
- alert(y);
这样,克隆数组y,原始数组x,两个数组互补干扰,实现了完整的数组克隆。
2.2、对象的克隆
和数组的克隆同理,对象的完整克隆如下:
- var x={1:2,3:4};
- var y={};
- var i;
- for(i in x)
- {
- y[i]=x[i];
- }
- y[5]=6;
- // Object {1: 2, 3: 4}
- console.log(x);
- // Object {1: 2, 3: 4, 5: 6}
- console.log(y);
2.3、函数的克隆
var x=function(){alert(1);};
var y=x;
y=function(){alert(2);};
// function(){alert(1);};
alert(x);
// y=function(){alert(2);};
alert(y);
函数的克隆,使用“=”符号就可以了,并且在改变克隆后的对象,不会影响克隆之前的对象,因为克隆之后的对象会单独复制一次并存储实际数据的,是真实的克隆。
3、完整的对象克隆
根据1和2,总结一下完整的对象克隆,包括克隆普通对象、引用对象。在写这个方法之前,我们必须想到的是,克隆引用对象必须采用完整克隆(深度克隆),包括对象的值也是一个对象也要进行完整克隆(深度克隆)。
完整的对象克隆又称为深度对象克隆、对象的深度克隆、对象的深度复制等等。
- function clone(obj)
- {
- var o,i,j,k;
- if(typeof(obj)!="object" || obj===null)return obj;
- if(obj instanceof(Array))
- {
- o=[];
- i=0;j=obj.length;
- for(;i<j;i++)
- {
- if(typeof(obj[i])=="object" && obj[i]!=null)
- {
- o[i]=arguments.callee(obj[i]);
- }
- else
- {
- o[i]=obj[i];
- }
- }
- }
- else
- {
- o={};
- for(i in obj)
- {
- if(typeof(obj[i])=="object" && obj[i]!=null)
- {
- o[i]=arguments.callee(obj[i]);
- }
- else
- {
- o[i]=obj[i];
- }
- }
- }
- return o;
- }
4、参考资料
js对象简单、深度克隆(复制)的更多相关文章
- js对象的深度克隆
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【JavaScript代码实现三】JS对象的深度克隆
function clone(Obj) { var buf; if (Obj instanceof Array) { buf = []; // 创建一个空的数组 var i = Obj.length; ...
- MyDAL - 引用类型对象 .DeepClone() 深度克隆[深度复制] 工具 使用
索引: 目录索引 一.API 列表 .DeepClone() 用于 Model / Entity / ... ... 等引用类型对象的深度克隆 特性说明 1.不需要对对象做任何特殊处理,直接 .Dee ...
- javascript中对象的深度克隆
记录一个常见的面试题,javascript中对象的深度克隆,转载自:http://www.2cto.com/kf/201409/332955.html 今天就聊一下一个常见的笔试.面试题,js中对象的 ...
- JAVA对象的深度克隆
有时候,我们需要把对象A的所有值复制给对象B(B = A),但是这样用等号给赋值你会发现,当B中的某个对象值改变时,同时也会修改到A中相应对象的值! 也许你会说,用clone()不就行了?!你的想法只 ...
- JavaScript实现对象的深度克隆及typeof和instanceof【简洁】【分享】
JavaScript实现对象的深度克隆 代码实现如下: <!DOCTYPE html> <html lang="en"> <head> < ...
- js对象/数组深度复制
今天碰到个问题,js对象.数组深度复制:之前有见过类似的,不过没有实现函数复制,今晚想了一下,实现代码如下: function clone(obj) { var a; if(obj instanceo ...
- JavaScript对象之深度克隆
也不知道从什么时候开始,前端圈冒出了个新词:对象深度克隆.看起来好像很高大上的样子,实际上并不新鲜,在我们的实际项目开发中,你可能早已用到,只不过由于汉字的博大精深,有些原本很简单的事物被一些看似专业 ...
- javascript对象的深度克隆
在做项目的时候需要向对象里面添加新属性,又不想修改原对象.于是就写: var newObj = oldObj,但是新对象属性改变后就对象也会跟着改变,这是因为无论是新对象还是旧对象,指向的内存地址都是 ...
随机推荐
- SharedPreferences概述
SharedPreferences概述 一.简介 SharedPreferences简介 上图紫色标注的部分为使用方法. SharedPreferences成员(属性和方法) 二.核心函数及使用实例 ...
- DH02-策略模式
模式简介 面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类. 策略模式(Strategy)定义了算法家族,分别封装起来,让他们相互间可 ...
- 小谈CSS定位
定义和用法 position 属性规定元素的定位类型. 说明 这个属性定义建立元素布局所用的定位机制.任何元素都可以定位,不过绝对或固定元素会生成一个块级框,而不论该元素本身是什么类型.相对定位元素会 ...
- 分享知识-快乐自己:HashMap 与 HashTable 的区别
特性: HashMap 与 Hashtable 的分析: 1):HashMap简介 1.底层数组+链表实现,可以存储null键和null值,线程不安全 2.HashMap 不是线程安全的 3.Hash ...
- MLPClassifier 隐藏层不包括输入和输出
多层感知机(MLP)原理简介 多层感知机(MLP,Multilayer Perceptron)也叫人工神经网络(ANN,Artificial Neural Network),除了输入输出层,它中间可以 ...
- iOS 检查指定日期是否在当前日期之前
iOS检查指定日期是否在当前日期之前, 直接上代码: - (BOOL)checkProductDate: (NSString *)tempDate { NSDateFormatter *dateFor ...
- Eclipse_插件_05_自动下载jar包源码插件
一.Java Source Attacher 1.下载 官网:http://marketplace.eclipse.org/content/java-source-attacher#.U5RmTePp ...
- 面试题46:求1+2+...+n
题目:求1+2+...+n,要求不能使用乘除法.for.while.if.else.swithc.case等关键字及条件判断语句(A?B:C). 解法一:利用构造函数求解 class Temp { p ...
- python_查找模块的方法
在python自带的Command Line中: 1. 查找一个模块拥有的方法 import 模块名 help(模块名) or dir(模块名) 2. 查找一个模块拥有的方法 import 模块名 h ...
- 3.4 常用的两种 layer 层 3.7 字体与文本
3.4 常用的两种 layer 层 //在cocos2d-x中,经常使用到的两种 layer 层 : CCLayer 和 CCLayerColor //CCLayer 的创建 CCLayer* la ...