在js中变量存在着两种数据类型的值,一种是基本类型值,一种是引用类型值。
1. 基本类型值
我们常说的基本类型值包括String,Number,Boolean,Undefined,Null,这5种基本数据类型。
通常是通过栈的存储结构进行存储,存储的形式较为简单
变量 | 值 |
---|---|
a | 'hello' |
b | 1 |
当我们分别定义了一个变量a与变量b,将变量a赋值给变量b毋庸置疑,此时变量b的值将会改变。
变量 | 值 |
---|---|
a | 'hello' |
b | 'hello' |
此时我改变变量a的值b的值是不会跟着改变的。
变量 | 值 |
---|---|
a | 'word' |
b | 'hello' |
var a = 'hello';
var b = 1;
b = a; // b = 'hello'
a = 'word';
// b = 'hello'
2. 引用类型值
引用类型也就是复杂的数据类型其中包括Object,Array,Function等
引用类型的储存结构不同于基本类型,在我们定义一个变量储存引用类型时,js会在栈内存中存放该变量以及指向堆内存对象的一个地址,这个地址指向我们堆存储中存放的引用值。
变量 | 值 |
---|---|
a | 地址一 |
b | 地址二 |
当我们分别定义了一个变量a与变量b,将变量a赋值给变量b毋庸置疑,此时变量b的值将会改变。
变量 | 值 |
---|---|
a | 地址一 |
b | 地址一 |
此时我改变变量a的值b的值也会跟着改变的。
变量 | 值 |
---|---|
a | 地址一 |
b | 地址一 |
var a = [1,2,3,4,5];
var b = [6,7,8,9];
b = a;//b=[1,2,3,4,5];
a.push(6);
//b=[1,2,3,4,5,6]
3. 传递参数
传参相信大家都很不陌生,传参里面也有一些很有趣的东西。
function a(i){
i++;
return i;
}
var y = 10;
var res = a(y);
// y = 10;
// res = 11;
可能你会觉得我很无聊,不急,往下看
function a(obj){
obj.b = 'hello';
}
var newobj = new Object();
a(newobj);
//newobj.b = 'hello'
是不是觉得当传引用类型的时候,obj就是指向外部的引用类型,不慌继续往下看
function a(obj){
obj.b = 'word';
obj = new object();
obj.b = 'hello word';
}
var newobj = new Object();
a(newobj);
//newobj.b = ?
这时候输出的值是多少呢,相信大家会有不同的看法,答案是word。是不是有点想不明白。其实引用类型传参obj指向和外部newobj指向同一个地址并没有错,可是我们要明白,传参其实是js在函数内部定义了一个obj的参数,所以obj可以说是a函数内部中的一个参数,一开始我们将外部的newobj赋值给内部obj,因此他们指向了同一个地址,此时我们改变引用类型值newobj也跟着改变,可是我们又重新定义引用类型指向我们局部的obj,我们的obj与外部newobj在无关联,而且函数执行完毕后,局部变量也被销毁了。
这都是我个人的理解,如有不正确的地方,希望各位大佬指点。