DS.Lab筆記 - ECMA-262-3: 求值策略

原文鏈接: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傳遞函數參數使用的是共享。

解釋下共享的原理:

傳遞給函數的數據是一個指向實際變量存儲位置的引用,在函數里可以通過這個引用修改該對象的屬性的實際值,由於是引用,所以是直接在原地址上修改原對象的屬性;但是,如果給這個引用變量本身重新賦值,讓它指向另外一個新的對象的地址,那麼對它的修改就不會影響到原本的對象了。
























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值