2020-05-23

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];

你可能感兴趣的:(2020-05-23)