ES6----let关键字与const关键字

简介: ES6----let关键字与const关键字

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
函数级作用域 块级作用域 块级作用域
变量提升 不存在变量提升 不存在变量提升
值可以改变 值可以改变 值不可以改变

相关文章
|
6天前
|
存储 安全 编译器
【C++】:函数重载,引用,内联函数,auto关键字,基于范围的for循环,nullptr关键字
【C++】:函数重载,引用,内联函数,auto关键字,基于范围的for循环,nullptr关键字
10 0
|
2月前
|
存储 编译器 Linux
【C++】C++入门第二课(函数重载 | 引用 | 内联函数 | auto关键字 | 指针空值nullptr)
【C++】C++入门第二课(函数重载 | 引用 | 内联函数 | auto关键字 | 指针空值nullptr)
|
2月前
|
JavaScript 前端开发 开发者
js开发:请解释什么是ES6的let和const关键字,以及它们与var关键字的区别。
ES6引入`let`和`const`替代`var`声明变量。`let`有块级作用域,存在暂时性死区,不进行变量提升,可重新赋值。`const`用于常量,值不可变但引用类型内容可变,同样有块级作用域和暂时性死区。与`var`主要区别在于作用域、变量提升和可变性。这些改进提高了代码的可预测性和安全性。
38 2
|
2月前
|
存储 缓存 安全
【C/C++ 关键字 存储类说明符】C/C++ 的mutable 关键字 忽略对该数据成员的常量性检查在const函数中修改变量值
【C/C++ 关键字 存储类说明符】C/C++ 的mutable 关键字 忽略对该数据成员的常量性检查在const函数中修改变量值
35 0
|
2月前
|
算法 C语言 C++
【C/C++ 关键字 类型限定符 】 C/C++ 中 const的用法:限制变量的作用域和可见性
【C/C++ 关键字 类型限定符 】 C/C++ 中 const的用法:限制变量的作用域和可见性
24 0
|
2月前
|
C#
C#学习相关系列之数据类型类----嵌套类和嵌套方法(三)
C#学习相关系列之数据类型类----嵌套类和嵌套方法(三)
|
7月前
|
存储 安全 编译器
【C++初阶】引用&内联函数&auto关键字&范围for循环&nullptr
从上篇文章我们开始分享C++的一些入门基础知识,讲到了关键字、命名空间等一些基础问题,今天我们继续分享一些基础知识,让大家更深入的入门C++。
|
9月前
|
存储 编译器 C语言
C++:类和对象(中)---默认成员函数---运算符重载---const的含义
C++:类和对象(中)---默认成员函数---运算符重载---const的含义
ES6 ------ let 和 const 关键字
ES6 ------ let 和 const 关键字