let、var、const
共同点
三者都可以用来声明变量。
区别
首先来了解下变量,变量作用范围有全局作用域和方法作用域。
var与let
1.出现版本
ES6之前定义变量只有var;而ES6之后出现了 let,const。
2.作用域
var作用域只有全局和函数({})作用域,函数内声明整个函数都可以使用。
let和const存在块级作用域,类似于java代码块,使用{}包起来的块,例如 if,for的{}{代码块就是块级作用域。作用域仅在于{}这个范围。
3.全局变量和全局对象的属性
var声明的全局变量作为属性被挂到window对象,let和const声明的不会,即不会作为全局对象的属性。
var x = 100; console.log(window.x) //100 console.log(this.x) //100 let y = 100; console.log(window.y) //undefined console.log(this.y) //undefined
4.变量提升
var定义的变量存在变量提升,即在定义变量之前就可以使用,但为undefined。
let定义的变量不存在变量提升,即只能在let声明后,方可使用,否则报ReferenceError。ES6规定从花括号开始到let声明这个变量之前的这个范围,都是不可用的,语法上叫做,“暂时性死区”。
5.重复定义
var定义的变量可以声明多次,而let不可以。
console.log(typeof(x) + "---"); var x = 100 ; var x = 6; console.log(x) let y = 6; console.log(y + "---");
const
const作用域与let一致。
const定义的变量必须经过初始化,即赋值,而且一旦初始化就不可再变更。
const X = 100; X = 10 //Uncaught TypeError: Assignment to constant variable const y; //Uncaught SyntaxError: Missing initializer in const declaration
注意:如果是常量对象,则由于保存的是对象地址,因此对象内部属性可以改变。