2012-02-16 103 views
2

如果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 

回答

1

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

对象属性是通过基于它们的数据类型通过。

这里要传递的整数 - 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

你的第一个例子没有按“T的工作,因为对象性质通过引用传递(除非属性本身也是一个对象)。

正如你注意到的,通过引用传递 - 这就是你的第二个例子工作的原因。

0

当您通过一个基本数据类型,它是由值来传递。这是整数,您可以通过值,因此它的副本在局部范围内由传递参数。但是对象通过引用传递,所以函数可以访问变量。你可以通过引用来传递它,但它更容易做

Obj.a=fun(Obj.a);