一篇文章彻底搞懂JS深浅拷贝和const

40次阅读

共计 835 个字符,预计需要花费 3 分钟才能阅读完成。

首先要了解的 js 基础
基本数据类型:undefined、null、Boolean、Number、String、Symbol (ES6 新加)
引用类型:Object、Array、Date、RegExp、Function
两者的重要区别在于:基本类型赋值给变量,变量的标识符和变量的值都存放在内存中的栈(Stack)里。引用类型的变量的标识符在栈中,变量的值在内存的堆(Heap)中。举一个通俗的例子:基本类型是你在内存的栈中拥有一个咖啡店和钥匙,引用类型是你只有咖啡店的钥匙,你可以去内存的堆中找到对应的咖啡店地址,钥匙环上有一个标签上面写了,这个钥匙是对应的哪一家店,而这个标签就是指针。
图:数据类型

图:引用类型

深浅拷贝问题
不知道什么是深拷贝和浅拷贝的请先去 Google 并在 Chrome 调试台自己操作一下,这篇文章只会说明为何 JS 中会有这种问题。
我举个栗子
出现这种结果的原因是第二步将 a 赋给 b 只是将 a 的地址给了 b(请注意,数组是引用类型),此时改变 b 其实就是改变了堆中 a 和 b 共同指向的地址的值。通俗一点讲:a 和 b 两个人都拿到了一个同一家咖啡店的钥匙,这时候在咖啡店多放一个杯子,自然两人共同的咖啡店都有这个杯子。所以有的时候我们为了避免浅拷贝,会用一些方式实现深拷贝。
关于 ES6 里的 const,有些后台人员甚至前端人员误以为 const 赋值是常量,其实
const 并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const 只能保证这个指针是固定的(即总是指向另一个固定的地址)
(此段引用自阮一峰)
const 只是把钥匙上的标签(指针)固定,所以:
小白第一次写技术文章,如果有错误还请多多指教,多谢!
参考资料
[深入了解 JS 引用类型基本类型][5]
[阮一峰 ES6 教程][6]

正文完
 0