最近投了几家公司面试,其中有一家公司面试官面试我非常感谢他,感觉他像一位老师的角色对于我回答不上来的问题以及回答错误的问题耐心指导。js基础真的很重要!!面完之后我觉平常我只是看到了问题的表面,并没有深度的了解。今天深入了解了一个小知识点,也分享给大家。有不对的地方,希望大家指出改正!
js数据类型主要分两类:
原始值:string,number,Boolean,undefined,null
引用值:object,array,function,date
其中原始值属于栈数据,引用值属于堆数据。栈数据肯定就是跟我们数据结构学的先进先出是一样。我就举例子画图来让大家更直观的理解一下吧
var a = 100
var b = a
a = 200
前两句赋值数据都是存在栈中,下图所示分别从栈中申请了一个空间存放变量的值;
第三句修改变量a的值,其实不是在a变量上直接修改,而是把变量a覆盖了。之前申请的空间还在被占用,如下图所示
再举一个引用值的例子
var a = [1,2]
var b = a
a.push(3)
代码前两句话的意思就是,在栈中给a申请了一个空间,但是a的值是引用类型的,所以就在堆中给[1,2]申请了一个空间,然后a变量存的值是堆的地址值。 第二句话把a的值赋值给b,就相当于把a的值1001地址赋值给了b,所以ab指向同一个空间。so第三句话呢,给a数组中加入了3,ab两个变量的值都变为了[1,2,3]
另外一种情况
var a = [1,2]
var b = a
a = [1,3]
第三句给a赋值,相当于重新在堆中给[1,3]申请了一块空间,然后把此地址赋值给了a变量,所以此时a,b是两个不同的数组
我感觉应该说的很清楚了,以后多多更新,希望可以跟大家共同进步!!!