var a = [1,2,3,4];
var b = a;
b[1] = 8;
console.log("a:" + a );//1,8,3,4
consloe.log("b:" + b);//1,8,3,4

上面的这种直接赋值的方式其实就是浅拷贝,但是上面打印的并我们想要得到的结果,其实我们想要的是a的值不变。所以这就需要用其他方式来解决

关于JS 的深拷贝:

数组深拷贝:

(1),slice

var a = [1,2,3,4];
var b = a.slice(0);
b[1] = 8;
console.log("a:" + a );//1,2,3,4
consloe.log("b:" + b);//1,8,3,4

(2),concat

var a = [1,2,3,4];
var b = a.concat();//连接一个空的
b[1] = 8;
console.log("a:" + a );//1,2,3,4
consloe.log("b:" + b);//1,8,3,4

对象深拷贝:

对象的深拷贝,就只能遍历整个对象,赋值给新的对象

var deep_copy= function(obj) { //对象深拷贝
var new_obj={};
for (var key in obj) {
new_obj[key] = typeof obj[key]===’object’? deep_copy(obj[key]): obj[key];//递归赋值
}
return new_obj;
}

关于AngularJs 的浅拷贝:

<div ng-app>
<div ng-controller="demoCtrl">
{{sample}}
</div>
</div>
function demoCtrl($scope){
var DeepCopy = function(data) {
angular.forEach(arguments, function(obj) {//遍历arguments-->即data
if (obj !== data) {
angular.forEach(obj, function(value, key) {
if(angular.isObject(data[key]) || angular.isArray(data[key])){
DeepCopy(data[key], value);
} else {
data[key] = angular.copy(value);
}
});
}
});
return data;
}; $scope.a = {
"one":11,"two":[
{
"name":"小明",
"age":13,
"items":[
{
"a":1,
"b":1,
"c":2
}
]
},
{
"age":24,
"items":[
{
"a":10,
"c":10
}
]
}
]
};
var b = {
"one":33, "two":[
{
"age":63,
"items":[
{
"a":88,
"b":88
}
]},
{
"age":14,
"items":[
{
"a":70,
"b":70
}
]
}
]
};
DeepCopy($scope.a,b);
}

结果:

{"one":33,"two":[{"name":"小明","age":63,"items":[{"a":88,"b":88,"c":2}]},{"age":14,"items":[{"a":70,"c":10,"b":70}]}]}

这样的对象深拷贝才满足要求,完美复制!

深拷贝/浅拷贝之Js / AngularJs的更多相关文章

  1. JS Object Deep Copy & 深拷贝 & 浅拷贝

    JS Object Deep Copy & 深拷贝 & 浅拷贝 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refe ...

  2. c# 内存的具体表现- 通用类型系统 深拷贝 浅拷贝 函数传参

    c# 通用类型系统 及变量在 深拷贝 浅拷贝 函数传参 中的深层次的表现 在编程中遇到了一些想不到的异常,跟踪发现,自己对于c#变量在内存上的表现理解有偏差,系统的学习并通过代码实验梳理了各种情况下, ...

  3. python集合增删改查,深拷贝浅拷贝

    集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系 ...

  4. JavaScript之深拷贝&浅拷贝

    深拷贝&浅拷贝,说起来都明白,但是说不出所以然.今天就系统的整理下思绪,一点点的将其分析出所以然 废话不多说 浅拷贝 简单的说就是一个值引用,学生时代接触过编程的人都应该了解过指针,浅拷贝可以 ...

  5. 【opencv】imread 赋值 深拷贝浅拷贝

    import cv2 import copy import os def filter_srcimg(dstimg): ss=3 srcimg=copy.deepcopy(dstimg) #aa=5 ...

  6. Java基础 深拷贝浅拷贝

    Java基础 深拷贝浅拷贝 非基本数据类型 需要new新空间 class Student implements Cloneable{ private int id; private String na ...

  7. 【04】Python 深拷贝浅拷贝 函数 递归 集合

    1 深拷贝浅拷贝 1.1 a==b与a is b的区别 a == b    比较两个对象的内容是否相等(可以是不同内存空间) a is b  比较a与b是否指向同一个内存地址,也就是a与b的id是否相 ...

  8. 一篇文章彻底说清JS的深拷贝/浅拷贝

    一篇文章彻底说清JS的深拷贝and浅拷贝 这篇文章的受众 第一类,业务需要,急需知道如何深拷贝JS对象的开发者. 第二类,希望扎实JS基础,将来好去面试官前秀操作的好学者. 写给第一类读者 你只需要一 ...

  9. Map拷贝 关于对象深拷贝 浅拷贝的问题

    问题:map拷贝时发现数据会变化. 高能预警,你看到的下面的栗子是不正确的,后面有正确的一种办法,如果需要看的话的,请看到底,感谢各同学的提醒,已做更正,一定要看到最后      先看例子:     ...

随机推荐

  1. 【CNMP系列】CNMP之路,系统起步。

    简单的来理解,我所说的CNMP,不是CNM+P,而是CentOs+Nginx+MySql+PHP,也可以单纯的理解为LNMP,但是系统是我们自己选的,虽说是Linux的一个分支,但我就喜欢CentOs ...

  2. 第十九篇 js高级知识---词法分析和AO 链

    上面一篇文章说了js的作用域链,这一节算是对上面的延申,有一个典型的例子,首先看原来的一段代码: var name = "test"; function t() { var b = ...

  3. 【转载】JavaScript继承详解一

    面向对象与基于对象 几乎每个开发人员都有面向对象语言(比如C++.C#.Java)的开发经验. 在传统面向对象的语言中,有两个非常重要的概念 - 类和实例. 类定义了一类事物公共的行为和方法:而实例则 ...

  4. MyBatis从入门到放弃一:从SqlSession实现增删改查

    前言 开博客这是第一次写系列文章,从内心上讲是有点担心自己写不好,写不全,毕竟是作为java/mybatis学习的过程想把学习的路线和遇到的问题都总结下来,也让知识点在脑海里能形成一个体系. 开发环境 ...

  5. 3步轻松搭建Unity3d安卓开发环境

    之前写过一个Untiy3d安卓开发环境的配置教程,那是我第一次学习配置安卓开发环境,互联网上的信息良莠不齐,自己当时也不懂,配置步骤麻烦的一塌糊涂,现在见的多了,也会的多了,配置安卓开发环境变得非常容 ...

  6. 3389: [Usaco2004 Dec]Cleaning Shifts安排值班

    3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 102  Solved: ...

  7. 2729: [HNOI2012]排队

    2729: [HNOI2012]排队 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 957  Solved: 449[Submit][Status] ...

  8. 1029: [JSOI2007]建筑抢修

    1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 2382  Solved: 1033[Submit][Statu ...

  9. UISearchController 搜索

    UISearchController实现搜索 通过 UISearchController 实现 UISearchResultsUpdating 这个委托实现上面的效果: 视图中中需要声明UISearc ...

  10. Python--校园网爬虫记

    查成绩,算分数,每年的综合测评都是个固定的过程,作为软件开发者,这些过程当然可以交给代码去做,通过脚本进行网络请求获取数据,然后直接进行计算得到基础分直接填表就好了,查成绩再手动计算既容易出错也繁琐, ...