javascript浅拷贝深拷贝详解
一、浅拷贝
浅拷贝在现实中最常见的表现在赋值上面,例如

<!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数组,所以两个数组都是指向同一块存储地址中去。
除了这种方法可以实现浅拷贝,还有使用slice和concat进行浅拷贝
例如:我们测试一次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浅拷贝深拷贝详解的更多相关文章
- js对象浅拷贝和深拷贝详解
js对象浅拷贝和深拷贝详解 作者:i10630226 字体:[增加 减小] 类型:转载 时间:2016-09-05我要评论 这篇文章主要为大家详细介绍了JavaScript对象的浅拷贝和深拷贝代码,具 ...
- java 深拷贝与浅拷贝机制详解
概要: 在Java中,拷贝分为深拷贝和浅拷贝两种.java在公共超类Object中实现了一种叫做clone的方法,这种方法clone出来的新对象为浅拷贝,而通过自己定义的clone方法为深拷贝. (一 ...
- 从mixin到new和prototype:Javascript原型机制详解
从mixin到new和prototype:Javascript原型机制详解 这是一篇markdown格式的文章,更好的阅读体验请访问我的github,移动端请访问我的博客 继承是为了实现方法的复用 ...
- JavaScript严格模式详解
转载自阮一峰的博客 Javascript 严格模式详解 作者: 阮一峰 一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict m ...
- [转]javascript console 函数详解 js开发调试的利器
javascript console 函数详解 js开发调试的利器 分步阅读 Console 是用于显示 JS和 DOM 对象信息的单独窗口.并且向 JS 中注入1个 console 对象,使用该 ...
- javascript 节点属性详解
javascript 节点属性详解 根据 DOM,html 文档中的每个成分都是一个节点 DOM 是这样规定的:整个文档是一个文档节点每个 html 标签是一个元素节点包含在于 html 元素中的文本 ...
- (" use strict")Javascript 严格模式详解
Javascript 严格模式详解 转载别人的博客内容,浏览了一遍,没有全部吸收,先保存一下链接 http://www.ruanyifeng.com/blog/2013/01/javascript_s ...
- 【HANA系列】SAP HANA XS使用JavaScript数据交互详解
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA XS使用Jav ...
- JavaScript运行机制详解
JavaScript运行机制详解 var test = function(){ alert("test"); } var test2 = function(){ alert(& ...
随机推荐
- MyBatis 源码分析系列文章合集
1.简介 我从七月份开始阅读MyBatis源码,并在随后的40天内陆续更新了7篇文章.起初,我只是打算通过博客的形式进行分享.但在写作的过程中,发现要分析的代码太多,以至于文章篇幅特别大.在这7篇文章 ...
- C/C++ 多线程机制
一.C/C++多线程操作说明 C/C++多线程基本操作如下: 1. 线程的建立结束 2. 线程的互斥和同步 3. 使用信号量控制线程 4. 线程的基本属性配置 在C/C++代码编写时,使用多线程机制, ...
- Eclipse 中 Spring 项目的 XML 配置文件报错 Referenced file contains errors
原来运行正常的项目,突然在applicationContext.xml 文件头报错 总结一下网上的解决方案: 1.有可能网络状况不好导致 如果使用Maven构建项目,spring在加载xsd文件时总是 ...
- 第二节:Java入门第一行代码
前言 大家好,今天带来Java入门第一行代码的概述,希望你们喜欢 第一行代码 学习Java基础课程,学会使用eclipse,eclipse为Java集成开发坏境IDE,创建第一个Java源文件代码: ...
- Kali学习笔记20:缓冲区溢出实验环境准备
在前几篇的博客中:我介绍了OpenVAS和Nessus这两个强大的自动化漏洞扫描器 但是,在计算机领域中有种叫做0day漏洞:没有公开只掌握在某些人手中 那么,这些0day漏洞是如何被发现的呢? 接下 ...
- soul开源网关项目搭建学习
1. soul开源网关项目搭建学习 1.1. 地址 https://gitee.com/shuaiqiyu/soul 1.2. 介绍 官方介绍:这是一个异步的,高性能的,跨语言的,响应式的API网关. ...
- c++多继承多态
C++多继承多态的实现 如果一个类中存在虚函数,在声明类的对象时,编译器就会给该对象生成一个虚函数指针,该虚函数指针指向该类对应的虚函数表. 多态的实现是因为使用了一种动态绑定的机制,在编译期间不确定 ...
- Xamarin.Android 上中下布局
xml代码: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:and ...
- MySQL 分支的选择:Percona 还是 MariaDB
原文:https://www.biaodianfu.com/mysql-percona-or-mariadb.html 在MySQL被Oracle收购以后,越来越多的人对于MySQL的前景表示了担忧, ...
- Linux编程 11(shell全局环境变量与局变环境变量)
一.概述 在linux中,很多程序和脚本都通过环境变量来获取系统信息,存储临时数据,配置信息.环境变量是指用来存储有关shell会话和工作环境信息,允许你在内存中存储数据,以便程序或shell中运行的 ...