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) //[ '第一个元素', '第二个元素' ]