您的位置:首页 > Web前端 > JavaScript

js--变量的复制与函数参数的传递

2017-08-23 23:50 239 查看
代码1.

var a = 5;
var b = a;
b = 6;
alert(a);


这时页面输出结果为:5.这里大家肯定觉得没什么问题,那么请看代码2.

代码2:

var obj1 = {
name:"关羽",
weapon: "青龙偃月刀",
horse:"赤兔马"
}

4000
var obj2 = obj1;
obj2.name = "吕布";
alert(obj1.name);


这个时候大家脑海中闪过的第一个答案肯定是‘关羽’。恭喜大家,回答错误。正确答案是:吕布。

为什么?为什么?这不符合逻辑啊?

还请大家听我继续唠叨唠叨。

基本数据类型:包括str、num、boolean、null、undefined

引用类型 :就是对象。包括object、Array、function、date

基本类型的复制,相当于建立一个副本。改变副本中的数据,对前者没有任何影响。引用类型的复制不一样。引用数据类型的复制相当于创建一个影子副本,两者中任何一个有数据变化,另一个也会产生相应变化。(如果大家想要更深入了解其中的原因,可以去了解后台的内存分配机制)

代码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);
最后的输出结果都是吕布。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: