let关键字
let关键字是ES6中新增的用于声明变量的关键字
let声明的变量只在所处于的块级作用域有效
let声明的变量在对应的块级作用域之外不能使用,若对应块级作用域外使用会报错
if ( true ) { let a = 10 } console.log(a)
D:\桌面文件\文件\nodejs\let和const\let.js:4 console.log(a); ^ ReferenceError: a is not defined
使用let关键字声明的变量才有块级作用域,而使用var声明的变量不具有块级作用域
var关键字会使变量提升为全局变量
if ( true ) { var a = 10 } console.log(a)
PS D:\桌面文件\文件\nodejs\let和const> node .\let.js 10 PS D:\桌面文件\文件\nodejs\let和const>
使用let关键字可以防止循环变量变成全局变量
var关键字会使变量提升为全局变量
for ( var i=0; i<3; i++ ) {} console.log(i) console.log('---------------') for ( let j=0; j<3; j++ ) {} console.log(j)
PS D:\桌面文件\文件\nodejs\let和const> node .\let.js 3 --------------- D:\桌面文件\文件\nodejs\let和const\let.js:5 console.log(j) ^ ReferenceError: j is not defined
使用let关键字不存在变量提升
var关键字会是变量提升,可以先使用后定义
console.log(a) var a = 10 console.log('---------------------------') console.log(b) let b = 20
undefined --------------------------- D:\桌面文件\文件\nodejs\let和const\let.js:4 console.log(b) ^ ReferenceError: Cannot access 'b' before initialization
使用let声明变量具有暂时性死区特性
即使用let在块级作用域中声明变量,即使在作用域外有同名变量,只有在块级作用域中声明了同名变量,该变量就与该作用域绑定,使用变量时只会使用作用域内的变量
即在作用域内声明了同名变量,该变量与外界无关
var a = 10 if ( true ) { console.log(a) let a = 20; }
console.log(a) ^ ReferenceError: Cannot access 'a' before initialization
有关于let的面试题
var arr = [] for ( var i=0; i<2; i++ ) { arr[i] = function() { console.log(i) } } arr[0]() arr[1]()
PS D:\桌面文件\文件\nodejs\let和const> node .\let.js 2 2 PS D:\桌面文件\文件\nodejs\let和const>
由于变量 i 用var声明,所以变量 i 为全局变量,经过循环过后 i 的值为2,每次循环都给数组的一个元素赋值为函数,所以最后调用访问的都是同一个变量 i
let arr = [] for ( let i=0; i<2; i++ ) { arr[i] = function() { console.log(i) } } arr[0]() arr[1]()
PS D:\桌面文件\文件\nodejs\let和const> node .\let.js 0 1 PS D:\桌面文件\文件\nodejs\let和const>
由于使用let声明变量,所以每个变量都与自己对应的作用域相对应
每次循环都会产生一个块级级作用域
i=0 – a[0]
i=1 – a[1]
const关键字
作用:声明常量
常量:值(内存地址)不能改变的量
const声明的常量具有块级作用域
if( true ) { const a = 10; } console.log( a );
console.log( a ); ^ ReferenceError: a is not defined
声明常量时必须赋值
const p;
const p; ^ SyntaxError: Missing initializer in const declaration
const常量赋值后,不能修改值
const p = 10; p = 1;
p = 1; ^ TypeError: Assignment to constant variable.
对于对象或数组,只要指向不改变,对象或数组里面的成员或属性可以改变值
const arr = [100, 200] arr[0] = 1 arr[1] = 2 console.log(arr) arr = [1111]
[ 1, 2 ] D:\桌面文件\文件\nodejs\let和const\let.js:5 arr = [1111] ^ TypeError: Assignment to constant variable.
const obj = { name: 'zs', age: 12 } obj.name = 'ls' console.log(obj) obj = {}
{ name: 'ls', age: 12 } D:\桌面文件\文件\nodejs\let和const\let.js:7 obj = {} ^ TypeError: Assignment to constant variable.
let、const、var的区别
var | let | const |
函数级作用域 | 块级作用域 | 块级作用域 |
变量提升 | 不存在变量提升 | 不存在变量提升 |
值可以改变 | 值可以改变 | 值不可以改变 |