剖析JavaScript传值
大家都知道JavaScript中有基本类型值和引用类型值,下面我将分享这两个类型在变量的交互中的应用。实践过的,出过问题的哦~~~~
1.赋值变量的值:
【1】基本类型值
var num = 5;
var num1 = num;
实际的工作方式是:将num复制一个副本5,然后赋给num1,虽然相等,但是两个变量的值完全独立。
验证:
alert(num1);//5
alert(num+5);//10
【2】引用类型
当一个变量向另一个变量赋值引用类型时,同样也会是复制一个副本给另一个变量,但这里是复制的是指针,而这个指针指向的是堆栈中的一个对象。
如果其中一个变量发生改变,另一个也会发生改变。请看:
var obj1 = new Object();
var obj2 = obj1;
obj1.name="XXX";
alert(obj2.name);//"XXX"
2.参数传递
【1】基本类型值按值传递,这个好说。
如果变量向函数的参数传值时,被传递的值会复制给参数(ECMAScipt的arguments元素),
function addNum(num){
num = num+10;
return num;
}
var num = 10;
var result = addNum(num);
alert(num);//10没有变化
alert(result);//20
【2】引用类型还是按值传递!!!!!
function setName(obj){
obj.name="XXX";
}
var man=new Object();
setName(obj);
alert(man.name);//"XXX"
到此千万不要以为是引用传递,如果这么认为的话,那你还得看下面的代码:
function setName(obj){
obj.name="XXX";
obj = new Object();
obj.name="wrong";
}
var man=new Object();
setName(man);
alert(man.name);//还是"XXX"
上面的例子证实了,如果是按照引用传值的话,结果应该是“wrong”。
而实际上在函数内部重新声明一个obj只是一个局部对象,当函数执行完的时候就会销毁。
由于本人水平有限,不能举出一些高端的例子望见谅
如果您觉得有不对,或不全,求更正求补充。