var、let 和 const 区别的实现原理是什么
const定义的基本数据类型的变量不能修改,引用类型可以修改(const仅保证指针不发生改变,修改对象的属性不会改变对象的指针,所以是被允许修改的)。
CONST 声明的值的不可改变性说明
const声明的值:
如果是基本类型(string,number,boolean,null,undefined),不可修改声明的基本类型的值。
如果是引用类型(Function,Array,Object ),不可修改引用类型的指针(地址),但是具体的值是可以修改的。
本质:
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。
对于基本类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。
对于引用类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了
var存在的问题
- var有作用域问题(会污染全局作用域)
- var可以重复声明
- var会变量提升预解释
- var不能定义常量
let、const特性
- let、const不可以重复声明
- let、const不会声明到全局作用域上
- let、const不会预解释变量
- const做常量声明(一般常量名用大写)
在ES5中,全局变量直接挂载到全局对象的属性上,所以能在window上看到var声明的变量
在ES6中,全局对象的属性和全局变量脱钩,但是为了保持兼容性,旧的不变,所以var、function声明全局变量依然可以在window对象上看到,而let、const声明的全局变量在window对象上看不到。
zhuanlan.zhihu.com/p/426037550