基本類型(數字,字符串等)按值傳遞,但對象是未知的,由於它們均可以按值傳遞(若是咱們認爲保存對象的變量其實是對對象的引用) )和按引用傳遞(當咱們認爲對象的變量包含對象自己時)。 git
儘管最後並無什麼大不了,但我想知道呈現經過慣例的參數的正確方法是什麼。 是否有JavaScript規範的摘錄,其中定義了與此相關的語義? github
當我想將一個對象做爲參數傳遞或修改或徹底替換時,我發現Underscore.js庫的extend方法很是有用。 函數
function replaceOrModify(aObj) { if (modify) { aObj.setNewValue('foo'); } else { var newObj = new MyObject(); // _.extend(destination, *sources) _.extend(newObj, aObj); } }
基元按值傳遞,對象按引用傳遞。 這與其餘語言(如C,Visual Basic或Delphi)徹底不一樣。 我不能說它們如何精確地處理對象和基元,可是我知道Visual Basic和Delphi能夠(而且應該)指定它們。 spa
從版本5開始,PHP進行了相似的操做:全部對象都經過引用傳遞,可是全部原語都能夠經過引用傳遞(若是前面帶有&符)。 不然,基元將按值傳遞。 code
所以,在JavaScript中,若是我經過參數將對象X傳遞給函數,則它仍然是X。若是要更改函數內部的數據(或其餘任何對象,但這並不重要),則在功能。 對象
函數內部的簡單值不會更改函數外部的值(它們經過值傳遞),而複雜的值會(經過引用傳遞)。 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
在某些狀況下,更改anArg
可能會有所幫助: 字符串
function alterMyArg(func) { // Process some data // ... func(data); } alertMyArg(function(d) {anArg = d;});