let和const命令整理
一、let命令
基本用法
ES6 新增了let
命令,用来声明变量。它的用法类似于var
,但是所声明的变量,只在let
命令所在的代码块内有效。
for
循环的计数器,就很合适使用let
命令。
for
循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域
for (let i = 0; i < 3; i++) { let i = 'abc'; console.log(i); } //abc //abc //abc
上面代码正确运行,输出了 3 次abc。这表明函数内部的变量i与循环变量i不在同一个作用域,有各自单独的作用域.
不存在变量提升
// var 的情况 console.log(a); // 输出undefined var a = 2; // let 的情况 console.log(a); // 报错ReferenceError let a = 2;
暂时性死区
ES6 明确规定,如果区块中存在let
和const
命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
总之,在代码块内,使用let
命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
if (true) { // TDZ开始 tmp = 'abc'; // ReferenceError console.log(tmp); // ReferenceError let tmp; // TDZ结束 console.log(tmp); // undefined tmp = 123; console.log(tmp); // 123 }
错误实例:
//错误实例1 var a1 = '123'; if(true){ a1 = '456';//出现了let所以if内生成了一个单独的封闭作用域,而a1在还未let声明前使用会报错 let a1; };//错误实例2 let x1 = y1, y1 = 1; function fn(){ console.log(x1,y1);//y1在let未声明前使用报错 }; fn();
注意:“暂时性死区”也意味着typeof
不再是一个百分之百安全的操作。
a是一个不存在的变量名,结果返回“undefined”。
console.log(typeof a);//undefined
不允许重复声明
let a = 10; let a = 1;//报错
二、const命令
基本用法
const
声明一个只读的常量。一旦声明,常量的值就不能改变。相同: 与let 作用域 块级作用域
const PI = 3.1415; PI // 3.1415 PI = 3; // TypeError: Assignment to constant variable.
实例:
const a = true; //字符串 数值 布尔 //数组 const arr =[];//arr指向的是一个内存地址 arr.push('123'); console.log(arr); //对象 const obj = {}; obj.name = 'abc'; console.log(obj); //注意 不能只申明不赋值 申明后一定要初始化,不能以后赋值 const w; console.log(w); //错误