// es5
var name = 'Checkson';
var str = 'Hello ' + name + '!';
// es6
const name = 'Checkson';
const str = `Hello ${Checkson}!`;
3.2 includes() 实例方法
返回布尔值,表示是否找到了参数字符串(接受第二参数,代表开始搜索下标)。
// es5
var str = 'This is just test!';
if (str.indexOf('is') > -1) {
// do something...
}
// es6
const str = 'This is just test!';
if (str.includes('is')) {
// do something...
}
// es5
function add () {
var args = [].slice.call(arguments);
var sum = 0;
args.forEach(function (val) {
sum += val;
});
return sum;
}
// es6
function add(...args) {
let sum = 0;
for (let val of args) {
sum += val;
}
return sum;
}
6.4 箭头函数
ES6 允许使用“箭头”(=>)定义函数。
// es5
var foo = function () {
return false;
}
// es6
const foo = () => false;
Object.keys返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。
(3)Object.getOwnPropertyNames(obj)
Object.getOwnPropertyNames返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名。
(4)Object.getOwnPropertySymbols(obj)
Object.getOwnPropertySymbols返回一个数组,包含对象自身的所有 Symbol 属性的键名。
(5)Reflect.ownKeys(obj)
Reflect.ownKeys返回一个数组,包含对象自身的所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。
8.4 扩展运算符
对象的扩展运算符(...)用于取出参数对象的所有可遍历属性,拷贝到当前对象之中。
var foo = { a: 1 };
var bar = { b: 2, c: 3 };
// es5
var baz = {};
for (var k in foo) baz[k] = foo[k];
for (var k in bar) baz[k] = bar[k];
// es6
var baz = {
...foo,
...bar
}
var x = Symbol();
var y = Symbol();
x === y // false
typeof x; // "Symbol"
9.1 可以为Symbol添加描述
const sym = Symbol('foo');
sym.description // foo
9.2 作为属性名的 Symbol
let mySymbol = Symbol();
// 第一种写法
let a = {};
a[mySymbol] = 'Hello!';
// 第二种写法
let a = {
[mySymbol]: 'Hello!'
};
// 第三种写法
let a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });
let set = new Set(['red', 'green', 'blue']);
for (let item of set.keys()) {
console.log(item);
}
// red
// green
// blue
for (let item of set.values()) {
console.log(item);
}
// red
// green
// blue
for (let item of set.entries()) {
console.log(item);
}
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]
let a = new Set([1, 2, 3]);
let b = new Set([2, 3, 4]);
// 并集
let union = new Set([...a, ...b]);
// Set {1, 2, 3}
// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
// Set {2, 3}
// 差集
let difference = new Set([...a].filter(x => !b.has(x)));
// Set {1}
1. let 和 const 命令
在ES6之前,JavaScript 声明变量只能用
var
这个关键字;而在ES6中,则引入了其他两个关键字let
和const
,那么,它们俩,到底与var
有哪些异同呢?请看下表:2. 变量的解构赋值
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。
let [a, b, c] = [1, 2, 3];
let { foo, bar } = { foo: 'aaa', bar: 'bbb' };
const [a, b, c, d, e] = 'hello';
let {toString: s} = 123;
let {toString: s} = true;
let add = ([x, y]) => x + y;
let sub = ({x, y}) => x - y;
3. 字符串扩展
3.1 模板字符串
模板字符串(template string)是增强版的字符串,用反引号(`)标识。
3.2 includes() 实例方法
返回布尔值,表示是否找到了参数字符串(接受第二参数,代表开始搜索下标)。
3.3 startsWith(), endsWith() 实例方法
两者都返回布尔值,前者表示参数字符串是否在原字符串的头部,后者表示参数字符串是否在原字符串的尾部(都接受第二参数,代表开始搜索下标)。
3.4 repeat() 实例方法
repeat方法返回一个新字符串,表示将原字符串重复n次,n为非负整数。
3.5 padStart(), padEnd() 实例方法
ES2017 新增了
padStart()
,padEnd()
实例方法用来分别为字符串首、尾补全指定的字符。3.6 trimStart(), trimEnd() 实例方法
ES2019 新增了
trimStart()
和trimEnd()
实例方法。它们的行为与trim()
一致,前者消除字符串头部的空格,后者消除尾部的空格。4. 正则的扩展
字符串对象共有 4 个方法,可以使用正则表达式:
match()
、replace()
、search()
和split()
。ES6 将这 4 个方法,在语言内部全部调用RegExp
的实例方法,从而做到所有与正则相关的方法,全都定义在RegExp
对象上。5. 数值的扩展
5.1 二进制和八进制表示法
ES6 提供了二进制和八进制数值的新的写法,分别用前缀
0b
(或0B
)和0o
(或0O
)表示。5.2 Number.isFinite(), Number.isNaN()
ES6在Number对象上,新提供了
Number.isFinite()
和Number.isNaN()
两个方法。前者检查传入值是否有限,后者检查传入值是否为NaN。它们与传统的全局方法
isFinite()
和isNaN()
的区别在于,传统方法先调用Number()
将非数值的值转为数值,再进行判断,而这两个新方法只对数值有效,Number.isFinite()
对于非数值一律返回false
,Number.isNaN()
只有对于NaN
才返回true
,非NaN
一律返回false
。5.3 Number.parseInt(), Number.parseFloat()
ES6 将全局方法parseInt()和parseFloat(),移植到Number对象上面,行为完全保持不变。这样做的目的,是逐步减少全局性方法,使得语言逐步模块化。
5.4 指数运算符
ES2016 新增了一个指数运算符(
**
)。6. 函数的扩展
6.1 函数参数的默认值
ES6 之前,不能直接为函数的参数指定默认值,只能采用变通的方法。
6.2 解构 + 函数参数默认值
6.3 rest 参数
ES6 引入 rest 参数(形式为
...
变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了。6.4 箭头函数
ES6 允许使用“箭头”(
=>
)定义函数。注意: 对于箭头函数,函数体内的
this
对象,就是定义时所在的对象,而不是使用时所在的对象;不可以当作构造函数(不能被new
);不可以使用arguments
对象;不可以使用yield
命令。6.5 尾递归
函数调用自身,称为递归。如果尾调用自身,就称为尾递归。
7. 数组的扩展
7.1 Array.from()
Array.from
方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)。7.2 Array.of()
Array.of
方法用于将一组值,转换为数组。7.3 find() 实例方法
数组实例的find方法,用于找出第一个符合条件的数组成员。若果找到符合条件的成员,则返回第一个满足条件的成员;如果找不到满足条件的成员,返回
undefined
。7.4 findIndex() 实例方法
findIndex
方法与indexOf
方法作用类似,但是findIndex
能识别数组是否存在NaN
。7.5 fill() 实例方法
fill方法使用给定值,填充一个数组。
7.6 includes() 实例方法
ES2016引入
Array.prototype.includes
方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes
方法类似。7.7 flat 实例方法
数组的成员有时还是数组,
Array.prototype.flat()
用于将嵌套的数组“拉平”,变成一维的数组。该方法返回一个新数组,对原数据没有影响。8. 对象的扩展
8.1 属性的简洁表示法
ES6 允许直接写入变量和函数,作为对象的属性和方法。
8.2 属性名表达式
ES6 允许字面量定义对象时,表达式作为对象的属性名,即把表达式放在方括号内。
8.3 属性遍历方法
ES6 一共有 5 种方法可以遍历对象的属性。
(1)for...in
for...in
循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。(2)Object.keys(obj)
Object.keys
返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。(3)Object.getOwnPropertyNames(obj)
Object.getOwnPropertyNames
返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名。(4)Object.getOwnPropertySymbols(obj)
Object.getOwnPropertySymbols
返回一个数组,包含对象自身的所有 Symbol 属性的键名。(5)Reflect.ownKeys(obj)
Reflect.ownKeys
返回一个数组,包含对象自身的所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。8.4 扩展运算符
对象的扩展运算符(
...
)用于取出参数对象的所有可遍历属性,拷贝到当前对象之中。8.5 Object.is()
Object.is()
方法用来判断两值是否一样。8.6 Object.assign()
Object.assign
方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。8.7 Object.values()
Object.values
方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值。8.8 Object. entries()
Object.entries()
方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值对数组。9. Symbol
ES6 引入了一种新的原始数据类型
Symbol
,表示独一无二的值,可以保证不会与其他属性名产生冲突。9.1 可以为Symbol添加描述
9.2 作为属性名的 Symbol
9.3 Symbol.for
该方法可以重用同一个 Symbol 值。
9.4 Symbol.keyFor
该方法返回一个已登记的 Symbol 类型值的
key
。10. Set 和 Map 数据解构
10.1 Set 定义
ES6 提供了新的数据结构 Set (集合)。它类似于数组,但是成员的值都是唯一的,没有重复的值。
Set
本身是一个构造函数,它可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化。下面罗列几种常见的创建形式:10.2 Set 实例的属性和方法
Set.prototype.constructor
: 构造函数,默认是就是Set
函数。Set.prototype.size
: 返回Set
实例的成员总数。add(value)
:添加某个值,返回Set
结构本身。delete(value)
: 删除某个值,返回一个布尔值,表示删除是否成功。has(value)
: 返回一个布尔值,表示该值是否为Set
的成员。clear()
:清除所有成员,没有返回值。10.3 Set 遍历
Set 结构的实例有四个遍历方法,可以用于遍历成员。
keys()
:返回键名的遍历器values()
:返回键值的遍历器entries()
:返回键值对的遍历器forEach()
:使用回调函数遍历每个成员10.4 Set 应用
10.5 Map 定义
JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。
为了解决这个问题,ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
Map作为构造函数,也可以接受一个数组作为参数。该数组的成员是一个个表示键值对的数组。
10.6 Map 实例属性和方法
Map.prototype.constructor
: 构造函数,默认是就是Map
函数。Map.prototype.size
: 返回Map
实例的成员总数。set(key, value)
方法设置键名key对应的键值为value,然后返回整个 Map 结构。get(key)
方法读取key
对应的键值,如果找不到key
,返回undefined
。has(key)
方法返回一个布尔值,表示某个键是否在当前 Map 对象之中。delete(key)
方法删除某个键,返回true
。如果删除失败,返回false
。clear()
方法清除所有成员。10.7 Map遍历
Map 结构原生提供三个遍历器生成函数和一个遍历方法。
keys()
:返回键名的遍历器。values()
:返回键值的遍历器。entries()
:返回所有成员的遍历器。forEach()
:遍历 Map 的所有成员。需要特别注意的是,Map 的遍历顺序就是插入顺序。
参考图书
《ECMAScript 6 入门》