js 变量以及函数传参
一、变量:
- 基本类型是变量对象重新创建一个新值给变量对象空间,虽然是同一个值但是互不影响。
- 引用类型是也是将一个值重新赋值给新的变量空间,但是这个值是堆中对象的一个指针,新的变量和旧的变量指向是同一个对象。
如下:
- 基本类型
1 let num=1; 2 let num1=num; 3 num=num+2; 4 console.log(num,num1);
输出:
- 引用类型
1 let obj={}; 2 let obj1=obj; 3 obj.name='tom'; 4 console.log(obj,obj1);
输出:
总结:
- 基本类型在赋值新的变量的时候,是重新创建一个值给新的变量空间,旧的变量和新的变量互不影响。
- 引用类型的,在赋值新的变量,是将对象在堆中的内存指针赋值给新的变量空间,在改变一个变量的属性,直接影响另一个变量,也就是说他们指向的是同一个对象。
二、函数传参
无论是基本类型还是引用类型在函数传参都是按值传参。
也许大家都会有疑惑为什么变量要基本类型和引用类型 一个按值 一个按引用?
- 基本类型=>和变量赋值一样,将一个值传递函数的形参(局部变量),在函数内调用该变量,并改变并不会影响函数外的变量。因为这2个是不同的值互不影响。
1 test=(num)=>{ 2 num+=1; 3 console.log(num); 4 }; 5 let testVal=2; 6 test(testVal); 7 console.log(testVal);//2
- 引用类型,传递的是对象在堆中的内存地址值,而不是引用!!
1 testObj=(obj)=>{ 2 obj=new Object(); 3 obj.name='evil'; 4 console.log(obj.name); 5 }; 6 let testMyObj={name:'jack'}; 7 testObj(testMyObj); 8 console.log(testMyObj.name);//jack
引用类型传递是对象的内存地址,而不是引用,如果是引用那么在函数testObj 在函数作用域中的局部变量obj在改变引用的时候,函数外层的testMyObj输出的name值应该是evil,而不是jack 所以显然传递的值即对象在堆中的内存地址。
学习是一种态度,坚持是质变的利器!