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月前
|
JavaScript
ES6之变量的解构赋值
ES6之变量的解构赋值
|
2月前
|
JavaScript 网络架构
ES6-----6种变量
ES6-----6种变量
39 7
|
2月前
|
安全 Go C语言
Go常量的定义和使用const,const特性“隐式重复前一个表达式”,以及iota枚举常量的使用
这篇文章介绍了Go语言中使用`const`定义常量的方法,包括常量的特性“隐式重复前一个表达式”,以及如何使用`iota`实现枚举常量的功能。
|
5月前
|
存储 安全 编译器
【C++】:函数重载,引用,内联函数,auto关键字,基于范围的for循环,nullptr关键字
【C++】:函数重载,引用,内联函数,auto关键字,基于范围的for循环,nullptr关键字
36 0
|
6月前
|
JavaScript 前端开发 开发者
js开发:请解释什么是ES6的let和const关键字,以及它们与var关键字的区别。
ES6引入`let`和`const`替代`var`声明变量。`let`有块级作用域,存在暂时性死区,不进行变量提升,可重新赋值。`const`用于常量,值不可变但引用类型内容可变,同样有块级作用域和暂时性死区。与`var`主要区别在于作用域、变量提升和可变性。这些改进提高了代码的可预测性和安全性。
58 2
|
6月前
|
算法 C语言 C++
【C/C++ 关键字 类型限定符 】 C/C++ 中 const的用法:限制变量的作用域和可见性
【C/C++ 关键字 类型限定符 】 C/C++ 中 const的用法:限制变量的作用域和可见性
46 0
|
11月前
ES6学习(二)—变量的解构赋值
ES6学习(二)—变量的解构赋值
ES6语法: 解构赋值
ES6语法: 解构赋值
49 0
|
JSON JavaScript 前端开发
ES6(变量的解构赋值)
ES6(变量的解构赋值)
68 0
ES6-变量的解构赋值
前言 大家好,今天和大家分享一下ES6中变量的解构赋值。 一、解构赋值是什么? ES6允许按照一定模式从数组和对象中提取值,对变量进行赋值,这被称为解构赋值