Node基础学习(五):ES6中的let和const关键字

Node基础学习系列
上一篇:Node基础学习(四):Node循环分支语法

在JavaScript中有几个关键字可以用来声明变量,我们最常用,也是JavaScript中最早出现用于声明变量的关键字是var,但是由于var关键字的缺陷,于是在ES6的语法中,新增了let和const这两个关键字,用于声明变量。

一、var

在了解let和const这两个关键字之前,我们需要先来了解一下var这个关键字。
var可以定义变量,如果使用var定义的变量在函数内,则为局部变量,如果是在函数外,则为全局变量。

var str = '声明全局变量';
console.log(str);

str = '改变全局变量';
console.log(str);

function func() {
    var i = 1;      //定义了一个局部变量i
    console.log(i);
}

console.log(i);     //如果没有下面被注释的那一行代码,该行代码爆错,因为没有在全局变量中定义i
var i = 1000;    //如果有该行代码,则上一行代码输出undefined

输出结果:

声明全局变量
改变全局变量
undefined

二、let

1、不存在变量提升

使用let定义的变量,不会发生变量提升。
什么是变量提升:

console.log(i);     //如果没有下面被注释的那一行代码,该行代码爆错,因为没有在全局变量中定义i
var i = 1000;    //如果有该行代码,则上一行代码输出undefined

在以上代码中,虽然变量i没有在输出之前定义,但是代码依然不会爆错,输出结果为undefined类型,这就是变量提升的效果。
而如果使用let来定义变量,则不会有变量提升存在,如果在变量定义前使用,则直接爆错。

console.log(i);     //输出undefined
var i = 1000;

console.log(a);     //爆错:ReferenceError: Cannot access 'a' before initialization
let a = '不存在变量提升';

2、暂时性死区

var temp = 0;
if(true) {
    console.log(temp);	//爆错:ReferenceError: Cannot access 'temp' before initialization
    let temp = 9;
}

在这里,我们虽然定义了一个名为temp的变量,但是在块级作用域中依然不能使用该变量,因为在块级作用域中使用let定义了该变量,导致该变量绑定在了这个块级作用域中,所以提前使用会爆错。

3、不允许重复声明

使用let定义的变量不允许重复声明,否则报错。

var i = 0;
var i = 100;
console.log(i); //100

let j = 1;
let j = 111;
console.log(j);     //SyntaxError: Identifier 'j' has already been declared

4、块级作用域

在ES6之前,只有全局作用域和函数作用域的概念,而ES6使用let关键字提出了块级作用域的概念,使用let定义的变量,只能在对应代码块中使用。

function func() {
    let n = 5;
    if (true) {
        let n = 10;
    }
    console.log(n); // 5
}
func();

三、const

ES6可以使用const关键字来定义常量,使用const定义的变量即为常量,需要在被定义的时候就赋予初始值,而且不能被第二次赋值。
不过这个所谓的常量不可变是指常量引用不可变,而内容依然是可以被改变的。

const s;        //SyntaxError: Missing initializer in const declaration
const str = [];
str = [1,2,3];      //TypeError: Assignment to constant variable.
const str = [];
str[0] = '第一个元素';
str[1] = '第二个元素';
console.log(str)        //[ '第一个元素', '第二个元素' ]

猜你喜欢

转载自blog.csdn.net/qq_45193304/article/details/106306965