选手自我介绍:
值传递:多针对于基本类型而言,即外部定义变量,传递给函数后,如果在函数内部对参数进行了改变,不会影响外部定义变量本身的值。
引用传递:多针对对象而言,即外部定义的对象,传递给函数后,如果在函数内部对对象进行了改变,就会影响外部定义的对象。
值传递 vs 引用传递开始
值传递示例
function addNum(num){ num += 20; return num; } var testVar = 20; var reTestVar = addNum(testVar); alert(testVar);//20 alert(reTestVar);//40
我们看到,传递的testVar在addNum函数内对参数加20,而testVar自身的值并没有改变。
引用传递示例
function changeObj(obj){ obj.color ="red"; } var flower = new Object(); flower.color = "blue"; changeObj(flower); alert(flower.color);//red
我们看到,传递的flower在changeObj函数内对对象设置了color属性,而外部flower自身color属性值也确实被改变了。
好了裁判宣布二者各领风骚,打成平手。
等等值传递有话要说:引用传递有问题!
先上证据:
function changeObj(obj){ obj.color ="red"; obj = new Object(); obj.color = "yellow"; } var flower = new Object(); flower.color = "blue"; changeObj(flower); alert(flower.color);//red
为什么alert(flower.color)是red而不是yellow?
稍等,专家席给出评论:
按照引用传递的说法,传递进去的flower对象的最终值被赋予了新对象,并且color属性值为yellow,而结果却是red,故引用传递在javascript中这个概念错误的。
为什么值会被变为red,因为obj和flower引用的是堆内存中的同一个对象,换句话说即使这个对象是按值传递的,obj也会按引用的内存地址对同一个对象进行修改,
故引用传递给出的例子说明不了什么。
宣布:值传递 vs 引用传递 ,值传递获胜。
自古成者王败者寇:javascript中只有值传递,没有引用传递。