JS函数传参

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这种变量类型的存储。


    堆&栈.png

分析

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~~ 是不是还比较清晰? 点个赞呗~~

你可能感兴趣的:(JS函数传参)