const声明常量和声明对象的区别
在学习var、let和const的区别中,遇到一个问题,原来const定义的常量不可以改变但是定义的对象可以改变,我就有了疑问这是为什么呢?
先从数据类型聊起来
ECMAScript有六种简单数据类型(也称原始数据类型)Undefined、Null、Boolean、Number、String和Symbol(符号)
复杂数据类型(引用类型)Object (function、array、map)
基本类型和引用类型得区别:
基本类型存放在栈中而引用类型存放在堆中
let num1 = 5
let num2 = num1
基本类型是每次声明都会在栈中开辟一个存储空间用来存储变量对象
var obj1 = new Object() var obj2 = obj1
引用类型定义对象实际上是定义了一个指向对象的指针,复制对象其实是将这个对象的地址复制给另一个对象,它们都指向同一个对象,当一个对象修改了object中的数据另一个对象指针指向的object也会被修改
基础知识补完了,现在来聊正事,为什么定义的常量不能改变,但是定义的对象却可以改变呢?
当常量赋值时改变的是栈中的数据,但是const不允许改变
const test = "23" test="测试"// Assignment to constant variable
本质:const实际上保证的不是变量的值不得改动而是变量指向的那个地址保存的数据不得改动。对于简单的数据类型(数值、字符串、布尔值),值就保存在变量所指向的那个内存地址,因此等于常量。但是对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是固定的那就不能控制了。摘自:阮一峰《ECMAScript入门》
const test={ a:10, b:20 } test.a=30 //{a: 30, b: 20} // test = {} // Assignment to constant variable