let var const
var是ES6之前的写法,var存在变量提升,无块级作用域,可重复声明同一变量,声明的变量均可改,函数作用域.
var的变量提升允许先console后声明变量,此时输出为undefined,这种写法在项目中会使人觉得反直觉,所以尽量别用var,ES6提供了let来声明变量.
let没有变量提升,有块级作用域,不可重复声明同一变量,声明的变量均可改.
如果没有用let声明变量,那么直接输出是报错的,显示此变量未定义,而且不可以重复声明变量,会报错显示变量已定义.
const没有变量提升,有块级作用域,不可重复声明同一变量,const声明一个基本数据类型变量,声明之后不允许改变.
一旦声明必须初始化,不可只声明变量而不赋值,否则会报错,但如果声明一个引用数据类型比如一个对象,是可以修改他的属性的,const 其实保证的不是变量的值不变,而是保证变量指向的内存地址所保存的数据不允许改动,此处体现的是类似于C语言中的指针,一种引用变量和内存之间的引用关系,const只要不破坏这个引用关系,也可以修改引用类型的具体内容.
开发中使用时的问题
作用一:在for循环中使用var和let是有区别的,var创建的是同一个变量,因为他没有块级作用域,但let创建的是不同变量.
作用二:不会污染全局变量
let RegExp = 10;
console.log(RegExp);
console.log(window.RegExp);
这样不会报错,let定义的变量不会影响window上挂载的全局变量.
作用三:更常用const
在开发中默认下使用const,而只有在开发者知道这个变量未来会被修改时,才使用let,我愿称之为变量不变原则.