ECMAScript是一种由[Ecma国际]前身为[欧洲计算机制造商协会]通过ECMA-262标准化的脚本[程序设计语言]。这种语言在[万维网]上应用广泛,它往往被称为JavaScript或JScript,所以它可以理解为是javascript的一个标准,但实际上后两者是ECMA-262标准的实现和扩展。
语法提案的标准流程
Stage 0 - Strawman(展示阶段)
Stage 1 - Proposal(征求意见阶段)
Stage 2 - Draft(草案阶段)
Stage 3 - Candidate(候选人阶段)
Stage 4 - Finished(定案阶段)
let命令
1)基本用法
let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
for循环的计数器,就很合适使用let命令。
2)不存在变量提升(与var不同)
3)暂时性死区
只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
4)不允许重复声明
let不允许在相同作用域内,重复声明同一个变量。(与var不同,var可以重复声明)块级作用域
const 命令
跟let使用差不多,都在代码块内使用有效;不存在变量提升;暂时性死区;声明之后才能使用;不能重复声明。
(const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。)ES6 声明变量的六种方法
ES5 只有两种声明变量的方法:var命令和function命令。ES6 除了添加let和const命令,后面章节还会提到,另外两种声明变量的方法:import命令和class命令。所以,ES6 一共有 6 种声明变量的方法。let命令、const命令、class命令声明的全局变量不属于顶层对象(window)的属性,全局变量将逐步与顶层对象的属性脱钩。
(ES5中,全局对象与顶层对象window等价)解构赋值(如果解构不成功,变量的值就是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]; // 正确
赋值语句,而不是声明语句
- 字符串扩展
使用` 反引号,
它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。
// 普通字符串
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()