欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ES6—let、const和var的区别

程序员文章站 2022-06-11 22:24:24
...

ES6—let、const和var的区别

ES6 新增了let命令,用来声明变量,新增了const命令,用来声明常量,它的用法类似于var

let a = 1;
var b = 2;
const PI = 3.14;

主要区别

块级作用域

//let声明的变量和const声明的常量有块级作用域,var声明的变量则只有函数作用域
{
	let a = 1;
	const PI = 3.14;
	var b = 2;
}
console.log(a);		//报错
console.log(PI);	//报错
console.log(b);		//2
function fun(){
	let a = 1;
	const PI = 3.14;
	var b = 2;
}
console.log(a);		//报错
console.log(PI);	//报错
console.log(b);		//报错

不存在变量提升

//let声明的变量和const声明的常量不存在变量提升,var声明的变量存在变量提升
console.log(a);	//报错
let a = 1;

console.log(PI);	//报错
const PI = 3.14;

console.log(b);	//undefined
var b = 2;

不能重复声明

//let和const不允许在相同作用域内,重复声明同一个变量,var则可以。
//报错
{
	let a = 1;
	let a = 2;
}
//报错
{
	let a = 1;
	var a = 2;
}
//报错
{
	let a = 1;
	const a = 2;
}
//报错
{
	var a = 1;
	const a = 2;
}

暂时性死区

//在代码块内,使用let命令声明变量(或者const声明常量)之前,该变量(常量)都是不可用的,这种情况称为“暂时性死区”(temporal dead zone,简称 TDZ)。
//let声明的变量和const命令声明的常量都存在暂时性死区,只能在声明的位置后面使用。
//报错
var a = 1;
{
	console.log(a);		
	let a = 1;
}
//报错
var PI = 3;
{
	console.log(PI);	
	const PI = 3.14;
}

其他区别

//在全局作用域下用var声明的常量会作为window对象的属性保存,let和const不会
let a = 1;
var b = 2;
const PI = 3.14;
console.log(window.a);		//undefined
console.log(window.b);		//2
console.log(window.PI);		//undefined
const声明的常量在声明的时候必须赋值,let和var可以只声明不赋值,此时变量的值为undefined
const PI;			//报错
let a;
var b;
console.log(a);		//undefined
console.log(b);		//undefined
//const声明的常量在声明后就不能被修改
const PI = 3.14;
PI = 3.1415;		//报错
//const如果声明的是复合类型数据,则可以修改其属性
const PERSON = {
	name : "XD"
};
PERSON.name = "JH";
console.log(PERSON.name);		//"JH"


//真的想将对象冻结,应该使用Object.freeze方法
const foo = Object.freeze({});
// 常规模式时,下面一行不起作用;
// 严格模式时,该行会报错
foo.prop = 123;


//除了将对象本身冻结,对象的属性如果也指向一个对象,那么这个对象也应该冻结。下面是一个将对象彻底冻结的函数。
var constantize = (obj) => {
	Object.freeze(obj);
	Object.keys(obj).forEach( (key, i) => {
		if(typeof obj[key] === 'object'){
			constantize( obj[key] );
    	}
    });
};

感谢

感谢阮一峰老师的ES6—let 和 const 命令对我一些困惑的解答,这篇文章里面也引用了很多里面的例子和语句。