JS 的内存机制
在了解 JS 传值与传址之前,首先需要了解 JS 的内存机制。
JS 的内存分为 栈内存、堆内存、常量池、队列。
- 栈内存:一般存放 基本数据类型 和 复杂数据类型的引用指针。
- 堆内存:一般存放 复杂数据类型。
- 常量池:存放 常量 的地点,一般在栈内存中。
- 队列:在任务队列中使用。
JS 的数据类型
- 基本数据类型:Number,BigInt、String,Boolean,null,undefined
- 复杂数据类型:Object、Array、JSON、Function
传值
定义:JavaScript 规定给 基本数据类型传值,即让栈内存中的变量直接指向常量池中的数据,不同变量之间互不干扰。
let str1 = '123'
let str2 = str1
str1 = '234'
console.log(str1) // '234'
console.log(str2) // '123'
传址
定义:JavaScript 规定给 复杂数据类型传址,即让栈内存中的变量指向堆内存的数据,不同变量指向同一个数据,只要一个变量改变,其他的变量都会改变。
let obj1 = {
a: 1,
b: 2
}
let obj2 = obj1
obj1.a = 2
console.log(obj1)
/*
{
a: 2,
b: 2
}
*/
console.log(obj2)
/*
{
a: 2,
b: 2
}
*/
解决办法:深拷贝(JSON、递归)