原文鏈接:ECMA-262-3 in detail. Chapter 8. Evaluation strategy.
=============================================================
求值策略(Evaluation strategy)是每個計算機語言的設計者都會遇到的問題。作者總結了,有三種:
- 傳值(Call by value)
- 傳引用(Call by reference)
- 共享(Call by sharing)
為了不至於引起太多迷惑,我就不把這些方式的原理寫出來了,只羅列一些跟JavaScript有關的信息。它的情況可以用下面的代碼演示(注意:在Chrome (Version 56.0.2924.87)和Firefox (51.0.1 (32-bit))中測試的結果都相同):
var bar = {
x: 10,
y: 20
};
function foo(barArg, isFullChange) {
if (isFullChange) {
barArg = {z: 1, q: 2};
return;
}
barArg.x = 100;
barArg.y = 200;
}
foo(bar);
// with call by sharing strategy,
// values of outside object properties are changed
console.log(bar); // {x: 100, y: 200}
// but with full change of object
// there is no changes
foo(bar, true);
// still the same from the previous call
console.log(bar); // {x: 100, y: 200}
可概括為:
- 對於原始數據類型,JavaScript傳遞函數參數使用的是傳值;
- 對於對象數據類型,JavaScript傳遞函數參數使用的是共享。
解釋下共享的原理:
傳遞給函數的數據是一個指向實際變量存儲位置的引用,在函數里可以通過這個引用修改該對象的屬性的實際值,由於是引用,所以是直接在原地址上修改原對象的屬性;但是,如果給這個引用變量本身重新賦值,讓它指向另外一個新的對象的地址,那麼對它的修改就不會影響到原本的對象了。