javascript对象属性作为参数

时间:2012-02-16 18:23:48

标签: javascript

如果在javascript对象属性中通过引用传递,为什么这不起作用:

var myObj={a:1}

function myFun(x){
x=2;
}

myFun(myObj.a);

// value myObj.a is still 1

但另一方面,如果你这样做:

var myObj={a:1}

function myFun(x){
x.a=2;
}

myFun(myObj);

// this works myObj.a is 2

3 个答案:

答案 0 :(得分:2)

你的第一个例子不起作用,因为对象属性是而不是通过引用传递(除非属性本身也是一个对象)。

对象,正如您所注意到的, 通过引用传递 - 这就是您的第二个示例工作的原因。

答案 1 :(得分:2)

原始值按值传递。对象通过引用传递。

对象属性根据其数据类型传递。

这里传递一个整数 - x表示值1.分配x值2不会引用原始对象。

假设您传入的属性是一个数组。我调用的第二个函数接收一个数组,然后你对该数组进行更改。然后更改将持久保存到对象,因为对象的属性包含对您修改的数组的引用。您根本没有在技术上修改对象...您只是修改了对象中引用的数组。将对象属性传递给函数时,它根本不知道它属于对象。

查看示例,与您的相似:

var myObj={a:[1]}

function fn1(x){
 x=2; //Overwrites x in this scope to the new primitive 2. 
      //This isn't reflected in myObj because x is not a 
      //reference to myObj.a  it is a reference to the array 
      //that myObj.a contains (the [1]).
}

function fn2(x){
 x.push(2);
}

fn1(myObj.a); //myObj.a is [1]
fn2(myObj.a); //myObj.a is [1,2]

答案 2 :(得分:0)

传递基础数据类型时,它会按值传递。对于整数,您可以按值传递参数,以便在本地范围内创建它的副本。然而,对象通过引用传递,因此函数可以访问变量。你可以通过引用传递它,但它更容易做到

 Obj.a=fun(Obj.a);