浅拷贝和深拷贝相对于引用类型而言的。

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浅拷贝(地址引用)和深拷贝(克隆)的更多相关文章

  1. 关于JS浅拷贝和深拷贝

    在 JS 中有一些基本类型像是Number.String.Boolean,而对象就是像这样的东西{ name: 'Larry', skill: 'Node.js' },对象跟基本类型最大的不同就在于他 ...

  2. [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)

    operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...

  3. JavaScript中:地址引用的特性,导致静态初始值被修改

    问题分类 JavaScript,值引用,地址引用 问题描述 开发过程中,服务端将静态配置数据从mysql数据库中读取到内存中,方便调用. 在实现流派功能时,需从数据库中读取流派种类数据到内存中,由于其 ...

  4. 前端总结·基础篇·JS(二)数组深拷贝、去重以及字符串反序和数组(Array)

    目录 这是<前端总结·基础篇·JS>系列的第二篇,主要总结一下JS数组的使用.技巧以及常用方法. 一.数组使用 1.1 定义数组 1.2 使用数组 1.3 类型检测 二.常用技巧 2.1 ...

  5. JavaScript进阶(二)在一个JS文件中引用另一个JS文件

    在一个JS文件中引用另一个JS文件       转载地址:http://blog.csdn.net/zndxlxm/article/details/7875787 方法一 在调用文件的顶部加入下例代码 ...

  6. Excel应该这么玩——2、命名列:消除地址引用

    命名列:通过名称引用列,让公式更容易理解. 下面继续举上次的栗子. 1.历史遗留问题 之前虽然把数字编成了命名单元格,但其中还是有单元格地址B2.C2之类,要理解公式需要找到对应的列标题. 特别是像下 ...

  7. js对象的引用

    /*var a = [1,2,3]; var b = [1,2,3]; alert( a == b ); //false*/ //基本类型:赋值的时候只是值得复制 /* var a = 5; var ...

  8. java 关于值引用、地址引用的问题

    8种基本引用类型 四种整数类型(byte.short.int.long) 两种浮点数类型(float.double) 一种字符类型(char) 一种布尔类型(boolean) 以及如String, f ...

  9. javascript地址引用

    javascript地址引用 var a = new Object(); a.price = ; var b = a; b.price = ; //b更改了属性值,a的属性值一起会被改变 alert( ...

随机推荐

  1. F - Count the Colors(线段树)

    Painting some colored segments on a line, some previously painted segments may be covered by some th ...

  2. 牛客小白月赛30 J.小游戏 (DP)

    题意:给你一组数,每次可以选择拿走第\(i\)个数,得到\(a[i]\)的分数,然后对于分数值为\(a[i]-1\)和\(a[i]+1\)的值就会变得不可取,问能得到的最大分数是多少. 题解:\(a[ ...

  3. hdu3033 I love sneakers!

    Problem Description After months of hard working, Iserlohn finally wins awesome amount of scholarshi ...

  4. Educational Codeforces Round 56 (Rated for Div. 2) D. Beautiful Graph (二分图染色)

    题意:有\(n\)个点,\(m\)条边的无向图,可以给每个点赋点权\({1,2,3}\),使得每个点连的奇偶不同,问有多少种方案,答案对\(998244353\)取模. 题解:要使得每个点所连的奇偶不 ...

  5. 【.NET 与树莓派】让喇叭播放音乐

    如果你和老周一样,小时候特别喜欢搞破坏(什么电器都敢拆),那下面这样小喇叭你一定见过. 这种喇叭其实以前很多录音机都用,包括上小学时买来做英语听力的便携录音机.嗯,就是放录音带的那种,录音带也叫磁带或 ...

  6. leetcode 12 整数转罗马数字 贪心

    额,连着两个贪心? 这是局部最优问题:能用大"罗马数表示"就不会用小的. 先构造出所有基础罗马数,然后从大到小比较 因为比较的只有1000,900,...有限并有些麻烦,构造tab ...

  7. Git使用出现Automatic merge failed; fix conflicts and then commit the result.解决方法

    产生原因 首先这个问题产生的原因是因为你git pull 的时候会分为两步,第一步先从远程服务器上拉下代码,第二步进行merge,但是merge时候失败了就会产生上述问题. 解决方法: 丢弃本地提交, ...

  8. How to get the real screen size(screen resolution) by using js

    How to get the real screen size(screen resolution) by using js 获取用户屏幕的真实像素分辨率, 屏幕实际尺寸 window.deviceP ...

  9. Django : Security in Django

    Security in Django https://docs.djangoproject.com/en/1.10/topics/security/ 1 Cross site scripting (X ...

  10. 编程术语 All In One

    编程术语 All In One js 名词,术语 函数 函数签名 一个函数签名 (或类型签名,或方法签名) 定义了 函数 或 方法 的输入与输出. 一个签名可以包括: 参数 及参数的 类型 一个返回值 ...