1、变量声明let && const,增加新的词法作用域(ES6)
2、解构赋值(ES6)
数组解构赋值:let [a, b, c] = [1, 2, 3];//等同于let a = 1;let b = 2;let c = 3; 让代码看起来更优美,有种python赋值的既视感。
对象的解构赋值:var { StyleSheet, Text } = React; 等同于var StyleSheet =React.StyleSheet; var Text = React.Text;
3、箭头函数(ES6)
ES6中新增箭头操作符除了用于简化函数的写法,还修复了this的指向,使其永远指向词法作用域。
var obj = {
birth: 1990,
getAge: function () {
var b = this.birth; // 1990
var fn = () => new Date().getFullYear() - this.birth; // this指向obj对象
return fn();
}
};
obj.getAge(); // 25
4、...操作符(ES6)
通过它可以将数组作为参数直接传入函数
var people = ['Lily', 'Lemon', 'Terry'];
function sayHello(people1, people2, people3) {
console.log(`Hello ${people1},${people2},${people3}`);
}
sayHello(...people);//输出:Hello Lily,Lemon,Terry
5、iterable【可迭代】类型(ES6)
为了统一集合类型,ES6标准引入了新的iterable类型,Array、Map和Set都属于iterable类型,具有iterable类型的集合可以通过新的for … of循环来遍历
var a = ['A', 'B', 'C'];
var s = new Set(['A', 'B', 'C']);
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
for (var x of a) {
alert(x); // 遍历Array
}
for (var x of s) {
alert('Set' + x); // 遍历Set
}
for (var x of m) {
alert('map' + x[0] + '=' + x[1]); // 遍历Map
}
var m = new Map(); // Map相关操作如下, Set同理
m.set('Adam', 67); // 添加新的key-value
m.set('Bob', 59);
m.has('Adam'); // 是否存在key 'Adam': true
m.get('Adam'); // 67
m.delete('Adam'); // 删除key 'Adam'
m.get('Adam'); // undefined
set数组去重
var arr = [1, 2, 3, 3, 3, 3, 14]
var set = new Set(arr)
var arr = Array.from(set)
console.log(arr) // 1,2,3,14
6、类(ES6)
ES6提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类,与多数传统语言类似。
//定义类
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return '(' + this.x + ', ' + this.y + ')';
}
}
7、Object.values/Object.entries (ES6)
ES5 引入了Object.keys方法,返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历( enumerable )属性的键名。Object.values方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历( enumerable )属性的键值。Object.entries方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历( enumerable )属性的键值对数组。
let {keys, values, entries} = Object;
let obj = { a: 1, b: 2, c: 3 };
for (let key of keys(obj)) {
console.log(key); // 'a', 'b', 'c'
}
for (let value of values(obj)) {
console.log(value); // 1, 2, 3
}
for (let [key, value] of entries(obj)) {
console.log([key, value]); // ['a', 1], ['b', 2], ['c', 3]
}
8、Array.prototype.includes(ES7)
在一个数组或者列表中检查是否存在一个值
let arr = ['react', 'angular', 'vue']
if (arr.includes('react')) {
console.log('Can use React')
}
还能在字符串中使用includes,除了增强了可读性语义化,实际上给开发者返回布尔值,而不是匹配的位置。
let str = 'React Quickly'
if (str.toLowerCase().includes('react')) { // true
console.log('Found "react"')
}
includes也可以在NaN(非数字)使用。最后 ,includes第二可选参数fromIndex,这对于优化是有好处的,因为它允许从特定位置开始寻找匹配。
console.log([1, 2, 3].includes(2)) // true
console.log([1, 2, 3].includes(4)) // false
console.log([1, 2, NaN].includes(NaN)) // true
console.log([1, 2, -0].includes(+0)) // true
console.log([1, 2, +0].includes(-0)) // true
console.log(['a', 'b', 'c'].includes('a')) // true
console.log(['a', 'b', 'c'].includes('a', 1)) // false
9、Exponentiation Operator(求幂运算)(ES7)
let a = 7 ** 12
let b = 2 ** 7
console.log(a === Math.pow(7, 12)) // true
console.log(b === Math.pow(2,7)) // true
// 开发者还可以操作结果:
let a = 7
a **= 12
let b = 2
b **= 7
console.log(a === Math.pow(7,12)) // true
console.log(b === Math.pow(2,7)) // true
10、String padding(字符串填充) (ES7)
padStart()
方法用另一个字符串填充当前字符串(重复,如果需要的话),以便产生的字符串达到给定的长度。填充从当前字符串的开始(左侧)应用的。
padEnd()
~~填充从当前字符串的开始(左侧)应用的。
'abc'.padStart(10); // " abc"
'abc'.padStart(10, "foo"); // "foofoofabc"
'abc'.padStart(6,"123465"); // "123abc"
'abc'.padEnd(10); // "abc "
'abc'.padEnd(10, "foo"); // "abcfoofoof"
11、Async/Await (ES7)
因为 async 函数返回一个 Promise 对象,所以 await 可以用于等待一个 async 函数的返回值。注意到 await 不仅仅用于等 Promise 对象,它可以等任意表达式的结果,所以,await 后面实际是可以接普通函数调用或者直接量的。等到一个 Promise 对象,它会阻塞后面的代码,等着 Promise 对象 resolve,然后得到 resolve 的值,作为 await 表达式的运算结果。
function getSomething() {
return "something";
}
async function testAsync() {
return Promise.resolve("hello async");
}
async function test() {
const v1 = await getSomething();
const v2 = await testAsync();
console.log(v1, v2);
}
test();