深拷贝
2015-07-13 21:22
225 查看
要讲javascript的拷贝,就得先讲讲javascript中的值传递和引用传递。
javascript中没有一个具体的语法来规定哪些参数是引用传递,而其他语言中都有明文规定,比如 C# 中的 ref 和 PHP 中的 & 。
这也是javascript众多弊端中的一个。
我们先看看下面这段代码:
说明,javascript中只有简单类型是值传递,而其他复杂类型比如数组、对象都是默认就是引用传递的。
那么我们如果需要复制一个对象呢?就必须自己定义方法:
其实就是通过实例化一个新的对象,从而在堆中开辟一块新的内存空间,使得栈中的变量名指向堆中的新内容。
javascript中没有一个具体的语法来规定哪些参数是引用传递,而其他语言中都有明文规定,比如 C# 中的 ref 和 PHP 中的 & 。
这也是javascript众多弊端中的一个。
我们先看看下面这段代码:
//值传递 var i = 3; var j = i; j = 4; document.write(i);//3 //引用传递 var m = [1]; var n = m; n[0] = 2; document.write(n[0]);//2
说明,javascript中只有简单类型是值传递,而其他复杂类型比如数组、对象都是默认就是引用传递的。
那么我们如果需要复制一个对象呢?就必须自己定义方法:
//深度拷贝函数,其实就是值传递 function cloneObject(srcobj){ var tarobj=new Object(); for(var key in srcobj){//判断对象中是否继续为对象 tarobj[key]=typeof srcobj[key]==='object'?cloneObject(srcobj[key]):srcobj[key]; } return tarobj; } //验证深度拷贝函数的使用 // 测试用例: var srcObj = { a: 1, b: { b1: ["hello", "hi"], b2: "JavaScript" } }; var abObj = srcObj;//引用传递 var tarObj = cloneObject(srcObj); srcObj.a = 2; srcObj.b.b1[0] = "Hello"; console.log(abObj.a);//2 console.log(abObj.b.b1[0]);//Hello,说明普通的=是一种引用传递 console.log(tarObj.a); // 1 console.log(tarObj.b.b1[0]); // "hello",说明我们定义的深拷贝是值传递
其实就是通过实例化一个新的对象,从而在堆中开辟一块新的内存空间,使得栈中的变量名指向堆中的新内容。
相关文章推荐
- Hello Indigo
- FireDac 的数据库批量语句提交(高效)
- Leetcode #39 Combination Sum
- POJ 2226 Muddy Fields(最小顶点覆盖)
- 实习第九天
- mongodb 3.0启动后的问题
- 一个使用 log4j 的实战手册
- std::bind 重载绑定
- Maximum Product Subarray
- 安卓前端如何与.net后端通信(一)
- hihocoder#1066 : 无间道之并查集
- Python读写文件
- 菜鸟vimer成长记——第1章、统一概念
- Volley框架下发送和读取Cookie
- 基本数据结构之堆
- 线段树多lazy-tag(两个)
- 列表生成式
- linux find命令小结
- 敏捷宣言
- CSU 1506 Double Shortest Paths(最小费用流)