资讯专栏INFORMATION COLUMN

深拷贝和浅拷贝-深度解析

jsyzchen / 2736人阅读

摘要:圆圆中的也会变二浅拷贝圆圆不会变改变,因为只拷贝到一层同样,解构赋值也是如此圆三深拷贝方法先将对象转换为字符串然后再将字符串转为对象。圆圆不变不变但在转换,对象及时会出现问题,同时也会忽略。

前言

对于 数字boolean字符串 等基本类型 而言,赋值、浅拷贝和深拷贝无意义,因为每次都会在堆中开辟一块新的空间,指向新的地址。

一、赋值:

指向同一个地址,不拷贝。

var obj1 = {name:"圆", radius:10, point:{x:0,y:0}};
var obj2 = obj1;
 
obj2.name = "圆2";  //obj1中的name也会变
二、浅拷贝:

var obj1 = {name:"圆", radius:10, point:{x:0,y:0}};
var obj2 = Object.assign({},obj1);
 
obj2.name="圆2"  // obj1.name不会变
obj2.point.x = 2       //obj1.point.x 改变,因为只拷贝到point一层

同样,解构赋值也是如此
var obj1 = {name:"圆", radius:10, point:{x:0,y:0}};
var obj2 = {…obj1}
三、深拷贝:

方法1
JSON.stringify(obj)  先将对象转换为字符串
JSON.parse(str) 然后再将字符串转为对象。
var obj1 = {name:"圆", radius:10, point:{x:0,y:0}};
var obj2 = JSON.stringify(obj1 );
var obj2 = JSON.parse(obj2);
 
obj2.name = "圆2";  // obj1 不变
obj2.point.x = 3;     //  obj1 不变

但JSON.stringify在转换Date,RegExp对象及function时会出现问题,同时也会忽略undefined、function

//date 类型
var o = new Date();
console.log(o.toString());         //  Mon Nov 06 2017 11:23:35 GMT+0800 (China Standard Time)  本地标准时间
console.log(JSON.stringify(o));    // "2017-11-06T03:23:35.547Z"  国际标准时间

因为stringify默认调用的是Object的toJSON方法,所以重写Date的toJSON,然后stringify就是ok的。

Date.prototype.toJSON = function () {
  return this.toLocaleString();
}
console.log(JSON.stringify(o));      // "11/6/2017, 11:23:35 AM"

同理RegExp

//RegExp类型
r1 = /d+/;
console.log(JSON.stringify(r1));           //   {}
 
RegExp.prototype.toJSON = function(){
return this.toString();
}
console.log(JSON.stringify(r1));          //    "/d+/" 
方法2
类库的方式。jquery,lodash等库
//jquery
let  y = $.extend(true,{},x)   //第一个参数 必须为true

//lodash库
let  y = _.cloneDeep(x);

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/99210.html

相关文章

  • 拷贝拷贝的区别

    摘要:浅拷贝与深拷贝一数据类型数据分为基本数据类型,和对象数据类型。浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。对于字符串数字及布尔值来说不是或者对象,会拷贝这些值到新的数组里。 浅拷贝与深拷贝 一、数据类型数据分为基本数据类型(String, Number, Boolean, Null, Undefined,Symbol)和对象数据类型。 基本数据类...

    jsyzchen 评论0 收藏0
  • 拷贝拷贝

    摘要:二浅拷贝与深拷贝深拷贝和浅拷贝是只针对和这样的引用数据类型的。浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。对于字符串数字及布尔值来说不是或者对象,会拷贝这些值到新的数组里。 一、数据类型 数据分为基本数据类型(String, Number, Boolean, Null, Undefined,Symbol)和对象数据类型。 基本数据类型的特点:直...

    hzc 评论0 收藏0
  • 拷贝拷贝

    摘要:二浅拷贝与深拷贝深拷贝和浅拷贝是只针对和这样的引用数据类型的。浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。对于字符串数字及布尔值来说不是或者对象,会拷贝这些值到新的数组里。 一、数据类型 数据分为基本数据类型(String, Number, Boolean, Null, Undefined,Symbol)和对象数据类型。 基本数据类型的特点:直...

    史占广 评论0 收藏0
  • 重新梳理下js中的拷贝和浅拷贝

    摘要:参考链接浅拷贝最简单的浅拷贝就赋值。所谓的浅拷贝就是,后面的对象和前面的对象在第一层数据结构中指向同一个堆地址。但是如果前面的数据不止有一层,如此时,使用和方式实现的都是浅拷贝。深拷贝管你怎么变,互不影响。 参考链接:http://www.cnblogs.com/st-les...https://blog.csdn.net/hj7jay/... 浅拷贝: 1.最简单的浅拷贝就赋值。由于...

    kun_jian 评论0 收藏0
  • 对象的常用方法以及对象的拷贝

    摘要:浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。两个对象引用都引用了同一个对象。对于字符串数字及布尔值来说不是或者对象,会拷贝这些值到新的数组里。 1、对象的理解 对象是一个包含相关数据和方法的集合(通常由一些变量和函数组成,我们称之为对象里面的属性和方法) 1.1 对象可以看成是Object对象构造出来的 showImg(https://user...

    xfee 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<