一、變量:
- 基本類型是變量對象重新創建一個新值給變量對象空間,雖然是同一個值但是互不影響。
- 引用類型是也是將一個值重新賦值給新的變量空間,但是這個值是堆中對象的一個指針,新的變量和舊的變量指向是同一個對象。
如下:
- 基本類型
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 所以顯然傳遞的值即對象在堆中的內存地址。