基本类型和引用类型的值

在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在无关联,而且函数执行完毕后,局部变量也被销毁了。

这都是我个人的理解,如有不正确的地方,希望各位大佬指点。

你可能感兴趣的:(javascript前端)