var、let、const

88 阅读2分钟

var、let 和 const 区别的实现原理是什么

github.com/Advanced-Fr…

const定义的基本数据类型的变量不能修改,引用类型可以修改(const仅保证指针不发生改变,修改对象的属性不会改变对象的指针,所以是被允许修改的)。

CONST 声明的值的不可改变性说明

const声明的值:

如果是基本类型(string,number,boolean,null,undefined),不可修改声明的基本类型的值。

如果是引用类型(Function,Array,Object ),不可修改引用类型的指针(地址),但是具体的值是可以修改的。

本质:

const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。

对于基本类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。

对于引用类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了

var存在的问题

  1. var有作用域问题(会污染全局作用域)
  2. var可以重复声明
  3. var会变量提升预解释
  4. var不能定义常量

let、const特性

  1. let、const不可以重复声明
  2. let、const不会声明到全局作用域上
  3. let、const不会预解释变量
  4. const做常量声明(一般常量名用大写)

在ES5中,全局变量直接挂载到全局对象的属性上,所以能在window上看到var声明的变量

在ES6中,全局对象的属性和全局变量脱钩,但是为了保持兼容性,旧的不变,所以var、function声明全局变量依然可以在window对象上看到,而let、const声明的全局变量在window对象上看不到。

zhuanlan.zhihu.com/p/426037550

image.png