在js中变量存在着两种数据类型的值,一种是根本类型值,一种是援用类型值。

1. 根本类型值

咱们常说的根本类型值包含String,Number,Boolean,Undefined,Null,这5种根本数据类型。

通常是通过栈的存储构造进行存储,存储的模式较为简单

变量
a'hello'
b1

当咱们别离定义了一个变量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在无关联,而且函数执行结束后,局部变量也被销毁了。

这都是我集体的了解,如有不正确的中央,心愿各位大佬指导。