js浅拷贝(地址引用)和深拷贝(克隆)
浅拷贝和深拷贝相对于引用类型而言的。
js有两大类型值类型(基本数据类型)和引用类型(object,function,array);
值类型保存在栈上,引用类型保存在堆上。
浅拷贝只是单纯的拷贝对象的地址。
//对象的浅拷贝
var aa = { name: 'aa', age: 26, dx: { dxName: 'dxName', dxAge: 24 } };
var bb = aa;
console.log(bb===aa); //true //这里表示是指向的同一个地址
console.log(bb.name); //aa
bb.name='bb';
console.log(aa.name); //bb
console.log(bb.name); //bb

对象保存在堆上面,而aa变量只是保存的aa对象的地址6ff65a1c;
bb=aa只是把地址6ff65a1c给了bb,所以指向的还是同一个对象,所以改了bb.name,aa.name也跟着变化了。
深拷贝是把对象完全复制一份。
var a = { name: 'aa', age: 26, dx: { dxName: 'dxName', dxAge: 24 } };
var b = new Object();
b.name = a.name;
b.age = a.age;
b.dx = {}; //开辟一块空间,然后复制
b.dx.dxName=a.dx.dxName;
b.dx.dxAge=a.dx.dxAge;
b.name = 'bb';
b.dx.dxAge = 30;
console.log(a===b);
console.log('a');
console.log(a);
console.log('b');
console.log(b);


由于b是拿到的是a的一个副本,所以改变b不会影响的a
var deepCopy = function (source) { //深拷贝函数
var result = {};
for(var key in source) {
//递归把object类型的值复制出来,这里没考虑function类型
result[key] = typeof(source[key]) === 'object' ? deepCopy(source[key]) : source[key];
}
return result;
}
var a = { name: 'aa', age: 26, dx: { dxName: 'dxName', dxAge: 24 } };
/*var b = new Object();
b.name = a.name;
b.age = a.age;
b.dx = {}; //开辟一块空间,然后复制
b.dx.dxName=a.dx.dxName;
b.dx.dxAge=a.dx.dxAge;*/
var b=deepCopy(a);
b.name = 'bb';
b.dx.dxAge = 30;
console.log(a===b);
console.log('a');
console.log(a);
console.log('b');
console.log(b);
数组的浅拷贝和深拷贝
//数组浅拷贝
var arr = ["One", "Two", "Three"];
var arrto = arr;
arrto[1] = "test";
document.writeln("数组的原始值:" + arr + "<br />"); //Export:数组的原始值:One,test,Three
document.writeln("数组的新值:" + arrto + "<br />"); //Export:数组的新值:One,test,Three //数组深拷贝
var arr2 = ["One", "Two", "Three"];
var arrtoo = arr.slice(0);
arrtoo[1] = "set Map";
document.writeln("数组的原始值:" + arr2 + "<br />"); //Export:数组的原始值:One,Two,Three
document.writeln("数组的新值:" + arrtoo + "<br />"); //Export:数组的新值:One,set Map,Three
js浅拷贝(地址引用)和深拷贝(克隆)的更多相关文章
- 关于JS浅拷贝和深拷贝
在 JS 中有一些基本类型像是Number.String.Boolean,而对象就是像这样的东西{ name: 'Larry', skill: 'Node.js' },对象跟基本类型最大的不同就在于他 ...
- [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)
operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...
- JavaScript中:地址引用的特性,导致静态初始值被修改
问题分类 JavaScript,值引用,地址引用 问题描述 开发过程中,服务端将静态配置数据从mysql数据库中读取到内存中,方便调用. 在实现流派功能时,需从数据库中读取流派种类数据到内存中,由于其 ...
- 前端总结·基础篇·JS(二)数组深拷贝、去重以及字符串反序和数组(Array)
目录 这是<前端总结·基础篇·JS>系列的第二篇,主要总结一下JS数组的使用.技巧以及常用方法. 一.数组使用 1.1 定义数组 1.2 使用数组 1.3 类型检测 二.常用技巧 2.1 ...
- JavaScript进阶(二)在一个JS文件中引用另一个JS文件
在一个JS文件中引用另一个JS文件 转载地址:http://blog.csdn.net/zndxlxm/article/details/7875787 方法一 在调用文件的顶部加入下例代码 ...
- Excel应该这么玩——2、命名列:消除地址引用
命名列:通过名称引用列,让公式更容易理解. 下面继续举上次的栗子. 1.历史遗留问题 之前虽然把数字编成了命名单元格,但其中还是有单元格地址B2.C2之类,要理解公式需要找到对应的列标题. 特别是像下 ...
- js对象的引用
/*var a = [1,2,3]; var b = [1,2,3]; alert( a == b ); //false*/ //基本类型:赋值的时候只是值得复制 /* var a = 5; var ...
- java 关于值引用、地址引用的问题
8种基本引用类型 四种整数类型(byte.short.int.long) 两种浮点数类型(float.double) 一种字符类型(char) 一种布尔类型(boolean) 以及如String, f ...
- javascript地址引用
javascript地址引用 var a = new Object(); a.price = ; var b = a; b.price = ; //b更改了属性值,a的属性值一起会被改变 alert( ...
随机推荐
- poj3252 Round Numbers (数位dp)
Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, P ...
- Strongly connected HDU - 4635 原图中在保证它不是强连通图最多添加几条边
1 //题意: 2 //给你一个有向图,如果这个图是一个强连通图那就直接输出-1 3 //否则,你就要找出来你最多能添加多少条边,在保证添加边之后的图依然不是一个强连通图的前提下 4 //然后输出你最 ...
- 踏上Revit二次开发之路 2 从“HelloWorld”入手
2 从"HelloWorld"入手 在欧特克的官方网页上有个叫<My First Plug-in Training>的项目,号称可以让一个完全没有编程基础的人照着做出一 ...
- Go - 实现项目内链路追踪(二)
上篇文章 Go - 实现项目内链路追踪 分享了,通过 链路 ID 可以将 请求信息.响应信息.调用第三方接口的信息.调试信息.执行的 SQL 信息.执行的 Redis 信息 串起来,记录的具体参数在文 ...
- 图解算法——恢复一棵二叉搜索树(BST)
题目来源 基础:给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换.请在不改变其结构的情况下,恢复这棵树. 进阶:使用 O(n) 空间复杂度的解法很容易实现.你能想出一个只使用常数空间的 ...
- cookie,session,token之间的联系与区别
发展史 1.很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, 就是请求加响应, 尤其是我不用 ...
- 牛客多校第三场J LRU management(双向链表)题解
题意: 给一个长度为\(m\)的队列,现给定以下操作: \(opt=0\),插入一个串,如果不在队里直接插入栈尾,如果超出\(m\)删队首:在队里就拿出来重新放到队尾,返回\(v\)值. \(opt= ...
- HDU 6155 Subsequence Count(矩阵 + DP + 线段树)题解
题意:01串,操作1:把l r区间的0变1,1变0:操作2:求出l r区间的子序列种数 思路:设DP[i][j]为到i为止以j结尾的种数,假设j为0,那么dp[i][0] = dp[i - 1][1] ...
- Lenet车牌号字符识别+保存模型
# 部分函数请参考前一篇或后一篇文章 import tensorflow as tf import tfrecords2array import numpy as np import matplotl ...
- VirtualBox All in One
VirtualBox All in One 虚拟机 / VM / Virtual Machine x86 and AMD64/Intel64 VirtualBox is a powerful x86 ...