es6第二, 三章个人学习
1:let命令
let的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效,而var定义的变量对全局有效。
{
let a = 10;
var b = 1;
}
a // ReferenceError: a is not defined.
b // 1
同样,在for循环中用let定义的变量只在for循环中有效,下列是相应例子
1:var在for循环中
var a = [ ];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
2:let在for循环中
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 6
let声明的变量仅在块级作用域内有效,最后输出的是 6。
注:for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。例如:
for (let i = 0; i < 3; i++) {
let i = 'abc';
console.log(i);
}
// abc
// abc
// abc
代码中,两个i在两个不同的作用域
注:let不能在相同作用域内申明同一个变量
2:块级作用域
let实际上为 JavaScript 新增了块级作用域。
3:const指令
const声明一个只读的常量。一旦声明,常量的值就不能改变。
const的作用域与let命令相同:只在声明所在的块级作用域内有效。
const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。例如:
if (true) {
console.log(MAX); // ReferenceError
const MAX = 5;
}
//报错ReferenceError
上面代码在常量MAX声明之前就调用,结果报错。
注:const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。
const a = [];
a.push('Hello'); // 可执行
a.length = 0; // 可执行
a = ['Dave']; // 报错
上述例子说明const定义的变量是可写的,但不可被另一数组赋值
ES6有六种声明变量的方法
var命令
function命令
let命令
const命令
import命令
class命令
globalThis 对象
ES2020 在语言标准的层面,引入globalThis
作为顶层对象。
任何环境下,globalThis都是存在的,都可以从它拿到顶层对象,指向全局环境下的this。
解构赋值
1:数组的解构赋值
在ES6中可以这样赋值
let [a, b, c] = [1, 2, 3];
下列语句都会报错
let [foo] = 1;
let [foo] = false;
let [foo] = NaN;
let [foo] = undefined;
let [foo] = null;
let [foo] = {};
注:解构赋值允许指定默认值。例:
let [foo = true] = [];
foo // true
let [x, y = 'b'] = ['a']; // x='a', y='b'
let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'
2:对对象的解构赋值
数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
如果变量名与属性名不一致,必须写成下面这样。
let { foo: baz } = { foo: 'aaa', bar: 'bbb' };
baz // "aaa"
let obj = { first: 'hello', last: 'world' };
let { first: f, last: l } = obj;
f // 'hello'
l // 'world'
3:对默认值的解构赋值
例:
var {x = 3} = {};
x // 3
var {x, y = 5} = {x: 1};
x // 1
y // 5
var {x: y = 3} = {};
y // 3
var {x: y = 3} = {x: 5};
y // 5
var { message: msg = 'Something went wrong' } = {};
msg // "Something went wrong"
注:将一个已经声明的变量用于解构赋值时,正确的写法是
let x;
({x} = {x: 1});
4:字符串的解构赋值
例:
const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"
对数组对象的length属性这个属性解构赋值。
let {length : len} = 'hello';
len // 5
5:对数值与摩尔值的解构赋值
let {toString: s} = 123;
s === Number.prototype.toString // true
let {toString: s} = true;
s === Boolean.prototype.toString // true
6:对函数参数的解构赋值
function add([x, y]){
return x + y;
}
add([1, 2]); // 3
注:可以使用圆括号的情况只有一种:赋值语句的非模式部分,可以使用圆括号。
[(b)] = [3]; // 正确
({ p: (d) } = {}); // 正确
[(parseInt.prop)] = [3]; // 正确
解构赋值可用于交换数据,定义函数参数等,例如对于交换数据:
let x = 1;
let y = 2;
[x, y] = [y, x];