let 命令?
Es6 里面新添加了一个 let 命令,是用来声明变量的,类似于 var,但是与 var 不同的是 let 声明的变量只在 let 命令所在的代码块内有效。
let 特点?
let 命令声明的变量主要有三大特点:
1,不存在变量提升**
2,暂时性死区**
3,不允许重复声明**
不存在变量提升
不存在变量提升就是说一个变量如果是由 let 命令声明的话,必须要 先声明,后调用 不可以先调用,后声明
//var---》 存在变量提升
console.log(value1); // 输出 undefined
var value1 = 2;
//let---》 不存在变量提升
console.log(value2); // 报错 ReferenceErro
let value2 = 2;
暂时性死区
只要块级作用域中 let 声明了变量,那么这个变量就 绑定 了这个块级作用域,与外界无关,不受外界影响。
var value = 2;
{
cosole.log(value); // 报错 ReferenceError
let value = 1;
}
总结来说,在一个作用域中,如果你在 let 声明之前,就调用了 let 声明的这个变量,那么就会报错,也就是 ‘暂时性死区’
不允许重复声明
let 命令不允许在同一个作用域中重复声明一个变量。
// 报错 SyntaxError
{
let value1 = 2;
var value1 = 2;
}
// 报错
{
let value2 = 2;
let value2 = 2;
}
// 报错
function value3(a) {
let a = 2;
}
value3();
块级作用域
ES5 只有 函数作用域,全局作用域,没有 块级作用域,可能会出现一些问题:
1,内层变量覆盖外层变量
2,循环变量泄漏为全局变量
内层变量覆盖外层变量
var value = 2;
function fun() {
console.log(value);
if(false){
var value = 'value';
}
}
fun(); // undefined
上述代码中,原来的意图是 if 代码块内部使用 if 代码块内部的 value ,外部使用外部的 value ,但是,函数执行过后,输出的却是 undefined ,这时因为变量提升,导致 if 代码块外部的 value 被内部的 vlaue 覆盖了。如果 if 代码内部的 value 使用 let 声明则没有这个问题了。
循环变量泄漏为全局变量
for(var i = 0;i < 9;i++) {
// ...
}
console.log(i); // 8
上述变量中,变量 i 只用来控制循环,但是循环结束后,它并没有消失,泄漏为了全局变量。
const 命令?
const 声明一个只读的常量,一旦声明,常量的值就不能改变。
const X = 1;
X // 1
X = 2;
// TypeError: Assignment to constant variable.
const 特点
1,一旦声明,就必须赋值
2,一旦赋值,就不可以更改
3,和 let 一样,只在所在的块级作用域有效,同样有暂时性死区,不可重复声明
const 注意
const 实际上是存储了一个变量的内存地址,如果是一般的数据。例如 字符串,数字,布尔,值就保存在变量所指向的那个内存地址。因此等同于常量。
const STR = 'hello world!';
但是如果保存是对象,数组这样的数据,虽然内存地址是不会变的,但是却可以执行更改对象的属性,或者向数组中添加元素之类的操作。
const OBJ = {}
OBJ.name = 'Jack';
const ARR = [];
ARR.push('hello world');
虽然可以改变对象的属性和数组的值,但是却不可以把另一个对象或者数组赋值给当前的这个对象或者数组,否则会报错。因为这是把 变量 指向了另一个内存地址。
const OBJ = {};
OBJ = {};// 报错
const ARR = [];
ARR = [];// 报错
网友评论