var,let,const的区别

  • A+
所属分类:Web前端
摘要

ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量 ,就会报错。


var,let,const的区别

一、var声明的变量会挂载在window上,而let和const声明的变量不会

二、var声明变量存在变量提升,let和const不存在变量提升

console.log(a); // undefined  ===>  a已声明还没赋值,默认得到undefined值
var a = 100;

console.log(b); // 报错:b is not defined  ===> 找不到b这个变量
let b = 10;

console.log(c); // 报错:c is not defined  ===> 找不到c这个变量
const c = 10;

三、let和const声明形成块作用域

var,let,const的区别
if(1){
var a = 100;
let b = 10;
}

console.log(a); // 100
console.log(b) // 报错:b is not defined ===> 找不到b这个变量
var,let,const的区别

var,let,const的区别
if(1){
var a = 100; const c = 1; }
console.log(a); // 100 console.log(c) // 报错:c is not defined ===> 找不到c这个变量
var,let,const的区别

四、同一作用域下let和const不能声明同名变量,而var可以

五、暂存死区

ES6 明确规定,如果区块中存在letconst命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”。(简称TDZ)

var,let,const的区别

var a = 100;

if(1){
a = 10;
//在当前块作用域中存在a使用let/const声明的情况下,声明前给a赋值,所以控制台Error:a is not defined
let a = 1;
}
var,let,const的区别

六、const

  一般用来定义常量,当变量是复合型数据(对象,数组),变量指向数据的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。(重点)

var,let,const的区别

/*
*   1、一旦声明必须赋值初始化,不能使用null占位。
*
*   2、声明后不能再修改
*
*   3、如果声明的是复合类型数据,可以修改其属性
*/

const obj = {a:100};
obj.name = 'apple';
obj.a = 10000;
console.log(obj);  // {a:10000,name:'apple'}