用最直白的话带你理解JavaScript深浅复制
要理解深浅复制前,我们要知道什么是深浅复制
深复制:直接将数据赋值给对应的变量
// 这些直观的数据 赋值给变量就是深复制
let num = 1;
let str ="str";
let nums = [1,2,3]
浅复制:多个变量共同指向堆内的同一个内容/地址
//此时a 和 b 共同指向堆内的同一个内容即 [4,5,6]
let a = [4,5,6]
let b = a;
深入一下
浅复制就是把地址赋值给对应的变量,并不是直接赋值数据,类似于指针。所以改变 a 的值时,b 的值也发生相应的改变,因为此时 a、b 的地址是一致的。
深复制是直接将数据赋值给变量,变量 a、b 的地址是不一致的,所以当 a 的值发生改变时,b 的值不会发生改变。
实践一下
function f(e){
// 两个return是为了高亮 执行①就注释② 执行②就注释①
//e 直接重新赋值 并不会改变 nums
return e = [4,5,6] // ①
//e 单个赋值 会改变 nums
return e[0] = 3 // ②
}
let nums =[7,8,9];
f(nums);
console.log(nums);
/**
* ①[7,8,9]
* ②[3,8,9]
*/
讲解
讲解标记①
传进来的参数是浅复制 相当于 let e = nums 属于浅复制的 此时是同一个地址
将参数重新赋予直观的数据 参数e由浅复制变为深复制
参数分配了新的地址 此时参数和nums 不在是同一个地址 所以参数的改变不会影响到nums; nums依旧是[7,8,9]
讲解标记②
我们并没有给参数直接复制,所以此时 参数和nums的地址还是一致的,
当我们改动其中一个数的时候,对应的地址内的内容也会改变,
由于nums的地址和参数地址还是一致的,所以nums的值也会改变,nums变成[3,8,9]