js 變量以及函數傳參

1、變量:函數

  • 基本類型是變量對象從新建立一個新值給變量對象空間,雖然是同一個值可是互不影響。
  • 引用類型是也是將一個值從新賦值給新的變量空間,可是這個值是堆中對象的一個指針,新的變量和舊的變量指向是同一個對象。

以下:spa

  • 基本類型
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);

輸出:code

總結:對象

  1. 基本類型在賦值新的變量的時候,是從新建立一個值給新的變量空間,舊的變量和新的變量互不影響。
  2. 引用類型的,在賦值新的變量,是將對象在堆中的內存指針賦值給新的變量空間,在改變一個變量的屬性,直接影響另外一個變量,也就是說他們指向的是同一個對象。

2、函數傳參blog

不管是基本類型仍是引用類型在函數傳參都是按值傳參。內存

也許你們都會有疑惑爲何變量要基本類型和引用類型 一個按值 一個按引用?作用域

  • 基本類型=>和變量賦值同樣,將一個值傳遞函數的形參(局部變量),在函數內調用該變量,並改變並不會影響函數外的變量。由於這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 因此顯然傳遞的值即對象在堆中的內存地址。console

相關文章
相關標籤/搜索