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