预备知识

首先要明白基本类型和引用类型的区别:

基本类型:

var num1=5;
var num2=num1;

基本类型存储图

clipboard.png

从他们的存储空间可知:num1和num2的存储是独立的,改变其中一个的值,另一个不会受到影响

引用类型:

var obj1=new Object();
var obj2=obj1;
obj1.name="Nicholas";
console.log(obj2.name);   //Nicholas

引用类型存储图

clipboard.png

从他们的存储空间可知,改变其中一个的属性值,另一个的属性值也会改变。

值传递的典型

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的参数传递还是有点小复杂的。


爱睡觉的小猫咪
310 声望22 粉丝

勤奋的小前端