一、浅拷贝

浅拷贝在现实中最常见的表现在赋值上面,例如

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试</title>
</head>
<body>
<script type="text/javascript">
//第一个数组
var test=["1","2","3"];
//第二个数组
var test2=[];
test2=test;
test2[1]="two";
console.log(test);//运行的结果是["1","two","3"]
</script>
</body>
</html>

从上面的例子,我们修改test2数组的值,最后打印test数组,发现test也跟着改变了。

其实这个就是一个最浅的浅拷贝,相当于test2=test这个阶段是在将test数组中的存储地址索引赋值给test2数组,所以两个数组都是指向同一块存储地址中去。

除了这种方法可以实现浅拷贝,还有使用sliceconcat进行浅拷贝

例如:我们测试一次slice这个方法(可从已有的数组中返回选定的元素为新数组

<script type="text/javascript">
var arr=["demo1","demo2","demo3"];
var arr2=arr.slice(0);
arr2[1]="test";
console.log(arr);//["demo1","demo2","demo3"]
console.log(arr2);//["demo1","test","demo3"]
</script>

从上面的例子我们可以看出,使用slice方法对数组进行了深度拷贝,

同理,concat的用法如下(用于连接两个或多个数组为新数组)

<script type="text/javascript">
var arr=["demo1","demo2","demo3"];
var arr2=arr.concat();
arr2[1]="test";
console.log(arr);//["demo1","demo2","demo3"]
console.log(arr2);//["demo1","test","demo3"]
</script>

为何这样已经算得上是深拷贝的东西,我又称之为浅拷贝呢?

对于Slice和concat这两个方法来说都是浅拷贝,只能深拷贝数组中的第一层

当数组内为对象时,则是浅拷贝

二、深拷贝

1.通过内置的js函数

function deepCopy(o){
return JSON.parse(JSON.stringify(o));
}
var a = {a:1,b:2,c:3};
var b = deepCopy(a);
b.a = 4;
alert(a.a); //1
alert(b.a); //4,将b.a赋值为4,不会影响到a对象,a.a仍是1

这种方式很好理解,对一个Object对象而言,

先使用内置的JSON.stringify()函数,将其转化为字符串       "{"a":1,"b":2}"

此时生成的字符串已经和原对象没有任何联系了,再通过JSON.parse()函数,将生成的字符串转化为一个新的对象。 {a: 1, b: 2}

而在新对象上的操作与旧对象是完全独立的,不会相互影响。这种方法的优点就是简单易懂,使用js内置函数来实现,不需要太大的开销。

2.以通过自己的方法实现,就是遍历数组或对象,返回新数组或者对象。

var simpleCopy = function(o){
if (o instanceof Array) {
var n = [];
for (var i = ; i < o.length; ++i) {
n[i] = o[i];
}
return n;
} else if (o instanceof Object) {
var n = {}
for (var i in o) {
n[i] = o[i];
}
return n;
}
}

3.如何实现拷贝包含对象或者数组的这种情况呢?那么就通过递归拷贝来实现。

var deepCopy = function(o) {
if (o instanceof Array) {
var n = [];
for (var i = ; i < o.length; ++i) {
n[i] = deepCopy(o[i]);
}
return n; } else if (o instanceof Object) {
var n = {}
for (var i in o) {
n[i] = deepCopy(o[i]);
}
return n;
} else {
return o;
}
}

javascript浅拷贝深拷贝详解的更多相关文章

  1. js对象浅拷贝和深拷贝详解

    js对象浅拷贝和深拷贝详解 作者:i10630226 字体:[增加 减小] 类型:转载 时间:2016-09-05我要评论 这篇文章主要为大家详细介绍了JavaScript对象的浅拷贝和深拷贝代码,具 ...

  2. java 深拷贝与浅拷贝机制详解

    概要: 在Java中,拷贝分为深拷贝和浅拷贝两种.java在公共超类Object中实现了一种叫做clone的方法,这种方法clone出来的新对象为浅拷贝,而通过自己定义的clone方法为深拷贝. (一 ...

  3. 从mixin到new和prototype:Javascript原型机制详解

    从mixin到new和prototype:Javascript原型机制详解   这是一篇markdown格式的文章,更好的阅读体验请访问我的github,移动端请访问我的博客 继承是为了实现方法的复用 ...

  4. JavaScript严格模式详解

    转载自阮一峰的博客 Javascript 严格模式详解   作者: 阮一峰 一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict m ...

  5. [转]javascript console 函数详解 js开发调试的利器

    javascript console 函数详解 js开发调试的利器   分步阅读 Console 是用于显示 JS和 DOM 对象信息的单独窗口.并且向 JS 中注入1个 console 对象,使用该 ...

  6. javascript 节点属性详解

    javascript 节点属性详解 根据 DOM,html 文档中的每个成分都是一个节点 DOM 是这样规定的:整个文档是一个文档节点每个 html 标签是一个元素节点包含在于 html 元素中的文本 ...

  7. (" use strict")Javascript 严格模式详解

    Javascript 严格模式详解 转载别人的博客内容,浏览了一遍,没有全部吸收,先保存一下链接 http://www.ruanyifeng.com/blog/2013/01/javascript_s ...

  8. 【HANA系列】SAP HANA XS使用JavaScript数据交互详解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA XS使用Jav ...

  9. JavaScript运行机制详解

    JavaScript运行机制详解   var test = function(){ alert("test"); } var test2 = function(){ alert(& ...

随机推荐

  1. webpack之牛刀小试 打包并压缩html、js

    1.创建项目文件夹test,在文件夹下创建src文件夹用来存放源码,在src文件夹下创建index.html/index.js两件文件. 我们的最终目的是将这两个文件打包压缩并输出到/test/dis ...

  2. Python selenium webdriver设置加载页面超时

    1.  pageLoadTimeout: pageLoadTimeout方法用来设置页面完全加载的超时时间,完全加载即页面全部渲染,异步同步脚本都执行完成.没有设置超时时间默认是等待页面全部加载完成才 ...

  3. [深入学习Web安全](11)之XSS玩法

    [深入学习Web安全](11)之XSS玩法 本文转自:i春秋社区 前言这篇paper,我们将学习如何优雅的调戏XSS.我们会教大家一些不常用的,但很实用的XSS姿势.我们在正式进入主题之前,先来说一下 ...

  4. java常见面试题及部分答案

    1.Redis常见的存储数据类型 list(列表类型) set(集合类型) zset(有序集合类型) string(字符串类型) hash(散装类型) 2.log4j的级别 debug:日志的最低级别 ...

  5. Maven私服nexus

    部署私服 xenus  下载https://www.sonatype.com/download‐oss‐sonatype 我下载了两个版本的nexus: nexus-3.13.0-01-unix.ta ...

  6. g++编译的makefile模板库和脚本

    编译C++文件,特别是多文件的时候,经常要找模板,这里为了后面方便,就自己做了一个模板. makefile模板:Makefile # Object files to either reference ...

  7. 安装MySQL时候最后一步报无法定位程序输入点fesetround于动态链接库MSVCR120.dll

    今天在装MySQL时到最后一步出现了一个问题[报无法定位程序输入点fesetround于动态链接库MSVCR120.dll]这是由什么原因引起的呢,其实是缺少一个vcredist_x64.exe插件 ...

  8. Xamarin.Android 使用 SimpleAdapter 打造 ListView 万能适配器

    第一步:创建 layout1.axml 来展示列表详细内容 <?xml version="1.0" encoding="utf-8"?> <L ...

  9. Spring Aop分析

    前言 上文讲述ioc框架的实现,本文开始讲述aop.在spring中aop也有3种配置方式,注解形式的我们先不讨论.我们先看看xml形式的配置方式. <aop:config> <ao ...

  10. github代码clone加速

    这阵子想看看开源项目 MyBatis 的源码,结果使用 git 的 clone 命令怎么也 clone 不下来,我以为是网速慢,上 Google 一搜,原来 Github 的域名被 DNS 污染了,我 ...