function box(obj){
obj.name = "Lee";
}
var obj = new Object();
obj.name = "Look";
box(obj);
console.log(obj.name); //打印Lee
function box(obj){
obj.name = "Lee";
}
var obj = new Object();
box(obj);
obj.name = "Look";
console.log(obj.name); //打印Look
上面2段代码中,obj.name = "Look"这句代码放置的位置不同,为什么结果差别这么大?
在JS中函数的参数传递都是值传递,没有引用传递。var obj = new Object()
这个obj的值是个指针,指向新创建的Object类型的对象,而这个对象是放在堆中的。全局中的obj引用了这个对象。当全局中的obj传到box(obj)
中时,由于是值传递,在函数中的变量obj(这是个局部变量和全局中的obj毫无关系)就指向了堆中的object对象,也就是说此时有两个变量(分别是局部的obj和全局的obj)同时指向了堆中的同一个object对象,两个做的任何操作都会影响到堆中的同一个Object对象。所以obj.name
的最终值取决于你对它的最后更改。
注意下,js中是没有按引用传递这一说法的,引用类型作为参数传入到函数中算是按共享传递,对象obj其实也是一个指针啊,所以传参过程就是obj将其地址复制给box函数中的局部变量obj中,其实全局的obj与函数中局部obj指向的是内存中的同一块地址,所以可以看出,函数也可以修改对象obj的属性值,你上面的代码相当于
var obj = new Object();
obj.name = "Look";
obj.name = "Lee";
console.log(obj.name); // 这肯定是Lee把
var obj = new Object();
obj.name = "Lee";
obj.name = "Look";
console.log(obj.name); // 这肯定是Look把