Javascript函数是否通过引用或值默认返回对象?

我在全局范围内定义了一个在函数之外定义的对象。 该对象不作为parameter passing给函数,但该函数会修改它并返回修改后的对象。

我想知道的是,如果函数返回对象的副本或原始的全局对象?

此外,将该对象作为parameter passing给函数,有所作为,因为对象通过引用传递给函数?

每当你返回一个对象时,你都会返回一个对该对象的引用。 同样,当你传递一个对象时,你传递一个引用。 但是,将一个对象作为parameter passing可能与在全局范围内更改对象的方式不同,正如这些示例所示。 这是因为对象的引用本身是按值传递的。

如果你正在改变一个对象的成员,那么不pipe你是作为parameter passing还是更新全局对象都没有区别。 无论哪种方式,你正在使用同一个对象。

例1:

var object = {foo:'original'}; function changeObject() { object.foo = 'changed'; return object; } console.log(changeObject()); // outputs {foo:'changed'} console.log(object); // outputs {foo:'changed'} 

例2:

 var object = {foo:'original'}; function changeArgument(object) { object.foo = 'changed'; return object; } console.log(changeArgument(object)); // outputs {foo:'changed'} console.log(object); // outputs {foo:'changed'} 

另一方面,如果用新对象覆盖对象,如果对参数进行更改,则更改不会持续,但是如果对全局对象执行更改,则该更改将保持不变。 这是因为参数按值传递了对象的引用。 一旦你把这个值replace成一个新对象的引用,你就不再谈论同一个对象了。

例3:

 var object = {foo:'original'}; function replaceObject() { object = {foo:'changed'}; return object; } console.log(replaceObject()); // outputs {foo:'changed'} console.log(object); // outputs {foo:'changed'} 

例4:

 var object = {foo:'original'}; function replaceArgument(object) { object = {foo:'changed'}; return object; } console.log(replaceArgument(object)); // outputs {foo:'changed'} console.log(object); // outputs {foo:'original'} 

我想知道的是,如果函数返回对象的副本或原始的全局对象?

实际上,你只处理JavaScript中对象的引用。 即使var foo = {}只是将一个新对象的引用赋值给foo

如果对象在函数之外,则不需要“返回”。 如果修改了函数内的对象,它将更新对象本身。 然后您可以根据需要引用其他函数中新近更新的对象。

从你的问题,这是我认为你的代码看起来(或多或less):

 var o = {}; function f() { o.prop = true; return o; } 
  1. 在这种情况下,全局variableso引用一个对象。
  2. 当你修改o你修改任何引用。 因此它修改了原始对象。
  3. 当您返回o您将返回对原始对象的引用。

将对象传递给函数会导致对传递的原始对象的引用。 因此,任何修改都会影响原始对象。 例如:

 var o = {}; f(o); console.log(o.prop); // true function f(o) { o.prop = true; } 

可能是迟到的评论,但这是任何语言的典型挑战。 Obects在堆上创build,并通过与引用相反的引用(按值)传递。 我认为问题的根源是共享实例与独特实例,以避免不受欢迎的影响。 比如我们调用一个函数来获取新用户的模板(对象)添加到集合中,或者想要清除不同模块中取消事件的表单来重新开始。 它容易理解和容易忽略..testing案件通常不包括所有使用排列

理智清单:这里的共享实例:

 var bigo = { usr: {name: 'steven'}, bigi: function () { return this.usr; } }; var outA = bigo.bigi(); var outB = bigo.bigi(); print(outA.name); print(outB.name); outA.name = 'ilan'; // change value print(outA.name); print(outB.name); 

以上产生:

 steven steven ilan ilan 

非共享:

 var bigo = { bigi: function () { var user = {name: 'steven'}; return user; } }; var outA = bigo.bigi(); var outB = bigo.bigi(); print(outA.name); print(outB.name); outA.name = 'ilan'; // change value print(outA.name); print(outB.name); 

输出:

 steven steven ilan steven