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

JS 数组、对象拷贝

博客地址:https://ainyi.com/72 JavaScript 程序中,对于简单数字、字符串可以通过 = 赋值拷贝 但是对于数组、对象对象数组拷贝,就有浅拷贝拷贝之分 浅拷贝就是当改变了拷贝数据...a // { name: 'krry' } b // { name: 'lily' } --- 以上是简单数组、对象拷贝方法,但是对于二维数组、对象数组、对象里包含对象,以上方法均达不到拷贝方法...以上只能达到数组、对象第一层==拷贝==,对于里面的数组或对象属性则是==浅拷贝==,因为里面的内存地址只是拷贝了一份,但都是指向==同一个地址== 所以当改变数组、对象数组元素或对象,原数据依然会改变...二维数组、对象数组、多层对象拷贝 最常用 JSON 序列化与反序列化 使用 JSON.parse(JSON.stringify(obj)) let a = [1, [2, {aa: 2}, [4...拷贝对象值中如果有函数、undefined、symbol,则经过 JSON.stringify() 序列化后 JSON 字符串中这个键值对会消失 无法拷贝不可枚举属性,无法拷贝对象原型链 拷贝

8.1K30

JS专栏】JS对象拷贝拷贝

1. object.assign object.assign 是 ES6 中 Object 一个方法,该方法可以用于JS 对象合并等多个用途,其中一个用途就是可以进行浅拷贝。...如果存在对象嵌套,那么浅拷贝将无能为力。因此拷贝就是为了解决这个问题而生,它能解决多层对象嵌套问题,彻底实现拷贝。...拷贝则不同,对于复杂引用数据类型,其在堆内存中完全开辟了一块内存地址,并将原有的对象完全复制过来存放。 拷贝对象与原始对象是相互独立、不受影响,彻底实现了内存上分离。...总的来说,拷贝原理可以总结如下: 将原对象从内存中完整地拷贝出来一份给新对象,并从堆内存中开辟一个全新空间存放新对象,且新对象修改并不会改变原对象,二者实现真正分离。 1....实现拷贝方法 下面是一个实现 deepClone 函数封装例子,有几点需要注意下。

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

js 数组对象拷贝

以上是背景,所以我就对浅拷贝拷贝进行了总结: 浅拷贝 什么是浅拷贝:两者是指向一个对象对象拷贝 1、对象直接遍历赋值。...数组拷贝 (两者指向不同对象,但是只能拷贝一层) array.concat(); array.slice(0); 如果该元素是个对象引用 (不是实际对象),slice 会拷贝这个对象引用到新数组里...两个对象引用都引用了同一个对象。如果被引用对象发生改变,则新和原来数组中这个元素也会发生改变,所以是浅拷贝。...拷贝 (下面说拷贝是基本对象拷贝,不考虑对象复杂属性,比如set,get,Function等) 1、最简单方式 JSON.parse(JSON.stringify(Obj)) 这种方法使用较为简单...,可以满足基本拷贝需求,而且能够处理JSON格式能表示所有数据类型,但是对于正则表达式类型、函数类型等无法进行拷贝(而且会直接丢失相应值)。

4.6K30

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

这里就是出现了题目所谈到问题,涉及到了js对象直接赋值、浅拷贝拷贝。 直接赋值   把一个对象a赋值给一个对象b相当于把一个对象b地址指向对象a地址,所以,他们实际上是同一个对象。...图5 扩展运算符实现浅拷贝(赋值"小刚"等操作与之前结果完全相同,就不全贴出来了)   考虑到es6支持程度,如果你项目不支持es6,但是又想实现浅拷贝的话,也可以尝试js原生concat方法...图6 concat方法实现浅拷贝 拷贝   拷贝会另外拷贝一份一个一模一样对象,但是不同是会从堆内存中开辟一个新区域存放新对象,新对象跟原对象不再共享内存,修改赋值后对象b不会改到原对象a。...即拷贝,修改赋值后对象b对象属性,不会影响原对象a对象属性;修改赋值后对象b对象属性,也不会影响原对象a对象属性。而且,二者不指向同一个对象。   ...很明显,拷贝比较符合我这次业务需求。拷贝,比较笨一点办法就是将自己需要数据自己封装起来。

