首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JS专栏】JS对象拷贝与深拷贝

拷贝 自己创建一个新对象,来接受你要重新复制或引用对象。...1. object.assign object.assign 是 ES6 中 Object 一个方法,该方法可以用于JS 对象合并等多个用途,其中一个用途就是可以进行浅拷贝。...Symbol 类型对象,但是如果到了对象第二层属性 obj1.a.b这里时候,前者改变也会影响后者第二层属性,说明其中依旧存在着访问共同堆内存问题,也就是说这种方法还不能进一步复制,...也就是实现拷贝功能差不多,但是如果属性都是基本类型,使用扩展运算符进行浅拷贝会更加方便。...浅拷贝只是创建了一个新对象,复制了原有对象基本类型,而引用数据类型只拷贝了一层属性,再深层还是无法进行拷贝

2.3K40

js对象拷贝方法

(obj) ); Object.assign(targetObj,sourceObj),浅拷贝 不是深拷贝,循环引用、各种数据类型都可以拷贝,引用类型不是深拷贝 它不会拷贝对象继承属性; 它不会拷贝对象不可枚举属性...; 不可以拷贝对象对象; 可以拷贝 Symbol 类型属性; 无法正确拷贝属性和属性 可以拷贝undefined/boolean/null/function/Date/RegExp/array/array...,引用类型不是深拷贝 JSON.parse(JSON.stringfiy()),不完全深拷贝 拷贝对象中如果有函数、undefined、symbol 这几种类型,经过 JSON.stringify...序列化之后字符串中这个键值对会消失; 拷贝 Date 引用类型会变成字符串; 无法拷贝不可枚举属性; 无法拷贝对象原型链; 拷贝 RegExp 引用类型会变成空对象对象中含有 NaN、Infinity...以及 -Infinity,JSON 序列化结果会变成 null; 无法拷贝对象循环引用,如果对象中有循环引用,会报错: Uncaught TypeError: Converting circular

2.4K20
您找到你想要的搜索结果了吗?
是的
没有找到

JS 数组、对象拷贝

博客地址:https://ainyi.com/72 JavaScript 程序中,对于简单数字、字符串可以通过 = 赋值拷贝 但是对于数组、对象对象数组拷贝,就有浅拷贝和深拷贝之分 浅拷贝就是当改变了拷贝数据...a // { name: 'krry' } b // { name: 'lily' } --- 以上是简单数组、对象拷贝方法,但是对于二维数组、对象数组、对象里包含对象,以上方法均达不到深拷贝方法...以上只能达到数组、对象第一层==深拷贝==,对于里面的数组或对象属性则是==浅拷贝==,因为里面的内存地址只是拷贝了一份,但都是指向==同一个地址== 所以当改变数组、对象数组元素或对象,原数据依然会改变...拷贝对象中如果有函数、undefined、symbol,则经过 JSON.stringify() 序列化后 JSON 字符串中这个键值对会消失 无法拷贝不可枚举属性,无法拷贝对象原型链 拷贝...Date 引用类型会变成字符串 拷贝 RegExp 引用类型会变成空对象 对象中含有 NaN、Infinity 和 -Infinity,则序列化结果会变成 null 无法拷贝对象循环应用(即 objkey

8.2K30

js 数组对象拷贝

以上是背景,所以我就对浅拷贝和深拷贝进行了总结: 浅拷贝 什么是浅拷贝:两者是指向一个对象对象拷贝 1、对象直接遍历赋值。...数组拷贝 (两者指向不同对象,但是只能拷贝一层) array.concat(); array.slice(0); 如果该元素是个对象引用 (不是实际对象),slice 会拷贝这个对象引用到新数组里...两个对象引用都引用了同一个对象。如果被引用对象发生改变,则新和原来数组中这个元素也会发生改变,所以是浅拷贝。...对于字符串、数字及布尔来说(不是 String、Number 或者 Boolean 对象),slice 会拷贝这些到新数组里。...,可以满足基本拷贝需求,而且能够处理JSON格式能表示所有数据类型,但是对于正则表达式类型、函数类型等无法进行深拷贝(而且会直接丢失相应)。

4.7K30

浅谈JS对象拷贝和浅拷贝

拷贝和深拷贝'深浅'主要针对对象‘深度’,常见对象都是'浅',也就是对象属性就是单个属性,而'深'对象是指一个对象属性是另一个对象,也就是对象里面嵌套对象,就像嵌套函数一样。...深拷贝和浅拷贝就是为解决对象直接赋值后依然'连接'问题,也就是共用一个引用,一个改变会影响到另一个。...console.log(obj2.a); //5 console.log(obj.a); //10,obj2改变不影响obj,说明拷贝对象和之前对象不存在共用一个引用 ?...Paste_Image.png 浅拷贝可以解决常见现象,但倘若对象不是常见那种呢?...'PDD' console.log(obj2.omg.name); console.log(obj.omg.name); //obj.omg.name也随着改变 ?

6.8K20

js对象直接赋值、浅拷贝与深拷贝

