JavaScript学习笔记——浅拷贝、深拷贝
参考自:http://www.cnblogs.com/yichengbo/archive/2014/07/10/3835882.html
一、数组的深浅拷贝
在使用JavaScript对数组进行操作的时候,我们经常需要将数组进行备份,事实证明如果只是简单的将它赋予其他变量,那么我们只要更改其中的任何一个,然后其他的也会跟着改变,这就导致了问题的发生。
var arr01 = ["One","Two","Three"];
var arrt02 = arr01;
arrt02[1] = "test";
console.log("arr01:" + arr01); //One,test,Three
console.log("arr02:" + arrt02); //One,test,Three
像上面的这种直接赋值的方式就是浅拷贝,很多时候,这样并不是我们想要得到的结果,其实我们想要的是arr的值不变。
方法一:js的slice方法
var arr01 = ["One","Two","Three"];
var arrt02 = arr01.slice(0);
arrt02[1] = "test";
console.log("arr01:" + arr01); //One,Two,Three
console.log("arr02:" + arrt02); //One,test,Three
方法二:js的concat方法
var arr01 = ["One","Two","Three"];
var arrt02 = arr01.concat();
arrt02[1] = "test";
console.log("arr01:" + arr01); //One,Two,Three
console.log("arr02:" + arrt02); //One,test,Three
二、对象的深拷贝
var a={name:'yy',age:26};
var b={}; b = deepCopy(a);
b.name = 'zz';
console.log(b); //Object { name="zz", age=26}
console.log(a); //Object { name="yy", age=26} //定义对象的深拷贝方法
function deepCopy(obj) {
var result={};
for (var k in obj) {
result[k] = obj[k] instanceof Object ? deepCopy(obj[k]) : obj[k];
}
return result;
}
三、兼容数组和对象深拷贝的综合方法
var snail01 = {
name:'奔跑的蜗牛',
age:'26',
like:{
fruit:'orange',
sport:'football'
}
}
// 创建深拷贝方法
function deepCopy(obj){
var result,b; //result:存储拷贝数据,b:存储是否为数组的布尔值
b = obj instanceof Array;
if(obj instanceof Array || obj instanceof Object){
result = b ? [] : {};
for(var k in obj){
if(obj[k] instanceof Array || obj[k] instanceof Object){
result[k] = deepCopy(obj[k]);
}else{
result[k] = obj[k];
}
}
}
return result;
} var snail02 = deepCopy(snail01);
snail02.name = 'running snail02';
snail02.like.fruit = 'banana'; console.log(snail02); // Object { name="running snail02", age="26", like=Object { fruit="banana", sport="football"}}
console.log(snail01); // Object { name="奔跑的蜗牛", age="26", like=Object { fruit="orange", sport="football"}}
JavaScript学习笔记——浅拷贝、深拷贝的更多相关文章
- Java程序猿的JavaScript学习笔记(汇总文件夹)
最终完结了,历时半个月. 内容包含: JavaScript面向对象特性分析,JavaScript高手必经之路. jQuery源代码级解析. jQuery EasyUI源代码级解析. Java程序猿的J ...
- Java程序猿的JavaScript学习笔记(8——jQuery选择器)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿JavaScript学习笔记(2——复制和继承财产)
计划和完成在这个例子中,音符的以下序列: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaSc ...
- Java程序猿的JavaScript学习笔记(3——this/call/apply)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿JavaScript学习笔记(4——关闭/getter/setter)
计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...
- Java程序猿JavaScript学习笔记(14——扩大jQuery UI)
计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...
- javascript学习笔记(四) Number 数字类型
数字格式化方法toFixed().toExponential().toPrecision(),三个方法都四舍五入 toFixed() 方法指定小数位个数 toExponential() 方法 用科学 ...
- JavaScript学习笔记之数组(二)
JavaScript学习笔记之数组(二) 1.['1','2','3'].map(parseInt) 输出什么,为什么? ['1','2','3'].map(parseInt)//[1,NaN,NaN ...
- JavaScript学习笔记[0]
JavaScript学习笔记[0] 使用的是廖雪峰JavaScript教程. 数据类型 Number 表示数字,不区分浮点整形. === 比较时不转化数据类型. == 反之. NaN与任何值都不想等, ...
随机推荐
- grunt in webstorm
1.install grunt sudo npm install -g grunt-cli npm install grunt --save-dev
- python 推导式的用法
推导式看了不少,可每次都有新发现 例子1:返回满足条件为真,否则为假 try_list = [1, 2, 3, 4, 5] # 前2种一样, [a > 3 for a in b] [True i ...
- FreeRTOS软件定时器的使用
先贴上一个创建的代码,先声明一个句柄 TimerHandle_t pump_wakeup_timer_handle = NULL; 创建定时器和启动定时器,第三个参数,pdFALSE是只定时一次,pd ...
- node 发送 post 请求 get请求。
因为我们部门打算用node请求restful 然后慢慢替换掉服务端,以后直接请求soa的接口,让前端的数据更贴切项目,因为我们服务端接口和app公用一套,由于业务的需求和版本不统一(例如app6.4的 ...
- 『Python Kivy』官方乒乓球游戏示例解析
本篇文章用于对Kivy框架官方所给出的一个「乒乓球」小游戏的源码进行简单地解析.我会尽可能的将方方面面的内容都说清楚.在文章的最下方为官方所给出的这个小游戏的教程以及游戏源码. 由于篇幅所限,本文只简 ...
- Python 3基础教程23-多维列表
这里简单举例一个多维列表,多维看起来都很晕. # 多维列表 x = [ [5,6],[6,7],[7,2] ,[2,5] ,[4,9]] print(x) # 根据索引引用列表元素,例如打印[6,7] ...
- fiddler之弱网测试
今天就说一下如何使用fiddler做弱网测试 1.首先要把手机的代理打开,这就不多讲了哈,不懂得话请点传送门:https://www.cnblogs.com/fuxinxin/p/9146693.ht ...
- 1018 Public Bike Management (30 分)(图的遍历and最短路径)
这题不能直接在Dijkstra中写这个第一 标尺和第二标尺的要求 因为这是需要完整路径以后才能计算的 所以写完后可以在遍历 #include<bits/stdc++.h> using n ...
- Python 学习笔记之 Numpy 库——文件操作
1. 读写 txt 文件 a = list(range(0, 100)) a = np.array(a) # a.dtype = np.int64 np.savetxt("filename. ...
- 解决:Unable to execute dex: GC overhead limit exceeded
转自http://blog.sina.com.cn/s/blog_6e334dc70101hnug.html Android打包时下面的错误: Unable to execute dex: GC ov ...