2018-06-05 ES6简介(!!!)

ECMAScript是一种由[Ecma国际]前身为[欧洲计算机制造商协会]通过ECMA-262标准化的脚本[程序设计语言]。这种语言在[万维网]上应用广泛,它往往被称为JavaScriptJScript,所以它可以理解为是javascript的一个标准,但实际上后两者是ECMA-262标准的实现和扩展。
语法提案的标准流程
Stage 0 - Strawman(展示阶段)
Stage 1 - Proposal(征求意见阶段)
Stage 2 - Draft(草案阶段)
Stage 3 - Candidate(候选人阶段)
Stage 4 - Finished(定案阶段)

  1. let命令
    1)基本用法
    let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
    for循环的计数器,就很合适使用let命令。
    2)不存在变量提升(与var不同)
    3)暂时性死区
    只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
    4)不允许重复声明
    let不允许在相同作用域内,重复声明同一个变量。(与var不同,var可以重复声明)

  2. 块级作用域

  3. const 命令
    跟let使用差不多,都在代码块内使用有效;不存在变量提升;暂时性死区;声明之后才能使用;不能重复声明。
    (const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。)

  4. ES6 声明变量的六种方法
    ES5 只有两种声明变量的方法:var命令和function命令。ES6 除了添加let和const命令,后面章节还会提到,另外两种声明变量的方法:import命令和class命令。所以,ES6 一共有 6 种声明变量的方法。

  5. let命令、const命令、class命令声明的全局变量不属于顶层对象(window)的属性,全局变量将逐步与顶层对象的属性脱钩。
    (ES5中,全局对象与顶层对象window等价)

  6. 解构赋值(如果解构不成功,变量的值就是undefined)
    1)数组
    let [a, b, c] = [1, 2, 3];
    上面代码表示,可以从数组中提取值,按照对应位置,对变量赋值。

对于 Set 结构,也可以使用数组的解构赋值。
let [x, y, z] = new Set(['a', 'b', 'c']);
x // "a"

2)**对象 **
let { foo, bar } = { foo: "aaa", bar: "bbb" };
foo // "aaa"
bar // "bbb"

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'

-------------------------默认值生效的条件是,对象的属性值严格等于undefined----------------------------

-------------------------如果要将一个已经声明的变量用于解构赋值,必须非常小心-----------------------
let x;
{x} = {x: 1};
// SyntaxError: syntax error
上面代码的写法会报错,因为 JavaScript 引擎会将{x}理解成一个代码块,从而发生语法错误。只有不将大括号写在行首,避免 JavaScript 将其解释为代码块,才能解决这个问题。

// 正确的写法
let x;
({x} = {x: 1});

3)字符串的解构赋值
const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"

类似数组的对象都有一个length属性,因此还可以对这个属性解构赋值。
let {length : len} = 'hello';
len // 5

4)数值和布尔值的解构赋值
解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。

let {toString: s} = 123;
s === Number.prototype.toString // true

let {toString: s} = true;
s === Boolean.prototype.toString // true

5)函数参数的解构赋值

6)圆括号问题
解构赋值虽然很方便,但是解析起来并不容易。对于编译器来说,一个式子到底是模式,还是表达式,没有办法从一开始就知道,必须解析到(或解析不到)等号才能知道。

由此带来的问题是,如果模式中出现圆括号怎么处理。ES6 的规则是,只要有可能导致解构的歧义,就不得使用圆括号。

但是,这条规则实际上不那么容易辨别,处理起来相当麻烦。因此,建议只要有可能,就不要在模式中放置圆括号。

不能使用圆括号的情况:
(1)变量声明语句
// 全部报错
let [(a)] = [1];
(2)函数参数
函数参数也属于变量声明,因此不能带有圆括号。
// 报错
function f([(z)]) { return z; }
(3)赋值语句的模式
// 全部报错
({ p: a }) = { p: 42 };
([a]) = [5];
上面代码将整个模式放在圆括号之中,导致报错。

// 报错
[({ p: a }), { x: c }] = [{}, {}];
上面代码将一部分模式放在圆括号之中,导致报错。
可以使用圆括号的情况:
可以使用圆括号的情况只有一种:赋值语句的非模式部分,可以使用圆括号。

[(b)] = [3]; // 正确
({ p: (d) } = {}); // 正确
[(parseInt.prop)] = [3]; // 正确
赋值语句,而不是声明语句
  1. 字符串扩展
    使用` 反引号,
    它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。

// 普通字符串
In JavaScript '\n' is a line-feed.

// 多行字符串
In JavaScript this is not legal.

console.log(string text line 1 string text line 2);

// 字符串中嵌入变量 {name}, how are you {}中可以是:变量,任意js表达式,可以进行运算,可以引用对象属性

如果在模板字符串中使用反引号,需要使用转义字符`

模板中的空格和换行都是被保留的,如果不需要空格和换行,就用 `.trim()

你可能感兴趣的:(2018-06-05 ES6简介(!!!))