首先要了解的js基础

基本数据类型:Object、undefined、null、Boolean、Number、String、Symbol (ES6新加) 
Object包括: Array 、Date 、RegExp 、Function 

两者的重要区别在于:基本类型赋值给变量,变量的标识符和变量的值都存放在内存中的栈(Stack)里。引用类型的变量的标识符在栈中,变量的值在内存的堆(Heap)中。
举一个通俗的例子:基本类型是你在内存的栈中拥有一个咖啡店和钥匙,引用类型是你只有咖啡店的钥匙,你可以去内存的堆中找到对应的咖啡店地址,钥匙环上有一个标签上面写了,这个钥匙是对应的哪一家店,而这个标签就是指针。

图:数据类型

bVCunf

图:引用类型

bVCuGx

深浅拷贝问题

不知道什么是深拷贝和浅拷贝的请先去Google并在Chrome调试台自己操作一下,这篇文章只会说明为何JS中会有这种问题。

我举个栗子图片描述

出现这种结果的原因是第二步将a赋给b只是将a的地址给了b(请注意,数组是引用类型),此时改变b其实就是改变了堆中a和b共同指向的地址的值。通俗一点讲:a和b两个人都拿到了一个同一家咖啡店的钥匙,这时候在咖啡店多放一个杯子,自然两人共同的咖啡店都有这个杯子。所以有的时候我们为了避免浅拷贝,会用一些方式实现深拷贝。

关于ES6里的const,有些后台人员甚至前端人员误以为const赋值是常量,其实

const并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址)

(此段引用自阮一峰)

const只是把钥匙上的标签(指针)固定,所以:
图片描述

小白第一次写技术文章,如果有错误还请多多指教,多谢!

参考资料

[深入了解JS引用类型基本类型][5]
[阮一峰ES6教程][6]


qdchenyixuan
22 声望0 粉丝