变量声明

声明变量

let

赋值

变量赋值

ago
1
2
3
let a = 1;
let b = 2;
let c = 3;
now

1-从数组中提取值,按照对应位置,对变量赋值

1
2
3
let [a, b, c] = [1, 2, 3];
console.log(a); //1
console.log(b); //2

2-“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值,解构不成功,变量的值就等于undefined

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
let [foo, [[bar], baz]] = [1, [[2], 3 ]];
foo // 1
bar // 2
baz // 3
--------------------------------------------------
let [x, , y] = [1, 2, 3];
x // 1
y // 3
--------------------------------------------------
let [, , third] = ["foo", "bar", "baz"];
third // "baz"
--------------------------------------------------
let [head, ...tail] = [1, 2, 3, 4];
head // 1
tail // [2, 3, 4]
--------------------------------------------------
let [x, y, ...z] = ['a'];
x // "a"
y // undefined
z // []

3-等号左边的模式,只匹配一部分的等号右边的数组。这种情况下,解构依然可以成功。

1
2
3
4
5
6
7
8
let [x, y] = [1, 2, 3];
x // 1
y // 2
--------------------------------------------------
let [a, [b], d] = [1, [2, 3], 4];
a // 1
b // 2
d // 4

对象赋值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var {foo: baz} = {foo: 'aaa',bar: 'bbb'};
baz // "aaa"
--------------------------------------------------
let obj = {
first: 'hello',
last: 'world'
};
--------------------------------------------------
let {
first: f,
last: l
} = obj;
f // 'hello'
l // 'world'

作用域

申明变量 所声明的变量,只在let命令所在的代码块内有效。

1-局部声明

1
2
3
4
5
6
{
let a = 10;
var b = 20;
}
console.log(b); //20
console.log(a) // 报错

2-不存在变量提升

1
2
3
4
console.log(b);
var b = 10; //undefined
console.log(a);
let a = 10; //报错

3-暂时性死区

ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var tmp = 123;
if (true) {
tmp = 'abc'; // 报错
let tmp;
}
--------------------------------------------------
if (true) {
// TDZ开始
tmp = 'abc';
console.log(tmp); // 报错
let tmp; // TDZ结束
console.log(tmp); // undefined
tmp = 123;
console.log(tmp); // 123
}

4-不允许重复声明

let不允许在相同作用域内,重复声明同一个变量。

1
2
3
4
5
6
7
8
9
10
11
12
function fn() {
let a = 10;
var a = 1;
}
fn();
--------------------------------------------------
// 报错
function fn1() {
let a = 10;
let a = 1;
}
fn1();

5-不能在函数内部重新声明参数

1
2
3
4
5
6
7
8
9
function func(arg) {
let arg; // 报错
}
--------------------------------------------------
function func(arg) {
{
let arg; // 不报错
}
}

const

块级作用域,也不会自动提升全局对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const num = 3; //同一个块中不允许声明同名变量
--------------------------------------------------
const num = 1;
if(true){
const num = 2;
console.log(num); //2
}
console.log(num);//1
const num; //必须一次性完成初始化 = 声明 + 赋值
num = 1;
--------------------------------------------------
const PI = 3.14; //常量大写,单词间以_分割
console.log('足球的PI:',PI);
//篮球的开发
//PI = 3.1415926; //不允许二次赋值
console.log('篮球的PI',PI);