Javascript 赋值机制详解
今天回答了一个关于Javascript的问题,涉及到了赋值问题,因此想把这个问题好好总结下。
vara='test'; varb=function(){}; b.a='test'; functionchange(m,n){ m='change'; n.a='change'; } change(a,b);
执行上述代码后,变量a和b的值会发生改变吗?
原始值和引用值
在之前的文章中介绍过原始值和引用值,原始值指的Undefined,Null,Boolean,Number,String等,它们存放在栈中,而引用值则集成自Object,它被存放在堆中。
这里要把两者区分清楚:
vara='test'; varb=newString('test'); varA='true'; varB=newBoolean('true');
以上四个变量,a和A为原始值,而b和B则为引用值。
赋值机制
清楚了原始值和引用值的区别后,就可以具体介绍Javascript的赋值机制:
在Javascript中,对于原始值类型的变量,每次赋值都将生成一份拷贝,而对于引用值,则正如其名,是通过引用赋值,指向同一个存储对象的内存处。
原始值的赋值:
vara=1;//原始值 varb=a;//生成一份拷贝给变量b b=2;//与a无关 alert(a);//输出1
引用值的赋值:
varA=newObject();//引用值 A.x=1; varB=A;//引用赋值,指向同一个内存处 B.x=2;//修改B将影响A alert(A.x);//输出2
参数传递
现在我们来看看传递两种类型的值给函数形参时时怎么处理的。
1.传递原始值
vara=1; functiontest(m){ m=2; } test(a); alert(a);//输出1
输出为1,所以我们知道函数只是将变量的值传递进去了,所以在函数体内的m得到传来的值1,再被赋值为2,这个过程不影响外部的变量a。
2.传递引用值
varA=newObject(); A.x=1 functiontest(M){ M.x=2; } test(A); alert(A.x);//输出2
输出为2,所以我们知道函数将变量的地址传递进去了,所以函数体内的M得到传递来的地址,因此属性x被赋值为2的同时也会影响指向同一内存地址的A。
总结
现在再回到开篇的问题:
vara='test'; varb=function(){}; b.a='test'; functionchange(m,n){ m='change'; n.a='change'; } change(a,b);
变量a为原始值,变量b为引用值,传递进函数体内一个为值,一个为地址,所以函数运行后,变量a不会改变,而变量b的值将会改变。