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 命令对我一些困惑的解答,这篇文章里面也引用了很多里面的例子和语句。
上一篇: ES6中let和var的区别
下一篇: ajax实现区域-街道多级联动