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. 关于jquery中封装函数如何传递当前元素的问题

    需要对页面上一组元素进行ajax操作 <div id="aid"></div> <div id="aid"></div ...

  2. Error: Cannot find module 'gulp-clone'问题的解决

    安装完gulp环境,并且配置好gulpfile.js,执行静态文件压缩和代码混淆时,出现如下错误: Error: Cannot find module 'gulp-clone' Error: Cann ...

  3. 【Scala】Scala之Methods

    一.前言 前面学习了Scala的Class,下面接着学习Method(方法). 二.Method Scala的方法与Java的方法类似,都是添加至类中的行为,但是在具体的实现细节上差异很大,下面展示一 ...

  4. 每天一个linux命令(32)--/etc/group文件详解

    Linux /etc/group 文件与 /etc/passwd 和/etc/shadow 文件都是有关于系统管理员对用户和用户组管理时相关的文件.Linux /etc/group 文件是有关于系统管 ...

  5. Lambda表达式和Java集合框架

    本文github地址 前言 我们先从最熟悉的Java集合框架(Java Collections Framework, JCF)开始说起. 为引入Lambda表达式,Java8新增了java.util. ...

  6. [HDU 2102] A计划(搜索题,典型dfs or bfs)

    A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  7. ajax bookstrap美化网页,并实现页面的加载,删除与查看详情

    Bookstrap:美化页面: Bootstrap是Twitter推出的一个开源的用于前端开发的工具包.它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS ...

  8. JSON对象转换成字符串【JSON2.JS】

    下载地址 https://github.com/douglascrockford/JSON-js JSON.JS和JSON2.JS的区别 JSON.JS使用的方法名称不同,用的是toJSONStrin ...

  9. .net平台的MongoDB使用

    前言 最近花了点时间玩了下MongoDB.Driver,进行封装了工具库,平常也会经常用到MongoDB,因此写一篇文章梳理知识同时把自己的成果分享给大家. 本篇会设计到Lambda表达式的解析,有兴 ...

  10. Sublime 常用快捷键

    Ctrl+Shift+P:打开命令面板 Ctrl+P:搜索项目中的文件 Ctrl+G:跳转到第几行 Ctrl+W:关闭当前打开文件 Ctrl+Shift+W:关闭所有打开文件 Ctrl+Shift+V ...