JavaScript是按引用傳遞仍是按值傳遞語言?

基本類型(數字,字符串等)按值傳遞,但對象是未知的,由於它們均可以按值傳遞(若是咱們認爲保存對象的變量其實是對對象的引用) )和按引用傳遞(當咱們認爲對象的變量包含對象自己時)。 git

儘管最後並無什麼大不了,但我想知道呈現經過慣例的參數的正確方法是什麼。 是否有JavaScript規範的摘錄,其中定義了與此相關的語義? github


#1樓

當我想將一個對象做爲參數傳遞或修改或徹底替換時,我發現Underscore.js庫extend方法很是有用。 函數

function replaceOrModify(aObj) {
  if (modify) {

    aObj.setNewValue('foo');

  } else {

   var newObj = new MyObject();
   // _.extend(destination, *sources) 
   _.extend(newObj, aObj);
  }
}

#2樓

基元按值傳遞,對象按引用傳遞。 這與其餘語言(如C,Visual Basic或Delphi)徹底不一樣。 我不能說它們如何精確地處理對象和基元,可是我知道Visual Basic和Delphi能夠(而且應該)指定它們。 spa

從版本5開始,PHP進行了相似的操做:全部對象都經過引用傳遞,可是全部原語能夠經過引用傳遞(若是前面帶有&符)。 不然,基元將按值傳遞。 code

所以,在JavaScript中,若是我經過參數將對象X傳遞給函數,則它仍然是X。若是要更改函數內部的數據(或其餘任何對象,但這並不重要),則在功能。 對象


#3樓

  1. 基元(數字,布爾值等)按值傳遞。
    • 字符串是不可變的,所以對它們而言並不重要。
  2. 對象經過引用傳遞(引用經過值傳遞)。

#4樓

函數內部的簡單值不會更改函數外部的值(它們經過值傳遞),而複雜的值會(經過引用傳遞)。 ip

function willNotChange(x) {

    x = 1;
}

var x = 1000;

willNotChange(x);

document.write('After function call, x = ' + x + '<br>'); // Still 1000

function willChange(y) {

    y.num = 2;
}

var y = {num: 2000};

willChange(y);
document.write('After function call y.num = ' + y.num + '<br>'); // Now 2, not 2000

#5樓

在某些狀況下,更改anArg可能會有所幫助: 字符串

function alterMyArg(func) {
    // Process some data
    // ...
    func(data);
}

alertMyArg(function(d) {anArg = d;});
相關文章
相關標籤/搜索