今天在上Node課程時講師提到了一個JS的概念,似乎在Node中是相當重要的,也正好複習一下JS的觀念,反正…JS學得好 Node沒煩惱嘛! 我們直接看一下範例就可以很快的了解今天的主題了。請看一下以下的程式瑪。
Pass by value
function change(b) {
b = 2;
}
var a = 1
change(a)
console.log(a) //輸出結果為?
可以先試著猜猜最終的輸出結果,如果你是跟我一樣的菜鳥的話,那你的答案很可能就是2了,可惜~正好相反! 最終的輸出結果的的確確會是1,為什麼?
首先你必須理解在JS中初始類別(Primitive)的概念,我們之前有提過,在JS中大部分的東西都是物件(Object),而像是字串、數字等非物件的單一數值我們就稱這種資料類型為初始類別。
當你將一個初始類別的值賦予給另一個初始類別,如下
let a = 2 let b = a
實際上發生了什麼事情? b其實是複製a的值,並自行存放在一個自己的獨立記憶體中,所以這時候不管你怎麼改變b的值,a都不會受影響,反之亦然。
了解這個概念之後再回頭看範例,當我把a pass進 function change的時候,這個回傳的值複製了a的值,並將其存放在獨立的記憶體中,自然a並不會受到任何影響囉!
這就是所謂的pass by value,當你將一個初始類別放進函數,最後輸出的結果實際上是用不同的記憶區塊去存放。 接著我們來看一下pass by reference的範例。
Pass by reference
function obj(another_obj) {
another_obj.prop1 = {}
another_obj.prop2 = function (){}
}
var c = {}
c.prop2 = {}
obj(c)
console.log(c)
如果真的已經完全了解pass by value的概念,反推就可以了! 當你今天將物件傳進函式時,指向的會是相同的記憶區塊,在上面的例子中,我將c pass 進function obj內,在裡面我對參數another_obj做的任何事情都會同樣影響到c這個物件。因此,輸出的結果就很簡單了
{ prop2: [Function], prop1: {} }
雖然我在L6將c.prop2 設為空物件,但由於傳進函式後再度被改寫為一個空函式,造成了以上的輸出結果! 挺有意思的吧~!