let
- 声明一个块级本地变量,可同时将其初始化为一个值。
特点:
- 具有块级作用域
- 必须是定义之后才能使用
- “不存在声明提升”
- 不允许重复定义
- 具有暂时性死区(TDZ)
1. 定义的变量只能在定义所在的代码块中使用
(for循环稍微特殊)let i=10;{let b = 2;console.log(b);console.log(i);}console.log(b);//forlet i=10;//外层作用域仍可定义同名的变量for(let i=1;i<10;i++){console.log(i);//块级作用域}console.log(i);//10
2. 必须是在定义之后才能使用,否则报错
console.log(i);let i =1;// 创建 定义(初始化) 赋值
3. “不存在声明提升”
实际上let定义的变量会在JavaScript预编译阶段将变量的创建过程提升了的,只不过初始化过程没有像var一样提前,就导致了在定义之前访问let定义的变量会报错:不能在初始化之前访问变量。let变量的初始化过程和赋值过程是赋值语句执行时完成的。var i;console.log(i);//undefinedi =1;console.log(a);console.log(i);let i =1;//定义(初始)
4. 不允许重复定义(同一作用域下)
let i =1;console.log(i);//不会输出,直接报错,重复定义i = 2;console.log(i);
页面上没哟任何输出而是直接报重复定义的错误,说明是有声明提升的
5. 暂时性死区(TDZ)
指的是在let赋值之前的区域是无法使用该变量,包括全局的同名变量,不能使用该变量的那部分区域就称tdz
let i =2;{/*TDZconsole.log(i);*/let i =1;}
const
概念:const是ES6新增用于定义变量的关键字。效果类似于let。具有和let大多数一样的特点,有细节的区别
特点:
针对基本类型的数据,是完全不可修改。
如果是引用类型的数据,比如对象,数组等。只要操作的是赋值时的对象或数组,那么时可以对对象或数组进行处理。比如属性的添加或修改,或数组中数据的 添加或删除。但是不能将新的对象或数组赋给变量
// const i = undefined;// i = 2;//报错// console.log(i);const obj = {};obj.name = '张三';//对象中添加属性console.log(obj);//不会报错// obj = {};//报错const arr = [];arr.push(1,2,3);console.log(arr);//不会报错// arr = arr.filter();//报错arr =[];//报错
var、let和const的区别和联系
联系:都是用于定义变量。
- var是用于全局作用域或函数作用域,而let和const是块级作用域。
- var存在声明提升,而let和const”不存在声明提升”。var的声明提升包括了(创建和初始化),而let和const的声明提升只包含了创建过程。而初始化和赋值过程都是在定义语句执行。
- let和const具有不可重复定义、不能在定义之前使用、存在TDZ,而var没有上述特点。
- let和var变量的数据可以被修改。而const定义的变量”不可修改”
