- 基本类型:Undefined、Null、Boolean、Number 和 String,这 5 种基本数据类型是按值访问的。
- 引用类型:Object。是按引用访问的。
- 按值传递参数:函数外部变量a传给函数b,在函数内部改变b的值,a不会跟着改变。
- 按引用传递参数:函数外部变量a传给函数b,在函数内部改变b的值,a也会跟着改变。
var num1=5;
var num2=num1;
基本类型的复制
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Nicholas";
alert(obj2.name); //"Nicholas"
引用类型的复制
划重点:
ECMAScript 中所有函数的参数都是按值传递的。
也就是说把参数从函数外部传入函数参数,跟上面描述的复制原理是一样的。
基本类型参数的例子:
function addTen(num) {
num += 10;
return num;
}
var count = 20;
var result = addTen(count);
alert(count); //20,没有变化
alert(result); //30
引用类型的参数就有点混淆了:
function setName(obj) {
obj.name = "Nicholas";
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas"
第一眼看上去貌似,我在函数内部改了参数obj
的值,函数外部person
的值也跟着变了啊,这不就是引用传递,其实不是,我们接着看:
function setName(obj) {
obj.name = "Nicholas";
obj = new Object(); //新添加
obj.name = "Greg"; //新添加
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas"
我们在上面的例子里添加2行代码,在函数内部把参数obj
重新定义了一个对象,并赋值,会发现person
的name
还是"Nicholas"
并没有变成"Greg"
以上我们可以总结,任何参数传递都是把外部的值复制给函数的参数,但如果参数是引用类型,复制的是引用罢了,具体参考上图【引用类型的复制】
网友评论