Javascript中的值引用是指變量存儲的是值在內存中的地址,而不是值本身。換句話說,當變量通過賦值或傳遞給函數等操作時,變量存儲的僅僅是指向值在內存中的指針。
下面看一個例子:
let a = [1, 2, 3]; let b = a; b[0] = 100; console.log(a); // [100, 2, 3]
在這個例子中,a變量被賦予一個數組[1, 2, 3],b變量又被賦成了a。如果我們修改b的第一個元素,a也會受到影響。
再看一個例子:
let c = { x: 10, y: 20 }; let d = c; d.x = 100; console.log(c); // { x: 100, y: 20 }
在這個例子中,c變量被賦予一個對象{x: 10, y: 20},d變量又被賦成了c。如果我們修改d的屬性x,c也會受到影響。
可以看出,數組和對象都是引用類型,變量存儲的僅僅是指向值在內存中的指針。因此在JavaScript中,當我們傳遞一個數組或對象給函數時,函數獲得的是指向該數組或對象的指針,而不是復制數組或對象的全部內容。
下面看一個傳遞對象給函數的例子:
function changeObj(obj) { obj.x = 100; } let e = { x: 10, y: 20 }; changeObj(e); console.log(e); // { x: 100, y: 20 }
在這個例子中,我們把對象e傳給了函數changeObj。在函數內部,我們修改了它的屬性x,而外部變量e也被修改了。這是因為函數獲得的是指向該對象的指針。
總之,在JavaScript中,使用引用類型變量時要特別小心。如果一個變量的值是數組或對象,那么只是存儲了該數組或對象的指針。因此,當我們操作該變量的時候,實際上是操作數組或對象在內存中的地址。
最后,我們需要注意的是,基本類型和引用類型的賦值是不同的。基本類型的賦值是值復制,而引用類型的賦值是指針復制。因此,基本類型的修改不會影響其他變量,而引用類型的修改會影響所有指向該對象的變量。