我们可以通过如下例子来理解:
1、参数绝对不可能是按引用传递的,绝对是按值来传递,都是复制了一份,引用也是,只不过引用的话他们指向的对象在堆内存中只有一个,而且是全局对象。
2、ECMAScript 中所有函数的参数都是按值传递的。也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。基本类型值的传递如同基本类型变量的复制一样,而引用类型值的传递,则如同引用类型变量的复制一样。
var person =new Object();
person.name='LWH';
function setName(obj){
//这里面的obj是复制了一份外面的引用传过来的,因为方法只能传递值(基本类型的值和引用类型的值)
obj.name='MHM';
alert(obj.name);
}
setName(person);
alert(person.name);//这里肯定变成了MHM,因为虽然引用是复制过去的,但是指向的外部堆是同样的。
function setName2(obj){
//这里面的obj是复制了一份外面的引用传过来的,因为方法只能传递值(基本类型的值和引用类型的值)
//这里的话因为是复制进来的,所以这个对象已经不影响外部的person对象中的值了,并且这个对象在函数执行外后,会被立即销毁
obj=new Object();
obj.name="MHM";
alert(obj.name);
}
var person2 =new Object();
person2.name='LWH';
setName2(person2);
alert(person2.name);//这里还是会打印LWH
结语
仔细理解,其实蛮好理解的,只要考虑引用也是值即可,引用类型值的传递,则如同引用类型变量的复制一样。这个跟java有不同,java是可以传递引用的,他的引用并不会复制一份传进来。