4.2K20

对象拷贝: 浅拷贝拷贝

拷贝 ---- 浅拷贝: 只是拷贝了基本类型数据,而引用类型数据,复制后还会发生引用 示例数据 const user = { name: 'liang', age: 23 } 在 js 中,引用类型数据使用...(user) // {name: 'my name is liang', age: 23} 我们有以下几种方案可以进行浅拷贝 // 方案一: 使用 for in 循环取出属性和值,赋值给一个新对象 const...拷贝 ---- 拷贝: 拷贝基本类型和引用类型数据,而不是拷贝引用类型引用 数据示例 const user = { name: 'liang', info: { age: 23 }, array...: ['html', 'css', 'javascript'], show(name) { return `${name} call show method` } } 拷贝对象-迭代递归法 // 拷贝对象...copy(value) : value; } return data } // 拷贝对象 const profile = copy(user) // 修改通过拷贝得到变量不会影响原数据 profile.name

1.1K10

js拷贝拷贝

device-width, initial-scale=1.0"> Document 1234567891011// 在JS...// 当复杂类型实现浅拷贝,新对象与旧对象仍然同时指向堆内存同一属性,互不独立,相互影响。..., // 也就是说当我们创建新数组newArr时,赋予newArr是arr在栈中地址(指针), // 其实仍与旧数组arr共享同一个内存,所以修改新数组newArr后,旧数组arr也会被修改// 拷贝...// 它可以将复杂类型数据相互独立出来,互不影响 // 拷贝不会拷贝引用类型引用,而是将引用类型值全部拷贝一份,形成一个新引用类型, // 这样就不会发生引用错乱问题,使得我们可以多次使用同样数据...2、 function deepClone(target) { // 定义一个变量 let result; // 如果当前需要拷贝是一个对象的话更多内容请见原文,原文转载自:http://www.mark-to-win.com

2.5K20

对象拷贝拷贝

source=cloudtencent 以下主要介绍了正常情况下拷贝、浅拷贝拷贝三种方式区别。...正常拷贝:复制一个对象,它们内存地址是相同拷贝拷贝对象第一层属性 拷贝拷贝对象多层属性 正常拷贝 假设我们要复制一个对象,如果不对其进行拷贝,那么改变其中一个对象后,另外一个对象也会跟着改变...,无论旧对象属性有多少个,都可以自动拷贝到新对象上。...以上方式由于是浅拷贝只能拷贝对象一层属性,对于对象有多层属性依然是存在同样问题。...b children 属性改变后,对象 a children 属性也会跟着改变,这也不是我们想要效果,所以我们可以通过对象深度拷贝实现(拷贝无限层级)。

21600

js拷贝和浅拷贝

说到拷贝与浅拷贝,为什么会有这两种概念呢,根本原因就在于js两种数据类型:基本数据类型和引用数据类型,两种数据类型存储方式不同。...JavaScript 中变量拷贝 js拷贝区分为「浅拷贝」与「拷贝」。 浅拷贝拷贝只会将对象各个属性进行依次复制,并不会进行递归复制,也就是说只会赋值目标对象第一层属性。...拷贝 拷贝不同于浅拷贝,它不只拷贝目标对象第一层属性,而是递归拷贝目标对象所有属性。...() 和 Object.defineProperties() 方法; 字符串类型和 symbol 类型属性都会被拷贝; 在属性拷贝过程中可能会产生异常,比如目标对象某个只读属性和源对象某个属性同名...JSON 进行忽略原型链拷贝 var dest = JSON.parse(JSON.stringify(target)); 同样它也有缺点: 该方法会忽略掉值为 undefined 属性以及函数表达式

1.4K20

JS拷贝与浅拷贝

); 使用JSON.parse(JSON.stringify(arr))方式进行拷贝时,并不会拷贝函数。...使用 JSON.parse(JSON.stringify(arr)) 进行拷贝方式相对简单且易于理解,适合用于处理普通数据结构。...然而,它无法正确地处理一些特殊类型数据,例如函数、正则表达式、日期对象等,因为这些类型在 JSON 格式中无法正确表示。 MessageChannel 使用MessageChannel实现拷贝。...使用 MessageChannel 实现异步拷贝,可以正确地处理任何类型数据,包括特殊类型。 由于它是异步方式,所以性能可能会受到一定影响,特别是在处理大型数据结构时会更明显。...) 是数组对象一个方法,用于从数组中提取指定位置元素创建一个新数组。

