【问题标题】:Javascript: Putting objects into arrays and passing it to functionsJavascript:将对象放入数组并将其传递给函数
【发布时间】:2014-09-22 14:02:56
【问题描述】:

当一个对象被压入数组时,它是否引用了该对象的同一个实例?

例如:

function object() {
    var count = 1;
}

array = [];

var obj = new object();
array.push(obj);

这里,是数组内的对象,“array[0]”,数组外的对象,“obj”的同一个实例吗?

另外,如果我要将 obj 传递给另一个函数,我是将对象的相同实例传递给函数的参数还是函数会创建一个新对象?

【问题讨论】:

  • 计数只是对象的一个​​属性。
  • 我认为您是在问对象是按值传递还是按引用传递?
  • 您是否尝试过 obj.count = 2; console.log(array[0].count); 并查看它的输出?

标签: javascript arrays node.js parameter-passing


【解决方案1】:

不是primitive type 的所有内容都通过引用传递。

【讨论】:

  • JavaScript 中的一切都是按值传递的。总是。
  • 您介意详细说明一下吗?如此处所述:stackoverflow.com/questions/13104494/… 不是原始的所有内容都通过“引用副本”传递,因此仍然是一个引用。
  • 因此,虽然措辞可能会误导来自支持正确按值/引用传递的语言的人,但它基本上正确地说所有非原始数据都作为 a 引用传递充分回答了这个问题。
  • 所有非原始的东西都不会作为引用“传递”——所有非原始的都是引用,就像在 Java 中一样。与任何其他操作相比,“通过”并没有什么特别之处。 JavaScript 中的每个值要么是原始值,要么是引用。当你创建一个对象时,你会得到一个引用;当你访问一个成员时,点的左边是一个引用;基本上,只要你在 JavaScript 中有一个非原始的,你就有一个参考。
【解决方案2】:

Javascript 是通过值传递原语的(对于对象也是如此 - 但在这种情况下,值是对对象的引用)。然而,当一个对象被传入一个数组时,这个值是一个对象的引用。当您传递一个对象或数组时,您传递的是对该对象的引用,并且可以修改该对象的内容,但如果您尝试覆盖该引用,它不会影响调用者持有的引用的副本即引用本身是按值传递的。

当你传入一个原语(例如字符串/数字)时,值是按值传入的。在函数中对该变量的任何更改都与函数外部发生的任何更改是分开的。

为基元传递值

function testFunction(x) {
      // x is 4
      x = 5;
      // x is now 5
}

var x = 4;
alert(x); // x is equal to 4
testFunction(x); 
alert(x); // x is still equal to 4

通过引用传递对象(通过值传递但这个值是引用):

function myObject() {
    this.value = 5;
}
var o = new myObject();
alert(o.value); // o.value = 5
function objectchanger(fnc) {
    fnc.value = 6;
}
objectchanger(o);
alert(o.value); // o.value is now equal to 6

虽然传递对象的方法不是通过引用传递的(由于在将函数作为参数传递时丢失了上下文)。

【讨论】:

    【解决方案3】:

    javascript 中的对象通过引用传递到数组中。要复制一些代码,

    function object(){
        var count = 1;
    }
    array = [];
    var obj = new object();
    array.push(obj);
    array.push(obj);
    array[1]['n'] = 5
    

    产生

    array
    => [ { n: 5 }, { n: 5 } ]
    

    这是因为您只是在使用对实际对象的引用。因此,对对象的任何引用都是相同的——无论是在数组中、重复项还是您拥有的对象。如果你想要一个深拷贝,你需要自己实现它。

    【讨论】:

    • 函数呢?它是通过引用来实现的吗?
    • 当您将函数作为参数传入时丢失了上下文
    【解决方案4】:

    当你将对象压入数组时,仍然只有一个对象实例。变量包含对对象的引用,而数组包含对同一对象的另一个引用。

    如果您更改对象,那么当您通过变量和数组查看它时,更改都是可见的,因为它是同一个对象。但是,如果您更改变量(例如为其分配另一个对象),则不会影响数组;它仍然会引用原始对象。

    当您将对象作为参数传递给函数时,引用是按值传递的。该对象仍然只有一个实例,但参数与您在调用中使用的变量是分开的。如果您更改函数内部的对象,则更改在函数外部可见,因为它是同一个对象,但如果您更改参数,则不会影响您在调用中使用的变量。

    【讨论】:

      猜你喜欢
      • 2011-12-07
      • 1970-01-01
      • 2017-07-21
      • 2020-12-22
      • 2016-07-11
      • 2015-03-01
      • 1970-01-01
      • 2016-06-16
      相关资源
      最近更新 更多