先把收穫晾一下:
1.javascrip變數包含兩種類型的值,一種是引用型別的值,一種是基本型別的值。引用型別包括:Array,Object,Function(可以這麼理解,非基本型別的都是引用型別);5種基本型別包括:undefined,null,string,boolean,number
2.函數的參數的傳遞的機制是複製變數值。
書上說:」把函數外部的值複製給函數內部的參數,就和把值從一個變數複製給另一個變數一樣。基本型別的傳遞如同基本型別變數的複製一樣,而引用型別的則如同引用類型變數的複製一樣。
」當一個變數複製引用型別的值時,同樣也會將儲存在變數物件中的值複製一份放到為新變數指派的空間。不同的是這個值的副本其實是一個指標,而這個指標指向儲存在堆中的一個物件。【注意:複製引用類型的值,才是傳址】
3.參數其實是函數的局部變數。
----------------------------------------------- -----------------------------
基本概念的解釋:傳值:把A的數值傳到B,改變B,A不會跟著變,B存的是跟A一樣的值;
傳址:把A的位址傳到B,改變B,A同時跟著變,B存的只是A的位址(類似電腦的捷徑)。
一個具有值型別(value type)的資料存放在堆疊內的變數中。即在堆疊中分配記憶體空間,直接儲存所包含的值,其值就代表資料本身。值類型的資料具有較快的存取速度。
一個具有引用類型(reference type)的資料並不駐留在堆疊中,而是儲存於堆中。即是在堆中分配記憶體空間,不直接儲存所包含的值,而是指向所要儲存的值,其值代表的是所指向的位址。當存取具有引用類型的資料時,需要到堆疊中檢查變數的內容,該變數引用堆中的一個實際資料。引用類型的資料比值類型的資料具有更大的儲存規模和較低的存取速度。
----------------------------------------------- -----------------------------
下面是三個問題。
【問題1】:
為什麼change(a)函數執行完之後,外面的a沒有受干擾呢?
<script> var a = [1, 2, 3]; function change(a) { console.log(a);//[1,2,3] a = 2; //传值 console.log(a);//2 } change(a); console.log(a); //[1,2,3] </script>
【問題2】:
為什麼change(a)函數執行完之後,外面的a受到干擾呢?
<script> var a = [1, 2, 3]; function change() { a = 2;//传值 } change(); console.log(a); //2 </script>
解析:問題2和問題1的差別在於,問題2並沒有引入參數,所以不涉及複製變數的事情。
【問題3】:
為什麼change(a)函數執行完之後,外面的a受到干擾呢?
<script> var a = [1, 2, 3]; function change(b) { b[0] = 2; } change(a); console.log(a); //[2,2,3] </script>
的確,change函數執行時,參數b是a的複製值。因為a是引用類型,所以在函數內部是b和a按引用來存取的是一個位址的物件。 b[0]=2的出現,並不影響在函數內部b和a所引用的是同一個物件。
【問題4】:
為什麼change(a)函數執行完之後,外面的a沒有受到干擾呢?
var a = [1, 2, 3]; function change(b) { console.log(b);//[1,2,3] b=2; b[0] = 2; } change(a); console.log(a); //[1,2,3]
以上所述就是本文的全部內容了,希望大家能夠喜歡。