javascript---传参:不能传递引用类型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript---传参:不能传递引用类型相关的知识,希望对你有一定的参考价值。
总结:
• 按值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实参的副本。修改形参的值并不会影响实参。
• 按引用传递(call by reference)时,函数的形参接收实参的隐式引用,而不再是副本。这意味着函数形参的值如果被修改,实参也会被修改。同时两者指向相同的值。
1.传递基本类型的值
var box=‘lee‘; //传递基本类型的值,参数的值和外面的值无关 function one(box){ box=123; } one(box); alert(box); //lee
解答:这个大家应该都懂,形参不影响实参。
2.传递引用类型(注意不是按引用类型传递)
1 var box=new Object(); //传递引用类型,不是按引用传递,参数的值是地址 2 function one(box){ 3 box.name=‘lee‘; 4 var box=new Object(); 5 box.name=‘kkk‘ 6 } 7 one(box) 8 alert(box.name); //lee
解答:这里大家可能有疑惑,为什么不是kkk。首先,函数参数是引用类型则传递其地址,即是副本,都是指向同一个值,只是地址不同,然后再在顺着地址找到其值。第3行,添加了name属性,第4行
new了一个对象,此时box指向新的值,此时赋值kkk不再会影响原来的函数外的box值,因为地址指向的值都不相同了。
注意:按引用传递的话,是将整个box对象传递进去,已经不是副本,执行第4行,之前的box值会被覆盖掉,并且box.name=‘kkk‘了。
结论:对于数字、字符串等是将它们的值传递给了函数参数,函数参数的改变不会影响函数外部的变量。
对于数组和对象等是将对象(数组)的变量的值传递给了函数参数,这个变量保存的指向对象(数组)的地址。
当函数改变这个地址指向的对象(数组)的内容时,同时也改变了函数外部变量指向的对象(数组)的内容;当函数改变的是变量的地址时,
实际就与函数外部的变量失去了联系,变成了完全不同的对象了,不会对函数外部对象造成改变。
基本类型值传递的是值,直接访问栈的值
引用类型传递的是地址,如果在函数内的地址未被改变,则实参会随函数的执行改变而改变;如果地址改变了,则不再与实参有关
以上是关于javascript---传参:不能传递引用类型的主要内容,如果未能解决你的问题,请参考以下文章