这里就是出现了题目所谈到问题,涉及到了js对象直接赋值、浅拷贝与深拷贝。 直接赋值   把一个对象a赋值给一个对象b相当于把一个对象b地址指向对象a地址,所以,他们实际上是同一个对象。...以图1直接赋值例子,person对象中有两个属性,一个是name,一个是对象属性ageAndSex;为什么要弄一个对象属性,这个会涉及到后面的浅拷贝和深拷贝问题,这也是他们之间区别。...图2 直接赋值 浅拷贝拷贝只会赋值制对象对象属性,不会指向同一个地址。ES6中有个浅拷贝方法Object.assign(target, ...sources)。...图5 扩展运算符实现浅拷贝(赋值"小刚"等操作与之前结果完全相同,就不全贴出来了)   考虑到es6支持程度,如果你项目不支持es6,但是又想实现浅拷贝的话,也可以尝试js原生concat方法...图6 concat方法实现浅拷贝拷贝   深拷贝会另外拷贝一份一个一模一样对象,但是不同是会从堆内存中开辟一个新区域存放新对象,新对象跟原对象不再共享内存,修改赋值后对象b不会改到原对象a。

4.3K20

JS对象到原始转换

JS对象到原始转换复杂性 主要由于某些对象类型存在不止一种原始表示 对象到原始转换三种基本算法 在解释三种算法前需要了解toString valueOf这两个方法 toString...返回对象字符串表示 Array类toString方法会将每个元素转换为字符串,再使用逗号作为分隔符拼接起来 Function类toString方法将定义函数转换为JS源代码字符串 Date类型...toString方法返回一个人类友好(且JS可解析)日期和时间字符串 RegExp类定义toString方法将RegExp对象转换为一个看起来像RegExp字面量字符串 valueOf 把对象转换为代表对象原始...(如果存在这样一个原始) 对象是复合,且多数对象不能真正通过一个原始标识,valueOf方法默认情况只返回对象本身 String Number Boolean包装类定义valueOf返回被包装原始...) 取决于被转换对象类 如果是Date对象,则使用偏字符串算法 其他类型使用偏数值算法 JS内置类型除了Date类都实现了偏数值算法;Date类实现了偏字符串算法 对象转换为布尔 所有对象都转换为

4.3K30

对象拷贝: 浅拷贝、深拷贝

拷贝 ---- 浅拷贝: 只是拷贝了基本类型数据,而引用类型数据,复制后还会发生引用 示例数据 const user = { name: 'liang', age: 23 } 在 js 中,引用类型数据使用...= 进行赋值时,传递都是引用,而并非其对应,这样赋值并没有真正拷贝数据 const user1 = user user1.name = 'my name is liang' console.log...(user) // {name: 'my name is liang', age: 23} 我们有以下几种方案可以进行浅拷贝 // 方案一: 使用 for in 循环取出属性和,赋值给一个新对象 const...= Object.assign({}, user) // 方案三: 使用展开语法 const obj = { ...user } 浅拷贝存在问题: 当属性存在引用类型数据时,则拷贝是引用,并不是真正拷贝...copy(value) : value; } return data } // 拷贝对象 const profile = copy(user) // 修改通过拷贝得到变量不会影响原数据 profile.name

1.1K10

Java对象拷贝_对象拷贝有几种方法

该生成器具有合理默认和许多内置类型转换,但是在配置或实现特殊行为时,它会自动退出。...如果你仅是在日常处理少量对象时,选取哪个其实变得并不重要,但数据量大时建议还是使用MapStruct 或 BeanCopier 方式,提高接口性能 一、背景 1.1 对象拷贝概念 Java中,数据类型分为类型...浅拷贝与深拷贝差异 分类 浅拷贝拷贝 区别 创建一个新对象,然后将当前对象非静态字段复制到该新对象,如果字段是类型,那么对该字段执行复制;如果该字段是引用类型的话,则复制引用但不复制引用对象...因此,原始对象及其副本引用同一个对象。 创建一个新对象,然后将当前对象非静态字段复制到该新对象,无论该字段是类型还是引用类型,都复制独立一份。...BeanCopier支持两种方式: 一种是不使用Converter方式,仅对两个bean间属性名和类型完全相同变量进行拷贝; 另一种则引入Converter,可以对某些特定属性进行特殊操作。

4.8K10

对象拷贝

关于对象拷贝。 1.为什么要使用克隆? 想对一个对象进行处理,又想保留原有的数据进行接下来操作,就需要克隆了,Java语言中克隆针对是类实例。 2.如何实现对象克隆?...有两种方式: 实现 Cloneable 接口并重写 Object 类中 clone() 方法; 实现 Serializable 接口,通过对象序列化和反序列化实现克隆,可以实现真正深度克隆,代码如下...close 方法没有任何意义 // 这两个基于内存流只要垃圾回收器清理对象就能够释放资源,这一点不同于对外部资源(如文件流)释放 } } 3.深拷贝和浅拷贝区别是什么?...浅拷贝只是复制了对象引用地址,两个对象指向同一个内存地址,所以修改其中任意,另一个都会随之变化,这就是浅拷贝(例:assign()) 深拷贝是将对象复制过来,两个对象修改其中任意另一个不会改变...://lixj.fun/archives/对象拷贝

