传参赋值时的特点

281 阅读2分钟

调用方法传递参数,就是实参为形参赋值的过程。说到赋值,先说一下JS中数据的基本类型:

  1. 5种基本数据类型(值类型):string字符串型、number数字型、boolean布尔型、null空类型、undefined未定义型
  2. 3种引用数据类型:object对象、function函数、array数组

变量的实质是一个空间地址

所以,在js中,一个变量赋值给另外一个变量都是副本赋值,也就是将这个变量在栈空间中所存储的“内容”复制一份赋给另外一个变量。

参数传递的数据为“基本数据类型”(值类型)时

基本类型(值类型)的数据是存储在栈空间中的,是在栈空间中存储值本身,因此,赋值的时候是将值本身复制给另外一个变量,那后面的变量怎么改变都不会影响到原本的值。

举个例子:A=B(JS中赋值是等号的右边给左边),B是源文件,A得到的是B的副本,所以后面A怎么改变都不影响B源文件。

function test(num){
	num = 100
	num++
}
let num = 10
test(num)
console.log(num)  //10

参数传递的数据为“引用数据类型”时

引用类型的数据在存储时,会开辟两块空间,值会存储在堆空间里,而在栈空间中存储的是堆空间的地址,因此,赋值的时候是将栈空间中存储的地址复制给另外一个变量,后面的变量根据这个地址找到堆空间中的值,那么后面的变量改变后,原本的值也会发生改变。

有两种情况:

1、后面变量的改变 改变的是基本数据类型(值类型),那么原本的变量也会随之改变。举个例子:A=B,也就是把B的值赋给A,A得到的是B在堆空间中的地址,A通过这个地址会找到B的值,那么后面A的值发生改变后,改变的是源文件,所以B会同时发生改变。

let obj1 = {
	name:'黑马程序员',
	level:1
}
let obj2 = obj1
obj2.name = '传智播客'
console.log(obj1.name)  //传智播客

2、后面变量的改变 改变的是引用型,那么此时是地址又发生了改变,原来的变量中的值自然也就不会再随之改变了。举个例子:A=B,A=C,先是把B的值赋给了A,后面又把C赋值给A,此时改变的就是A的地址,那么A和B的地址不同,堆空间里的值自然也不同。

	let obj1 = {
	name:'黑马程序员',
	level:1
}
let obj2 = obj1
obj2 = {
	name:'传智播客',
	level:1
}
console.log(obj1.name)  //黑马程序员