js 函数调用基础知识
一个小栗子
const person = { age: 12 }
const changeAge = (person) => {
person = { age: 20}
}
changeAge(person)
console.log(person.age)
问输出什么呢~ person会不会更改呢(mutate)
这个问题就是 JavaScript中函数的传参类型问题~~
5分钟get这个重要的知识点吧~
基础知识
javaScript 中 包括基本类型与引用类型的数据。在js引擎中对变量的存储主要有两种位置:堆内存
和栈内存
。
- 栈内存主要用于存储各种基本类型的变量。
-
堆内存主要负责像对象Object这种变量类型的存储。
分析
1、 基本类型
const age1 = 12;
const age2= age1 ;
age2= 20;
console.log(age1); // 12
console.log(age2); // 20
基本类型复制的是自己在栈内存中的值
函数参数为基本类型
const age1 = 12
const changeAge = (age) => {
age = 20
}
console.log(age1) // 12
函数参数为基本类型时是值传递.
2、引用类型
const person1 = { age: 12 }
const person2 = person1
person2.age = 20
console.log(person1.age) // 20
console.log(person2.age) // 20
引用类型复制的是自己在栈内存中的“指针”值,“指针”指向的是堆里面的数据 ; 即person1 和person2 都指向了堆中的同一个数据;
函数参数为引用类型时:
const person = { age: 12 }
const changeAge = (person) => {
person.age = 20
}
changeAge(person)
console.log(person.age) // 20
函数参数为引用类型时看起来好像是引用传递,但是实际是传递了“指针”这个值。
再看开头的这个:
const person = { age: 12 }
const changeAge = (person) => {
person = { age: 20}
}
changeAge(person)
console.log(person.age) // 12
当我把 person 传进去的时候,实际是传递了“指针”(就是它的内存地址)这个值 ,并不是person 本身; 在 函数 内部更改了参数的指向, 所以内部函数的更改不能影响到外部。因此 ,函数参数传递的是内存地址这个值,函数传递参数就是按值传递的
。
hi~~ 是不是还比较清晰? 点个赞呗~~