6810

JS拷贝拷贝

因为对象是引用类型,所以赋值时操作仅是赋予相同地址,当对其中一个对象进行操作时,就会影响其他对象。解决这个问题就需要使用拷贝了。...拷贝方式分两种: 浅拷贝 基本类型:拷贝值 引用类型:拷贝对象引用。 拷贝 基本类型:拷贝值 引用类型:会创建一个新引用,将之前对象完整拷贝一份出来,并添加至新引用当中。...这种比较试适合简单单个数组或者对象使用,简单又方便 #拷贝 #JSON.stringify() 如果要拷贝对象中包含对象,就需要拷贝了,一般使用原生方法JSON.parse(JSON.stringify...RegExp) return new RegExp(obj); // 可能是对象或者普通值 如果是函数的话是不需要拷贝 if (typeof obj !...如何写出一个惊艳面试官拷贝?

1.6K20

JS拷贝方法

记一下js拷贝几种方法 使用递归 通过JSON对象 通过jQueryextend方法 Object.assign() lodash函数 使用递归 //使用递归方式实现数组、对象拷贝 function...deepClone(obj) { //判断拷贝要进行拷贝是数组还是对象,是数组的话进行数组拷贝对象的话进行对象拷贝 var objClone = Array.isArray(obj)...//通过js内置对象JSON来进行数组对象拷贝 function deepClone(obj) { var _obj = JSON.stringify(obj), objClone...= JSON.parse(_obj); return objClone; } tip: * 无法实现对对象中方法拷贝 通过jQueryextend方法 var array = [1,2,3,4...]; var newArray = $.extend(true,[],array); Object.assign() 对象中只有一级属性,没有二级属性时候,为拷贝 对象中有对象时候,在二级属性以后就是浅拷贝

2.7K10

js库 - 浅拷贝 & 拷贝

然后面试中经常会问、业务中也经常会遇到问题就是深浅拷贝问题了。 栈内存中简单数据类型直接拷贝就能得到一个副本,但是复杂数据类型拷贝如果也想得到一个副本,就需要拷贝了。...这是因为: 数组、对象这类复杂类型数据结构,在栈内存里存放只是指向堆内存中存放数据地址, 你直接d = c; 拷贝也是一个副本,但这个副本区别之处是,他并非数据副本,而是栈内存地址副本。...拷贝 具体拷贝就是要理解了复杂类型拷贝缺点,然后再进行弥补。 既然想要复杂类型也像简单类型那样拷贝一个新数据的话,就不单单是拷贝地址了。...直接返回[object String]这样类型。但其实在拷贝阶段,直接将其放到object形式处理了。...如果循环过程中,数组中嵌套复杂类型,再次递归调用拷贝方法。 对于对象,新建一个对象,然后for in遍历拷贝非原型值。如果循环过程中,对象中嵌套复杂类型,再次递归调用拷贝方法。

2K30

js拷贝与浅拷贝

1.区别: 拷贝和浅拷贝使用场景是在复杂对象里,即对象属性还是对象; 浅拷贝是指只复制一层对象,当对象属性是引用类型时,实质复制是其引用,当引用指向值改变时也会跟着变化;拷贝是指复制对象所有层级...2.拷贝实现 Json序列化与反序列化: function deepClone(obj){ let _obj = JSON.stringify(obj), objClone =...布尔值、数字、字符串包装对象在序列化过程中会自动转换成对应原始值。...对包含循环引用对象对象之间相互引用,形成无限循环)执行此方法,会抛出错误。 所有以 symbol 为属性键属性都会被完全忽略掉,即便 replacer 参数中强制指定包含了它们。...不可枚举属性会被忽略 对于引用类型:object,array,date,regexp,function,err,只能拷贝对象和数组,对于其他种类对象,会失真。

1.3K30
领券