JavaScript的深度克隆
1.JavaScript的五种基本数据类型:
Number、String、Boolean、null、undefined。
2.typeof返回的六种数据类型:
Number、String、Boolean、undefined、function、object。
其中object
为复式数据类型,它包含null,array,json等复式数据。
3.对象(object)引用
对象类型(复式数据类型)在内存空间中只占一个内存空间,其变量名就是对该对象所在空间的地址的引用。
var b=a=[1,2,3];//a和b都指向同一个对象[1,2,3]
b[3]=4;//通过b“指针”改变内存中对象[1,2,3]的值
console.log(a);//[1,2,3,4]
console.log(b);//[1,2,3,4]
因此要实现与原对象的完全脱离,即使对新对象修改也不会影响到原对象,必须对对象进行深度克隆
。
4.深度克隆
如下一个json对象,包含各种数据类型。通过clone()函数可实现json对象的克隆,在内存中产生两个一样的数据对象。
var json={
"a":123,
"b":"abc",
"c":true,
"d":function(){alert(1)},
"e":null,
"f":{
"a1":123,
"b1":"aabbcc"},
"g":[1,2,"aabb"],
"i":undefined,
"中国":"中国"
};
function clone(obj) {//克隆函数
var cloneObj;
/*判断类型*/
if (obj.constructor === Array) {
cloneObj = [];//数组
} else {
cloneObj = {};//json
}
/*开始克隆*/
for(var i in obj){
if(typeof obj[i]=="object"){//如果是复式数据类型,object包含null
if(obj[i]===null){//进行判断
cloneObj[i]=null;
}else{
cloneObj[i]=clone(obj[i]);//递归
}
}else{//不是复式数据类型
cloneObj[i] = obj[i];//直接赋值
}
}
return cloneObj;//返回
}
JavaScript的深度克隆的更多相关文章
- javascript最新深度克隆对象方法
javascript最新深度克隆对象方法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu ...
- [转载] javascript实现深度克隆
js一般有两种不同数据类型的值: 基本类型(包括undefined,Null,boolean,String,Number),按值传递: 引用类型(包括数组,对象),按址传递,引用类型在值传递的时候是内 ...
- 原生JavaScript之深度克隆
先看一下克隆成功后的结果 深度克隆就是将obj的属性克隆到obj1上面,并且在obj上面修改属性不影响obj1上面的属性. 1.先把所有的值都遍历一遍(看是引用值和原始值)用for ( var pro ...
- javascript构造函数深度克隆递归
<script type="text/javascript"> var obj={ name:'段丛磊', gex:18, sss:['李伟',18], fun:fun ...
- JavaScript实现对象的深度克隆及typeof和instanceof【简洁】【分享】
JavaScript实现对象的深度克隆 代码实现如下: <!DOCTYPE html> <html lang="en"> <head> < ...
- javascript中对象的深度克隆
记录一个常见的面试题,javascript中对象的深度克隆,转载自:http://www.2cto.com/kf/201409/332955.html 今天就聊一下一个常见的笔试.面试题,js中对象的 ...
- javascript深度克隆与javascript的继承实现
1.javascript深度克隆: //注意这里的对象包括object和array function cloneObject(obj){ var o = obj.constructor === Arr ...
- Javascript深度克隆一个对象
Javascript中的对像赋值与Java中是一样的,都为引用传递.就是说,在把一个对像赋值给一个变量时,那么这个变量所指向的仍就是原来对 像的地址.那怎么来做呢?答案是“克隆”. 克隆有两种方法:一 ...
- javascript深度克隆函数deepClone
javascript深度克隆函数deepClone function deepClone(obj) { var _toString = Object.prototype.toString; // nu ...
随机推荐
- Android程序的入口点
原文:Android程序的入口点 android应用程序,由一到多个Activity组成.每个Activity没有很紧密的联系,因为我们可以在自己的程序中调用其它Activity,特别是调用自己的代码 ...
- Robot Framework作者建议如何选择自动化测试框架
本文摘自:InfoQ中文站http://www.infoq.com/cn/news/2012/06/robot-author-suggest-autotest Robot Framework作者建议如 ...
- PHPExcel 多工作表 导入
//参数初始化 $filePath = ''; if ($_FILES["file"]["error"] > 0) { returnJSON(ERROR_ ...
- Codechef Nuclear Reactors 题解
There are K nuclear reactor chambers labelled from 0 to K-1. Particles are bombarded onto chamber 0. ...
- python <tab>自动补全
1.获取python目录[我使用的是64位ubuntu系统] [~$]python Python 2.7.3 (default, Apr 10 2013, 06:20:15) [GCC 4.6.3] ...
- 如何在VMware虚拟机上安装Linux操作系统(Ubuntu)
作为初学者想变为计算机大牛非一朝一夕,但掌握基本的计算机操作和常识却也不是多么难的事情.所以作为一名工科男,为了把握住接近女神的机会,也为了避免当白痴,学会装系统吧!of course为避免把自己的电 ...
- a simple erlang process pool analysis
a simple erlang process pool analysis 这是一个简单的erlang进程池分析,是learn you some erlang for Great Good 里面的一个 ...
- Ajax或JS动态添加的元素,Jquery效果不起作用
问题: 最近在做一个Ajax分页的功能,遇到一个问题 一开始jquery效果是可用的,但是,ajax执行一次之后,jquery效果就无效了. 解决办法: 可以添加live事件来解决 W3C关于live ...
- Visual Studio之Nuget(服务器)
一.创建空Web项目 二.安装Nuget.Server 这个时候,安装完成后,发现项目文件里多了Default.aspx等文件,因为我选择的MVC,所以最好做下小小的调整 ——在Global.asax ...
- Streams Studio配置Build options
Defining build options You can change the build options of the internal builder for building an SPL ...