在javascript中,变量的类型分为基本类型和引用类型。

  1. 对于基本类型的变量来说,值的复制以及作为函数参数实参传递的过程都是值的复制传递,换句话说,是会在内存中开辟出一个新空间用于存放新的值的。这样当对新的值进行操作的时候,不会对原来的值造成影响;

  2. 而对于引用类型的变量来说,值的复制以及作为函数参数实参传递都是内存指针的传递,就是说,即使存放在一个新变量中,如果新变量的值发生变化,那么原来的引用类型的值也会跟着产生变化

对于这种引用类型的变量的值的复制,我们称为"浅复制",就是说只是把变量的内存指针传递到了新变量中。有时候,这对我们操作引用类型的变量和参数的传递是不利的,因此,我们需要有办法进行"深复制",就是说在引用变量赋值时,除了传递值给新变量以外,还要开拓出一片新的内存空间用于存放这些值,这样新的变量的变化不会对原来引用类型的变量造成影响。

几种简单但有局限的方法:

  1. JSON.parse(JSON.Stringify(variable)) 这种方法利用JSON API,将数组(注意数组也可以使用这种方法)或者JSON对象转成字符串,之后再解析成新的对象,这样就完成了深复制,但是这种方法有一个缺点,就是会使新的对象丢失constructor

  2. arr.slice() 这种方法可以极方便快速地将一个数组对象进行深复制,并且效果非常好,不过可惜的是仅数组对象才有slice方法,JSON对象是不支持的;(今天写代码的时候发现slice好像没法深复制,最终用方法1解决了bug,详细原因做完事以后再研究清楚)

  3. 另外对于数组对象,这些方法也可以进行深复制,只是会比slice()更麻烦一些:arr.filter(), arr.map()

javascript中关于深复制与浅复制的问题的更多相关文章

  1. javascript 中的深复制 和 其实现方法

    首先,我们需要明白什么是深复制(侧重指对象方面)? 在javascript中,复制分为浅复制和深复制,个人理解,浅复制就是直接将引用复制,复制前后的两个对象指向同一个内存地址,对其中一个进行操作,另外 ...

  2. js中的深复制与浅复制

    前言 所谓深复制与浅复制(深拷贝与浅拷贝),乍一听感觉听高大上,像是一个非常难理解的概念,其实我们平常项目开发都是在用的,只是你可能不知道该怎么叫它的名字而已,就像你听熟了一首歌,就是不知道这首歌叫什 ...

  3. Java中对象的深复制和浅复制详解

    1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵ ...

  4. Java中的深复制与浅复制

    1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不 复制它所引用的对象. ...

  5. C#中的深复制与浅复制

    C#中分为值类型和引用类型,值类型的变量直接包含其数据,而引用类型的变量则存储对象的引用. 对于值类型,每个变量都有自己的数据副本,对一个变量的操作不可能影响到另一个变量.如 class Progra ...

  6. Java中的clone()----深复制,浅复制

    这篇文章主要介绍了Java中对象的深复制(深克隆)和浅复制(浅克隆) ,需要的朋友可以参考下 1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他 ...

  7. js中的深复制和浅复制

    在实际情况中经常会遇到对对象复制的问题.比如在处理项目中的一笔多结构的数据存储或者调用,这个时候你就要对对象(json)进行操作,而不同的操作根据不同的需求来定义.其中最常见最普遍的是对对象的复制,重 ...

  8. js的深复制与浅复制

    什么是深复制和浅复制? 深复制和浅复制的概念只存在于对象array和数组obj上. 浅复制是:模糊复制,就是不管对方是字符串类型还是引用类型都通通复制过来.结果两个变量的内容会同时变化. 深复制是:有 ...

  9. .Net深复制、浅复制

    在.Net,大家都知道引用类型的深复制.浅复制吧. ,一般int等值类型是值类型(复制时是直接传值),一般的类(List<T>,Class)是引用类型(复制时传地址),默认是浅复制.若ob ...

  10. C++学习基础七——深复制与浅复制

    一.深复制与浅复制基本知识 深复制和浅复制,又称为深拷贝和浅拷贝. 深复制和浅复制的区别如下图1所示: 图1 图1表示的是,定义一个类CDemo,包含int a和char *str两个成员变量, 当深 ...

随机推荐

  1. 编译安装php

    ./configure --prefix=/usr/local/php \--with-libdir=lib64 \--enable-fpm \--with-fpm-user=roter \--wit ...

  2. cocos2d-js去掉左下角的三行数字(帧数)

    project.json 里面"showFPS": true, 改成 false 就行了... 调整帧率也在这里调整 或者是 同cocos2dx,cocos2d-js左下角的FPS ...

  3. Sql Server中不常用的表运算符之APPLY(2)

    在Sql Server中不常用的表运算符之APPLY(1)中提到,SQL2005中新支持的APPLY的特性:1.可以直接将表表达式(表值函数或者子查询)作为APPLY语句的右表连接左表.2.由于使用A ...

  4. 使用小米天气API获取天气信息

    1. URL部分 以下url中"%s"代表的是城市Id,比如北京的cityId=101010100: //获取未来五天预报信息,红色部分信息不需要 WEATHER_DATA_URL ...

  5. AJAX - onreadystatechange

    [AJAX - onreadystatechange] 参考:http://www.w3school.com.cn/ajax/ajax_xmlhttprequest_onreadystatechang ...

  6. .net core 安装失败 的问题彻底解决

    解决方法: 已经整理好包:   https://pan.baidu.com/s/1dFuU80p 下载解压运行: DotNetCore.1.0.1-VS2015Tools.Preview2.0.2.e ...

  7. Dalvik指令格式

    一段Dalvik汇编代码由一系列Dalvik指令组成,指令语法由指令的位描述与指令格式 标识来决定.位描述约定如下: 每16位的字采用空格分隔开来每个字母表示四位,每个字母按顺序从高字节开始,排列到低 ...

  8. UVM的类库

    [转]http://www.asicdv.com/ 一个UVM验证平台可以看成由多个模块组合在一起的,这和以前的verilog代码,以及verilog结合其它各种语言的验证手段在理念上是一样的,最大的 ...

  9. AJAX同步改异步

    var temp; $.ajax({ async: false, type : "POST", url : defaultPostData.url, dataType : 'jso ...

  10. NPOI 2.0版本的使用

    详细教程: http://blog.csdn.net/xxs77ch/article/details/50216033 using System; using System.Collections.G ...