共计 3768 个字符,预计需要花费 10 分钟才能阅读完成。
ES6 常用新特性
1. let && const
let 命令也用于变量声明,但是作用域为局部
{
let a = 10;
var b = 1;
}
在函数外部可以获取到 b,获取不到 a,因此例如 for 循环计数器就适合使用 let。
const 用于声明一个常量,设定后值不会再改变
const PI = 3.1415;
PI // 3.1415
PI = 3; //TypeError: Assignment to constant variable.
2. 解构赋值
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。
例如数组:
let [a, b, c] = [1, 2, 3];
// 等同于
let a = 1;
let b = 2;
let c = 3;
这真的让代码看起来更优美,有种 python 赋值的既视感。
对象的解构赋值:获取对象的多个属性并且使用一条语句将它们赋给多个变量。
var {
StyleSheet,
Text,
View
} = React;
等同于
var StyleSheet = React.StyleSheet;
var Text = React.Text;
var View = React.Text;
3. 箭头函数
ES6 中新增箭头操作符用于简化函数的写法,操作符左边为参数,右边为具体操作和返回值。
var sum = (num1, num2) => {return num1 + num2;}
// 等同于
var sum = function(num1, num2) {
return num1 + num2;
};
箭头函数还修复了 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. … 操作符
这个的引入几乎不会用到 extend 这个函数来。通过它可以将数组作为参数直接传入函数:
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 标准引入了新的 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) {// 遍历 Array
alert(x);
}
for (var x of s) {// 遍历 Set
alert(x);
}
for (var x of m) {// 遍历 Map
alert(x[0] + ‘=’ + x[1]);
}
复制代码
Map 相关操作如下,Set 同理:
复制代码
var m = new Map(); // 空 Map
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
6. 类
ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过 class 关键字,可以定义类,与多数传统语言类似。
复制代码
// 定义类
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return ‘(‘ + this.x + ‘, ‘ + this.y + ‘)’;
}
}
ES7 常用新特性
1. Array.prototype.includes
在一个数组或者列表中检查是否存在一个值
let arr = [‘react’, ‘angular’, ‘vue’]
// Correct
if (arr.includes(‘react’)) {
console.log(‘Can use React’)
}
还能在字符串中使用 includes:
let str = ‘React Quickly’
// Correct
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)
2.Exponentiation Operator(求幂运算)
et 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
ES8 新特性
1. Object.values/Object.entries
不使用 ES8 Object.values
使用 Object.keys() 遍历对象的属性值,需要通过属性名 key 去获取属性值:
let obj = {a: 1, b: 2, c: 3};
Object.keys(obj).forEach((key) =>
{
console.log(obj[key]); // 输出 1, 2, 3
});
使用 ES8
使用 Object.values() 遍历对象的属性值,无需使用使用属性名:
let obj = {a: 1, b: 2, c: 3}
Object.keys(obj).forEach((key) =>
{
console.log(obj[key]); // 输出 1, 2, 3
});
不使用 ES8 Object.entries
使用 Object.keys() 遍历对象的属性名和属性值:
let obj = {a: 1, b: 2, c: 3};
Object.keys(obj).forEach((key) =>
{
console.log(key + “: ” + obj[key]); // 输出 a: 1, b: 2, c: 3
})
使用 ES8
使用 Object.entries() 遍历对象的属性名和属性值:
let obj = {a: 1, b: 2, c: 3};
Object.entries(obj).forEach(([key, value]) =>
{
console.log(key + “: ” + value); // 输出 a: 1, b: 2, c: 3
})
2. String padding(字符串填充)
3. Async/Await
使用 Promise
使用 Promise 写异步代码,会比较麻烦:
axios.get(`/q?query=${query}`)
.then(response => response.data)
.then(data =>
{
this.props.processfetchedData(data);
})
.catch(error => console.log(error));
使用 Async/Await
Async/Await 使得异步代码看起来像同步代码,这正是它的魔力所在:
async fetchData(query) =>
{
try
{
const response = await axios.get(`/q?query=${query}`);
const data = response.data;
return data;
}
catch (error)
{
console.log(error)
}
}
fetchData(query).then(data =>
{
this.props.processfetchedData(data)
})
Async/Await 是写异步代码的新方式,以前的方法有回调函数和 Promise。相比于 Promise,它更加简洁,并且处理错误、条件语句、中间值都更加方便