1 基础知识:基本类型与引用类型

JS中可以把变量分成两部分,基本类型和引用类型。

基本类型包括:Undefined、Null、Boolean、Number和String;
 引用类型值可能由多个值构成的对象。

在对基础类型数据进行拷贝时,实际相当于创建新的相同数据'hello',赋值给b

var a='hello';
var b = a;
b = 'world';
console.log(a);//"hello"

在对引用类型数据进行拷贝时,操作的不是实际的对象而是对象的引用,通过指针指向相同的内存区域,所以值相等;
在下面的代码中,因为arr和arr1指向同一内存区域,所以当改变arr1的值时,arr也跟着改变了

var arr = ['1','2'];
var arr1 = arr;
arr1[0] = '11';
console.log(arr); //["11", "2"]

2 浅拷贝

当我们在对引用类型数据进行拷贝时,就会产生类似上面子对象数据改变引起父对象数据同时改变的情况,这种拷贝就叫浅拷贝。

function shallowCopy(src) {
var dst = {};
for (var prop in src) {
dst[prop] = src[prop];
}
return dst;
} var xiaoming = {hobby:['唱歌','书法']};
var xiaoli = shallowCopy(xiaoming); //如果将拷贝后的对象xiaoli的爱好更改,原对象xiaoming就也被更改了
// 因为xiaoli的hobby属性是个数组,即引用类型的数据,所以复制到的内容只是一个内存地址,并不是创建的新内容,详情请参考js的基本类型和引用类型
xiaoli.hobby[0] = '画画';
console.log(xiaoming);//{hobby: ["画画", "书法"]} 小明的内容也别改变了

3深拷贝

实现深拷贝的方法就是将浅拷贝递归,让每一次赋值都通过基础类型的创建新数据的赋值方式进行赋值

function deepCopy(src,dst){
var dst = dst || {};
for (var i in src) {
if (typeof src[i] === 'object') {
dst[i] = (src[i].constructor === Array) ? [] : {};
deepCopy(src[i],dst[i]);
}else{
dst[i] = src[i];
}
}
return dst;
} var xiaoming2 = {hobby:['唱歌','书法']};
var xiaoli2 = deepCopy(xiaoming2);
xiaoli2.hobby[0] = '画画';
console.log(xiaoming2);//{hobby: ["唱歌", "书法"]} xiaoming的内容不变   

4 代码地址 :http://jsbin.com/namajic/edit?js,console,output

js深拷贝与浅拷贝的更多相关文章

  1. js 深拷贝和浅拷贝

    js 深拷贝和浅拷贝 先举一下项目中遇到的两个例子: 例子1: var json = $.parseJSON(data.data);//data.data是接口返回的值var a = json.cha ...

  2. 老生常谈之js深拷贝与浅拷贝

    前言 经常会在一些网站或博客看到"深克隆","浅克隆"这两个名词,其实这个很好理解,今天我们就在这里分析一下js深拷贝和浅拷贝. 浅拷贝 我们先以一个例子来说明 ...

  3. 关于JS深拷贝和浅拷贝

    最近在前端开发中遇到一些问题,就是数组中的某个对象或某个对象的值改变之后,在不刷新页面的时候需要重新渲染值时,页面显示的还是原来的数据.比如: data{ A:[{id:1,num:1},{id:2, ...

  4. 在vue中子组件修改props引发的对js深拷贝和浅拷贝的思考

    不管是react还是vue,父级组件与子组件的通信都是通过props来实现的,在vue中父组件的props遵循的是单向数据流,用官方的话说就是,父级的props的更新会向下流动到子组件中,反之则不行. ...

  5. JS 深拷贝和浅拷贝概念,以及实现深拷贝的三种方式

    一.理解堆栈,基本数据类型与引用数据类型 1.堆栈 栈(stack):系统自动分配的内存空间,内存会由系统自动释放,用来存放函数的参数值,局部变量的值等,特点是先进后出. 堆(heap):系统动态分配 ...

  6. 面试遇到的坑JS深拷贝和浅拷贝

    首先要搞明白深拷贝和钱拷贝的区别要先搞明白 栈和堆的区别 一.栈 栈存储基础数据类型,如: String.Number.Boolean.Null.Underined,这些简单的基础数据类型能够直接存储 ...

  7. js深拷贝、浅拷贝

    浅拷贝: 只针对当前对象的属性进行拷贝,若当前对象的属性是引用类型时,这个不考虑,不进行拷贝.若属性是引用类型,拷贝后引用的是地址,如果进行更改,会影响拷贝的原对象属性. 深拷贝:针对当前对象的数据的 ...

  8. js 深拷贝和浅拷贝理解

    作者:进击的袋鼠链接:https://www.zhihu.com/question/23031215/answer/124017500来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  9. [转] js深拷贝和浅拷贝

    一.数组的深浅拷贝 在使用JavaScript对数组进行操作的时候,我们经常需要将数组进行备份,事实证明如果只是简单的将它赋予其他变量,那么我们只要更改其中的任何一个,然后其他的也会跟着改变,这就导致 ...

随机推荐

  1. JAVA获取系统信息以及系统时间

    在做测试的时候,经常需要获取系统信息,并且用获取到的系统时间给生成的报告取名字. 以下代码实在TestNG展示的,没有Test NG的话需要些一个main方法. import java.net.Ine ...

  2. JS全局对象的属性

    全局对象是最顶层的对象,在浏览器环境指的是window对象.在ES5中,全局对象的属性与全局变量是等价的. var str = "hello"; function test(){ ...

  3. flash/flex builder在IE中stage.stageWidth始终为0的解决办法

    这应该是IE的bug,解决办法: 原作者:菩提树下的杨过出处:http://yjmyzz.cnblogs.com stage.align=StageAlign.TOP_LEFT; stage.scal ...

  4. 贝叶斯---最大似然估计(高翔slam---第六讲 )

    1.贝叶斯---最大似然估计 回顾一下第二讲的经典SLAM模型: 通过传感器(例如IMU)的运动参数u来估计运动(位姿x)[定位],通过相机的照片的观测参数z来估计物体的位置(地图y)[建图],都是有 ...

  5. nodejs+https 使用openssl (window)

    HTML的getUsermedia必是要安全的连接 比如 localhost.127.0.0.1 .https chrome才让调用摄像头 1.申请域名.备案.域名解析 2.openssl生成 打开g ...

  6. 利用Sharding-Jdbc实现分表[z]

    [z]https://www.cnblogs.com/codestory/p/5591651.html 你们团队使用SpringMVC+Spring+JPA框架,快速开发了一个NB的系统,上线后客户订 ...

  7. Python开发——数据类型【字典】

    字典的定义 # Python语言中唯一的类型映射 # 键与值之间用“:”分开 # 项与项之间用“,”分开 person = {"name":"yuan",&qu ...

  8. MFC里面解析json文件格式

    CString strTemp; //CString ->string; string stringMsg = (LPCSTR)(CStringA)strTemp; //string -> ...

  9. java多线程系列7 高级同步工具(1)信号量Semaphore

    Semaphore叫做信号量 可以控制某个资源可被同时访问的个数, acquire() 获取一个许可,得到许可才能执行后面的代码,如果没有就等待. release() 释放一个许可. 当信号量的只允许 ...

  10. 7. The British Thached Roof 英国的茅草屋顶

    7. The British Thached Roof 英国的茅草屋顶 (1) The view over a valley of a tiny village with thatchd roof c ...