编程的时候,你可能会碰到关于变量赋值和变量作为参数传递之类的疑难杂症。明明是符合逻辑的,偏偏结果不是自己想要的。下面请听我一一道来。
请看代码
- 代码1:
var a = 5;
var b = a;
b = 6;
alert(a);
这时页面输出结果为:5.这里大家肯定觉得没什么问题,那么请看代码2.
2. 代码2:
var obj1 = {
name:"关羽",
weapon: "青龙偃月刀",
horse:"赤兔马"
}
var obj2 = obj1;
obj2.name = "吕布";
alert(obj1.name);
这个时候大家脑海中闪过的第一个答案肯定是‘关羽’。恭喜大家,回答错误。正确答案是:吕布。
为什么?为什么?这不符合逻辑啊?
还请大家听我继续唠叨唠叨。
数据类型
js中数据类型有两种(别再以为只有五种基本数据类型了)
基本数据类型:包括str、num、boolean、null、undefined
引用类型 :就是对象。包括object、Array、function、date
基本类型的复制,相当于建立一个副本。改变副本中的数据,对前者没有任何影响。引用类型的复制不一样。引用数据类型的复制相当于创建一个影子副本,两者中任何一个有数据变化,另一个也会产生相应变化。(如果大家想要更深入了解其中的原因,可以去了解后台的内存分配机制)
可是这跟函数参数的传递有什么联系呢?
3. 代码3:
var a = 5;
function num(x) {
x = 6;
alert(x);
}
num(a);
alert(a);
第一个输出结果为6.第二个输出结果为5;
为什么同样是输出a,结果为什么不一样?把a传入到函数后,a会重新赋值为6,那么最终输出结果不都应该是6吗?
将变量传入函数相当于复制一个变量,然后把这个复制的变量传入到函数中。我们的关注点在与这个复制变量的值的变化是否会影响本体变量。这就涉及到上面所讲的基本数据类型和引用数据类型复制的相关知识。a是一个数字类变量,它的复制对象跟它之间没有任何联系。在函数内部改变a的值并不会改变函数外a的值。
我们来试一下对象。
var obj1 = {
name:"关羽",
weapon: "青龙偃月刀",
horse:"赤兔马"
}
function obj(a) {
a.name = "吕布";
alert(a.name);
}
obj(obj1)
alert(obj1.name);
最后的输出结果都是吕布。