JS 拷贝对象、拷贝数组、拷贝复杂对象、拷贝复杂数组(深拷贝,浅拷贝,赋值的区别)

javascript中的原始值(undefined、null、布尔值、数字和字符串)与对象(包括数组和函数)有着根本区别。

基本数据类型值不可变,基本数据类型存放在栈中。

对象(包括数组和函数)数据类型是引用类型,引用类型存放在堆中,栈中只存放地址。

JS 赋值:

对于 js 的基本属性,这样的等于是赋值操作,并不会相互改值,不影响。

let a = 1;    

let b = a;

b = 4 ; 

console.log('a='+a + 'b' = b); // a=1 b=4


JS 浅拷贝:

let array1 = [1, 'a', true, null, undefined,{child:hello}];

slice()方法

let c1 = array1.slice();

concat()方法

let cc1 = array1.concat();

from()方法

let fc1 = Array.from(array1);

push()方法

let pc1 = [];

Array.prototype.push.apply(pc1,array1);

map()方法

let mc1 = array1.map(function(item){

    return item;

    });

以上都是现实数组浅拷贝的方法,只能拷贝里面第一层的 js 基本数据类型,对于{child:hello},仅仅只拷贝了地址,所以相互之间还是共享一个对象。改动{child:hello}会相互影响。


JS 深拷贝:

方法一:简易 json 转换法。

let jsonc = JSON.parse(JSON.stringify(array1));

这种方法可以实现深拷贝,但是这种方法也有它的限制。

1.数组中的项如果是 undefined,那么转换后将变成 null。

2.如果数组项为对象,那么对象之间不可相互引用。会造成循环引用,无法 json 序列化

方法二:使用“Lodash”高性能的 JavaScript 实用工具库。

import _ from 'lodash';

let newObj = _.cloneDeep(array1);

这样就能实现方便的深拷贝。

码字不易,点个关注呗。,持续更新实用的技能技巧。

你可能感兴趣的:(JS 拷贝对象、拷贝数组、拷贝复杂对象、拷贝复杂数组(深拷贝,浅拷贝,赋值的区别))