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

js数组拷贝_js数组深度复制

数组的浅拷贝, 可用concat、slice返回一个新数组的特性来实现拷贝 var arr = ['old', 1, true, null, undefined]; var new_arr = arr.concat...concat、slice拷贝只要有修改会引起新旧数组都一起改变了,比如: var arr = [{ old: 'old'}, ['old']]; var new_arr = arr.concat...) { newObj[key] = obj[key]; } } return newObj; } // 如果数组元素是基本类型,就会拷贝一份,互不影响,而如果是对象或者数组...,就会只拷贝对象和数组的引用,这样我们无论在新旧数组进行了修改,两者都会发生变化。...数组的深拷贝 方法一:JSON.stringify()不仅可拷贝数组还能拷贝对象(但不能拷贝函数,也不能解决循环引用问题) var arr = ['old', 1, true, ['old1', 'old2

13K50

js 数组对象深拷贝

数组的浅拷贝 (两者指向不同的对象,但是只能拷贝一层) array.concat(); array.slice(0); 如果该元素是个对象引用 (不是实际的对象),slice 会拷贝这个对象引用到新的数组里...如果被引用的对象发生改变,则新的和原来的数组中的这个元素也会发生改变,所以是浅拷贝。...对于字符串、数字及布尔值来说(不是 String、Number 或者 Boolean 对象),slice 会拷贝这些值到新的数组里。...在别的数组里修改这些字符串或数字或是布尔值,将不会影响另一个数组。...也就是说,如果原数组改变的是基本数据类型,比如String,Boolean,Number的数据,不会影响到新数组; 但是如果改变的是对象或者数组中的数据,是会影响到新数组的,也也就是对于对象或者数组

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

JS数组的深拷贝和浅拷贝

一、什么是深拷贝、浅拷贝?...JS里的两种数据类型 1、基本类型:Number、String、Boolean 变量直接按值存放,存放在栈内存中,可直接访问 2、引用类型:Object、Array 变量保存的是一个指针,存放在栈内存中...console.log(object2.c === object2.c); //true 3)Array的slice()和concat() slice(begin, end)返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组中...:arr[1, 2, 6, 7, 10, 22]做了slice/concat 看起来都像是深拷贝了,没影响原数组 但是!...对于这样的二维数组数组中有对象Object/Array)就只是复制了引用,改变其中的值还是会影响原数组 array [1, [1,2,3], {name:"array"}]; var array_concat

2.3K20

JS 数组、对象的深拷贝

博客地址:https://ainyi.com/72 JavaScript 程序中,对于简单的数字、字符串可以通过 = 赋值拷贝 但是对于数组、对象、对象数组拷贝,就有浅拷贝和深拷贝之分 浅拷贝就是当改变了拷贝后的数据...,原数据也会相应改变 来说说深拷贝 数组拷贝 遍历赋值 不推荐此方法 let a = [1, 2, 3] let b = [] for (let val of a) { b.push(val) }...a // { name: 'krry' } b // { name: 'lily' } --- 以上是简单数组、对象的深拷贝方法,但是对于二维数组、对象数组、对象里包含对象,以上方法均达不到深拷贝方法...以上只能达到数组、对象的第一层的==深拷贝==,对于里面的数组或对象属性则是==浅拷贝==,因为里面的内存地址只是拷贝了一份,但都是指向==同一个地址== 所以当改变数组、对象里的数组元素或对象,原数据依然会改变...二维数组、对象数组、多层对象的深拷贝 最常用的 JSON 序列化与反序列化 使用 JSON.parse(JSON.stringify(obj)) let a = [1, [2, {aa: 2}, [4

8.1K30

JS手撕(二) 数组扁平化、浅拷贝、深拷贝

数组扁平化 数组扁平化就是将多层数组拍平成一层,如[1, [2, [3, 4]]]变成[1, 2, 3, 4] 可以使用递归来实现,就直接遍历最外层数组,如果遍历的元素是数组,那就继续递归,直到不是数组为止...也可以使用some()方法来更简单地实现,因为some()方法返回数组是否有元素满足条件的布尔值,因为可以将条件设置为数组中是否有元素是数组。...顺带一提:通过concat和slice可以浅拷贝数组。 深拷贝拷贝只能拷贝对象的第一层,如果遇到嵌套对象,又会变成对象的引用。这时候就可以使用深拷贝,深拷贝就是拷贝整个对象,而不仅仅是第一层。...手写题(搞懂后,提升真的大) - 掘金 GitHub - qianlongo/fe-handwriting: 手写各种js Promise、apply、call、bind、new、deepClone…...面试官连环追问:数组拍平(扁平化) flat 方法实现 - 掘金 (建议精读)原生JS灵魂之问(中),检验自己是否真的熟悉JavaScript? - 掘金

1.2K10

js数组拷贝赋值复制-你真的懂?

在看react-native性能优化的时候,看到如何避免shouldComponentUpdate的异常数据时,脑内一阵风暴,从而牵连出一连串的问题,于是有了这一篇关于js数组的复制(深浅拷贝)与赋值等为何能产生异常数据的文章...concat的定义是:连接两个或更多的数组,并返回结果,该方法不会改变现有数组,而仅仅会返回数组的一个副本。...var a = [1,2]; a.push([3,4]); a.concat(5); //a为1 2 3,4 5 二、深拷贝与浅拷贝 1.浅拷贝 JavaScript...你传递一个对象(在js数组不是简单数据类型,而是对象)到一个函数,如果在函数里面改变了这个参数的内容,在外部这个变化是可见的。...2.深拷贝 (1)slice 函数 (2)concat 函数 (3)assgin 三个函数的原理都是返回数组的一个副本(相当于另外开辟内存空间),所以并不会改变数组本身的的值 但是这里有一点不同,就是assgin

4.7K30

js拷贝拷贝

device-width, initial-scale=1.0"> Document 1234567891011// 在JS...// 当复杂类型实现浅拷贝,新对象与旧对象仍然同时指向堆内存的同一属性,互不独立,相互影响。...,arr被分配到了堆内存中,在栈内存留下可以寻找到的指针, // 也就是说当我们创建新数组newArr时,赋予newArr的是arr在栈中的地址(指针), // 其实仍与旧数组arr共享同一个内存,所以修改新数组...newArr后,旧数组arr也会被修改// 深拷贝 // 它可以将复杂类型的数据相互独立出来,互不影响 // 深拷贝不会拷贝引用类型的引用,而是将引用类型的值全部拷贝一份,形成一个新的引用类型, //...[] : {};//判断数组类型或是object,数组即result=[],object即result={} for(let i in obj) { result[i] = typeof obj[i]

2.5K20

js数组深度拷贝 的四种实现方法

------------------------------------------------------------------ var ary1=[1,2]; es5: //方法一:适用 单层 数组嵌套的深拷贝...var ary2 = ary1.concat(); //方法二:适用 多层 数组嵌套的深拷贝 var ary2 = JSON.parse(JSON.stringify(ary1));   //此方法适用于...Oject的深度拷贝,因为Array属于Oject类型,所以也适用于此处;   //需要注意的是:作为Oject的深度拷贝时,要复制的function会直接消失,所以这个方法只能用在单纯只有数据的对象。...es6: // 方法三:适用 单层 数组嵌套的深拷贝 var ary2 = [...ary1]; // 方法四:适用 单层 数组嵌套的深拷贝 var [...ary2] = ary1; //方法五:通过递归实现...多层 的深拷贝 function deepCopy(source){ if (typeof source !

56020

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券