共计 1383 个字符,预计需要花费 4 分钟才能阅读完成。
在 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 | 地址二 |
graph TD
A[地址一] -->B([1,2,3,4,5])
c[地址二] -->d([6,7,8,9])
当咱们别离定义了一个变量 a 与变量 b,将变量 a 赋值给变量 b 毋庸置疑,此时变量 b 的值将会扭转。
变量 | 值 |
---|---|
a | 地址一 |
b | 地址一 |
graph TD
A[地址一] -->B([1,2,3,4,5])
c[地址一] -->B([1,2,3,4,5])
此时我扭转变量 a 的值 b 的值也会跟着扭转的。
变量 | 值 |
---|---|
a | 地址一 |
b | 地址一 |
graph TD
A[地址一] -->B([1,2,3,4,5,6])
c[地址一] -->B([1,2,3,4,5,6])
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 在无关联,而且函数执行结束后,局部变量也被销毁了。
这都是我集体的了解,如有不正确的中央,心愿各位大佬指导。