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);
这样就能实现方便的深拷贝。
码字不易,点个关注呗。😀,持续更新实用的技能技巧。