预备知识
首先要明白基本类型和引用类型的区别:
基本类型:
var num1=5;
var num2=num1;
基本类型存储图
从他们的存储空间可知:num1和num2的存储是独立的,改变其中一个的值,另一个不会受到影响
引用类型:
var obj1=new Object();
var obj2=obj1;
obj1.name="Nicholas";
console.log(obj2.name); //Nicholas
引用类型存储图
从他们的存储空间可知,改变其中一个的属性值,另一个的属性值也会改变。
值传递的典型
function addTen(num){
return num+10;
}
var count=20;
var result=addTen(count);
console.log(count); //20
console.log(result); //30
这是典型的值传递的例子,count只是把它的值给了局部变量,因此他们的存储是分开的,函数不会改变count的值。
传递引用类型也属于值传递
function setName(obj){
obj.name="Nicholas";
}
var person=new Object();
setName(person);
console.log(person.name); //Nicholas
咦?person对象的值已经改变了呀,为什么它还是值传递呢?
先让我们再来看一个例子吧:
function setName(obj){
obj.name="Nicholas";
obj=new Object();
obj.name="Greg";
}
var person=new Object();
setName(person);
console.log(person.name); //Nicholas
如果为引用传递:则在第二个例子中,person把它的地址给了局部obj,局部obj拥有了另一把可以进入person操作的钥匙,obj在第三行new的时候便会把person指向一个新的对象,person的名字将变为Greg,可是结果并非如此,所以不是引用传递。
person存储在堆中,是全局的,具有唯一性,person传值时,obj可以对他进行操作,可以理解为person给了obj钥匙,但是门的掌控权仍在person手中,obj不能再建一个新门。
看来js的参数传递还是有点小复杂的。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。