26510

对象拷贝和深拷贝

正常拷贝:复制一个对象,它们内存地址是相同拷贝拷贝对象第一层属性 深拷贝拷贝对象多层属性 正常拷贝 假设我们要复制一个对象,如果不对其进行深拷贝,那么改变其中一个对象后,另外一个对象也会跟着改变...,无论旧对象属性有多少个,都可以自动拷贝到新对象上。...以上方式由于是浅拷贝只能拷贝对象一层属性,对于对象有多层属性依然是存在同样问题。...b children 属性改变后,对象 a children 属性也会跟着改变,这也不是我们想要效果,所以我们可以通过对象深度拷贝实现(拷贝无限深层级)。...但是这种方式依然存在问题,假设我对象里面有 function 属性等其他非类型属性,那就无法拷贝了。

23300

Javascript对象拷贝

拷贝 如果要操作对象拥有的属性都是类型,那么可以使用扩展语法或 Object.assign(...) 1var obj = { foo: "foo", bar: "bar" }; 2var copy...如果对象属性也是对象,那么实际被拷贝只是那些指针,这跟执行 var bar = foo; 效果是一样,和第一段代码中做法一样。...(有限制) 想要对一个对象进行深拷贝,一个可行方法是先把对象序列化为字符串,然后再对它进行反序列化。...进行深拷贝 Node.js 8.0.0 版本提供了一个 序列化 api 【https://nodejs.org/api/v8.html#v8_serialization_api】可以和结构化克隆相媲美...结论 Javascript 中最好对象拷贝算法,很大程度上取决于其使用环境,以及你需要拷贝对象类型。

49020

js拷贝和浅拷贝

说到深拷贝与浅拷贝,为什么会有这两种概念呢,根本原因就在于js两种数据类型:基本数据类型和引用数据类型,两种数据类型存储方式不同。...JavaScript 中变量赋值 js 中变量赋值分为「传」与「传址」。 给变量赋基本数据类型,就是「传」;而给变量赋引用数据类型,实际上是「传址」。...JavaScript 中变量拷贝 js拷贝区分为「浅拷贝」与「深拷贝」。 浅拷贝拷贝只会将对象各个属性进行依次复制,并不会进行递归复制,也就是说只会赋值目标对象第一层属性。...深拷贝拷贝不同于浅拷贝,它不只拷贝目标对象第一层属性,而是递归拷贝目标对象所有属性。...,这时该方法会抛出一个 TypeError 异常,拷贝过程中断,已经拷贝成功属性不会受到影响,还未拷贝属性将不会再被拷贝; 该方法会跳过那些为 null 或 undefined 对象; 利用

1.4K20

【C++】拷贝构造函数调用时机 ② ( 对象作为函数参数 | 对象作为函数返回 )

另外一个 类实例对象 ; // 将一个对象赋值给另外一个对象 // 自动调用拷贝构造函数 Student s2 = s1; ③ 对象作为函数参数 : 类实例对象方式 传递给函数 , 不是以...---- C++ 语言中 拷贝构造函数 是 C++ 类中 特殊构造函数 , 其作用是 创建一个新 类实例对象 , 作为现有实例对象 拷贝副本 ; 拷贝构造函数 主要作用 是初始化新创建对象..., 使其内容与原对象完全相同 ; 二、对象作为函数参数 ---- 1、拷贝构造函数调用情况说明 类实例对象方式 传递给函数 , 不是以 指针 或 引用 方式 ; 这种情况 是 以 类...对象作为参数 void fun(Student s) { } 如果调用该函数 , 需要拷贝实参 , 将 实参副本 , 也就是对象 传递给函数形参 , 这个过程需要调用 Student 类 拷贝构造函数...; 然后 , 将创建实例对象 传递给 fun 函数 , 传递时由于传递对象 , 需要拷贝对象副本 , 拷贝副本时会自动调用 Student 类 拷贝构造函数 ; 调用带参数构造函数 调用拷贝构造函数

18520

js拷贝拷贝

device-width, initial-scale=1.0"> Document 1234567891011// 在JS...中,数据类型分为基本数据类型和引用数据类型两种,对于基本数据类型来说,它直接存储在栈内存中, // 而对于引用类型来说,它在栈内存中仅仅存储了一个引用,而真正数据存储在堆内存中// 当基本类型实现浅拷贝...// 当复杂类型实现浅拷贝,新对象与旧对象仍然同时指向堆内存同一属性,互不独立,相互影响。...// 它可以将复杂类型数据相互独立出来,互不影响 // 深拷贝不会拷贝引用类型引用,而是将引用类型全部拷贝一份,形成一个新引用类型, // 这样就不会发生引用错乱问题,使得我们可以多次使用同样数据...2、 function deepClone(target) { // 定义一个变量 let result; // 如果当前需要深拷贝是一个对象的话更多内容请见原文,原文转载自:http://www.mark-to-win.com

2.5K20
领券