var可以重复声明同一个变量,let和const不能,const声明的变量不能直接修改值,但是const声明的对象和数组,是可以修改值,但不能修改引用地址
var没有块级作用域的概念,如果想要保护变量的话可以使用闭包(尽量不要滥用闭包,增大内存消耗,造成内存泄漏,解决方法是使用变量后赋值为null)
let和const有块级作用域的概念
var在创建之前就可以调用,在创建阶段就有变量提升,同时var在初始化阶段也有变量提升
对于let来说,它在创建阶段提升了,但是在初始化阶段并没有提升
const定义的是一个只读的变量,而且定义的数据不可被修改,一旦被声明的变量会立即初始化。
const只有创建和初始化阶段,没有赋值阶段。
let和const都存在一个暂时性死区(暂时性死区:创建了变量但是没有初始化,没法使用变量)
const实际上保证的不是变量值不得改动,而是变量指向的内存地址所保存的数据不得改动
对于简单数据类型(string || number)它的值就保存在变量指向的内存地址,地址所保存的数据不能被改变
引用数据类型指向的内存地址只是一个指针,通过指针来指向实际数据,不可改变的是指针,而不是数据,所以const定义的引用数据类型常量可以通过属性来修改值,牵扯出了栈内存和堆内存