javascript存在两种拷贝:浅拷贝、深拷贝。

它们最大的区别在于引用类型的拷贝上:浅拷贝复制的是引用(指针),深拷贝复制的是里面的数据。

由于以上原因,在下例中 浅拷贝修改的值影响了声明的对象a。

var a = {};
var b= a; //浅拷贝
b.testStr = "我被改变了!";
alert(a.testStr); //显示"我被改变了";说明b的改变同时对a造成了影响

所以,为了避免这种情况,在javascript需要考虑可能进行深拷贝的类型有: Object{}、String、Array[];同时可能对深拷贝的判断造成影响的数据类型有undefined、null;(这部分有待更新)

1、在网上搜索了一个极其简单的深拷贝的方法,就是利用JSON的函数。

var dataObjCloned=JSON.parse(JSON.stringify( dataObj )) 

这种方式十分简单,无需自己去写函数;但是是有局限性的,即“这种方法只在纯数据的数组或者对象克隆中有效”。具体的验证过程请参考 http://www.jb51.net/article/33108.htm

对于存在“非纯数据的数组或者对象”的拷贝,则只能自己去写函数进行处理。

2、对于仅存在数组的深拷贝,请参考 http://www.jsann.com/post/JavaScript_deep_copy_and_shallow_copy.html ;其中包括两种方式,即使用.slice(0)或.concat();

3、对于同时包含其他类型、如对象等内容的深拷贝,需要自己写函数,请参考 http://blog.csdn.net/wanmingtom/article/details/7988284

4、深拷贝要慎用,因为“对象或实例的属性不可能全部是公有的,一旦存在私有变量(原文中叫状态state),你这样的复制便毫无意义,因为会丢失这些数据”。具体请继续参考http://blog.csdn.net/wanmingtom/article/details/7988284

5、利用jQuery的extend进行深拷贝,请参考http://api.jquery.com/jQuery.extend/

javascript 深拷贝的更多相关文章

  1. 这一次,彻底理解JavaScript深拷贝

    导语 这一次,通过本文彻底理解JavaScript深拷贝! 阅读本文前可以先思考三个问题: JS世界里,数据是如何存储的? 深拷贝和浅拷贝的区别是什么? 如何写出一个真正合格的深拷贝? 本文会一步步解 ...

  2. javascript 深拷贝与浅拷贝

    javascript 深拷贝与浅拷贝 深拷贝与浅拷贝 赋值和深/浅拷贝的区别 浅拷贝的实现方式 1.Object.assign() 2.函数库lodash的_.clone方法 3.展开运算符... 4 ...

  3. 读懂javascript深拷贝与浅拷贝

    1. 认识深拷贝和浅拷贝 javascript中一般有按值传递和按引用传递两种复制,按值传递的是基本数据类型(Number,String,Boolean,Null,Undefined),一般存放于内存 ...

  4. JavaScript 深拷贝(deep copy)和浅拷贝(shallow copy)

    参考: [进阶4-1期]详细解析赋值.浅拷贝和深拷贝的区别 How to differentiate between deep and shallow copies in JavaScript 在编程 ...

  5. javaScript 深拷贝、浅拷贝

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

  6. JavaScript深拷贝实现原理简析

    原文:http://www.cnblogs.com/xie-zhan/p/6020954.html JavaScript实现继承的时候,需要进行对象的拷贝:而为了不影响拷贝后的数据对原数据造成影响,也 ...

  7. JavaScript深拷贝—我遇到的应用场景

    简述 深拷贝即拷贝实例,其作用是为了不影响拷贝后的数组对起原数组造成影响.这时我们就需要进行深拷贝.(JavaScript的继承) 我遇到的应用场景 我是在用vue的element-ui做项目的时候遇 ...

  8. javaScript深拷贝和浅拷贝简单梳理

    在了解深拷贝和浅拷贝之前,我们先梳理一下: JavaScript中,分为基本数据类型(原始值)和复杂类型(对象),同时它们各自的数据类型细分下又有好几种数据类型 基本数据类型 数字Number 字符串 ...

  9. JavaScript深拷贝和浅拷贝

    1. 基本类型 和 对象类型 他们最大的区别就是在于他们的传值方式. 基本类型是传值 对象类型就是传引用. 这里复制一份obj叫做obj2, 这里修改了obj2的b为100 同时也修改了obj1.b. ...

随机推荐

  1. sqlserver 中server 函数GETDATE(),DEFAULT用法

    alter table Persons add datenow date DEFAULT GETDATE() null, datetimenow datetime DEFAULT GETDATE()n ...

  2. iOS初级数据持久化 沙盒机制 归档与反归档

    数据持久化就是数据保存成文件,存储到程序中的沙盒中. 沙盒构成 Document 存储用户数据,需要备份的信息 Caches 缓存文件, 程序专用的支持文件 Temp 临时文件 通过代码查找程序沙盒的 ...

  3. TortoiseGit 的使用

    日常用法 (1) 创建新库 在文件夹中按右键, 选择Git Create repository here 就可以创建库了. 在出现的窗口中, 不勾选选项, 直接按OK 在目录中就会出现一个名为.git ...

  4. js传值

    //传值$('.choose li').click(function(){    //alert('z');     $("#address").empty().prepend($ ...

  5. Centos7关闭防火墙与selinux

    CentOS 7.0默认使用的是firewall作为防火墙 直接关闭防火墙 systemctl stop firewalld.service #停止firewall systemctl disable ...

  6. Android 使用Okhttp/Retrofit持久化cookie的简便方式

    首先cookie是什么就不多说了,还是不知道的话推荐看看这篇文章 Cookie/Session机制详解 深入解析Cookie技术 为什么要持久化cookie也不多说了,你能看到这篇文章代表你有这个需求 ...

  7. Redis 安全性设置

    redis安装好后,默认情况下登陆客户端和使用命令操作时不需要密码的.某些情况下,为了安全起见,我们可以设置在客户端连接后进行任何操作之前都要进行密码验证. 我这边是安装的window系统,修改red ...

  8. yaffs文件系统

    1. 概述yaffs文件系统专为Nandflash设计的日志文件系统,占用page中oob区域.目前有两个版本的yaffs文件系统.nandflash不可靠,存在坏块,存在数据错误,需要软件弥补纠正此 ...

  9. 三层交换机+二层交换机配置VLAN相互访问

    使用思科模拟软件Cisco Packet Tracer Student,软件功能有限,只能架设简单的网络架构,适合初学者使用.

  10. ios问答题与答案

    1. OC中,与alloc语义相反的方法是dealloc还是release?与retain语义相反的方法是dealloc还是release?为什么?需要与alloc配对使用的方法是dealloc还是r ...