如果一个对象作为函数中的参数传递,它是否会创建一个新实例?

时间:2011-01-21 22:39:36

标签: javascript

在此代码中:

function myFunction(obj) {
  console.log(obj);
}

var obj = {
  key : 'value',
  funct :  function(){},
  elem  :  document.getElementById('navigation').getElementsByTagName('a')
}

myFunction(obj);

对象“obj”是否在myFunction内的控制台中打印出我定义的同一个对象,或者是一个新实例?

另外,如果我将它从myFunction传递给另一个函数怎么办?

5 个答案:

答案 0 :(得分:2)

它应该是您定义的同一个对象,无论您传递多少次,它都将继续使用相同的对象。为什么?你看到的东西表明情况并非如此吗?

您可能会感到困惑,因为原始值是按值传递的,而对象是通过引用传递的。

这是对差异的相当不错的描述:http://snook.ca/archives/javascript/javascript_pass

妙语可以是他的代码示例:

这是一个处理原始值的示例,在这种情况下是一个整数。有原始价值观, 原始值通过值传递,这意味着值的新副本将放置在具有函数调用的堆栈上。它还意味着对函数中的值所做的任何更改都是该函数的本地更改。

function myfunction(x) 
{
      // x is equal to 4
      x = 5;
      // x is now equal to 5
}

var x = 4;
alert(x); // x is equal to 4
myfunction(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

最后,如果用新引用替换传递给函数的引用,则此更改不会反映在函数外部。建立前一个例子:

function myobject()
{
    this.value = 5;
}
var o = new myobject();


function objectchanger2(fnc)
{
  function myObject2() 
     { 
        this.value = 10
     }
   fnc = new myObject2()
}

objectchanger(o);
alert(o.value); // o.value is still  5

答案 1 :(得分:2)

它是同一个对象,不是一个新实例。传递给函数的是对象的引用,而不是对象的副本。 JavaScript是一种纯粹的传值语言。传递给对象的函数(并保存在变量等中)的值是引用到对象,而不是对象本身。

您可以通过在函数中修改对象并查看是否看到这些mod来轻松证明对象未被复制:

function foo(obj) {
    alert(obj.prop1);
    obj.prop2 = "foo";
}
var thingy = {
    prop1: 'bar'
}
foo(thingy);
alert(thingy.prop2);

Live example

通过上述内容,您首先看到foo显示prop1 thingy属性的警告,然后您会看到显示prop2的外部代码的警告分配给foo

答案 2 :(得分:2)

这很容易为自己回答。试试这段代码,看看会发生什么:

function Test(obj) {
  obj.Whatever = "!";
}

var testObj = { original: true };
Test(testObj);
alert(testObj.Whatever);

如果警报显示“未定义”,则在传入函数时进行了复制。如果警报显示“!”,则您将对象本身(或引用或指针)传递给函数。

我很确定你会看到“!”

答案 3 :(得分:2)

所有非基元都在JavaScript中通过引用传递 - 也就是说,它们是同一个对象。但是,原语是通过值传递的:

function change(a) {
    a = 2;
}
var a = 1;
change(a);
alert(a); // should alert 1

function change2(a) {
    a.test = 2;
}
var obj = {test:1};
change2(obj);
alert(obj.test); // should alert 2

答案 4 :(得分:1)

我相信javascript通过引用传递,因此myFunction将看到对同一对象的引用。