1.var
var 命令定义变量会发生‘变量提升’的现象。即变量可以在声明之前使用,值为undefined
。
为了纠正这种现象,在es6中新增了 let和const(块级作用域)。
2.let
let相当于之前的var
使用let定义变量需要注意:
1.let声明的变量只能在let命令所在的代码块内有效(块级作用域)
{
let a = 12
var b = 5
}
console.log(a) // 报错
console.log(b) // 5
for循环
计数器中,就很适合使用let
声明变量
for (let i = 0; i < 10; i++) {
// ...
}
console.log(i);
// 报错: i is not defined
下面的代码如果使用var
,最后输出的是10
。
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
如果使用let
,声明的变量仅在块级作用域内有效,最后输出的是 6
。
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 6
2.没有预解析,不存在变量提升。在代码块内,只要let定义变量,在之前使用都会报错。(先定义变量在使用)
let a = 12
function let1 (){
console.log(a) // 此区域称作 暂时性死区
let a = 5
}
//代码执行会报错
3.不能重复定义变量
let a = 12
let a = 5
console.log(a)
//代码执行会报错
4.for循环中小括号内是一个作用域(父级作用域),花括号内又是一个作用域
for (let i = 0; i < 3; i++) {
let i = 'q';
console.log(i);
}
// a
// a
// a
打印了3次 a ,说明定义的两个 i 不是同一个变量
3.const
const特性和let一样
1.const 定义完变量必须有值,不能后赋值
const a ;
a = 12;
console.log(a) // 报错
2.const定义的变量不能修改
const a = 12;
a = 5;
console.log(a) // 报错
还要一种针对数组的特殊情况(这种情况下是可以修改数组的内容的)
const arr = ['a','b']
arr.push('c')
console.log(arr) // ['a','b','c']
针对这种情况,es6新增了 Object.freeze
(冻结的意思)
const arr = Object.freeze(['a','b'])
arr.push('c')
console.log(arr) // 报错
建议:以后定义变量就用let,不要在使用var,
const http = require(‘http’) 类似于这种情况可以使用const