如果在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
答案 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);