先把收穫晾一下:
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>問題1解答:因為change(a)的執行過程是這樣的,先將物件a(陣列)傳入到change以後,被複製給change的參數a。而後a=2是一個賦值語句,變成傳值。此時a=2是值類型,並不涉及引用位址的問題。所以並沒有影響外在的a。
【問題2】:
為什麼change(a)函數執行完之後,外面的a受到干擾呢?
<script> var a = [1, 2, 3]; function change() { a = 2;//传值 } change(); console.log(a); //2 </script>問題2解答:當執行change()的時候,函數在自己的執行環境中找尋作用域鏈,活動物件(activation object)並不包含變數a,於是沿著作用域鏈往上找,找到全域執行環境,發現變數a,於是此時函數內部的a和外部a在記憶體上是同一個位址,自然函數內部a變了,外部也會跟著變。
解析:問題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>問題3解答:這個和問題1非常類似,唯獨不一樣的就是a=2,換成了b[0]=2,我一開始也很疑惑,不說複製嗎?參數b應該是複製值,怎麼會影響到外面的a呢?
的確,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]問題4解答:change(b)執行過程是這樣的,a物件傳入change函數,將值和位址複製給b。 b=2這句,此時b變成值型了,不涉及地址引用的問題,之後b[0]=2這句其實毫無意義,因為此時b已經不是數組了,自然不具有b[0]這樣的索引方式。所以b與a的地址引用關係其實在b=2之後就消失了。此時外界的a仍是[1,2,3];
以上所述就是本文的全部內容了,希望大家能夠喜歡。