ES6常用新特性
1. let && const
let 命令也用于变量声明,但是作用域为局部{ let a = 10; var b = 1; }在函数外部可以获取到b,获取不到a,因此例如for循环计数器就适合使用let。const用于声明一个常量,设定后值不会再改变const PI = 3.1415;PI // 3.1415PI = 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.View;
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(); // 空Mapm.set('Adam', 67); // 添加新的key-valuem.set('Bob', 59);m.has('Adam'); // 是否存在key 'Adam': truem.get('Adam'); // 67m.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 + ')'; }}
7.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
ES7常用新特性
1. Array.prototype.includes
在一个数组或者列表中检查是否存在一个值let arr = ['react', 'angular', 'vue']// Correctif (arr.includes('react')) { console.log('Can use React')}还能在字符串中使用includes:let str = 'React Quickly'// Correctif (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 ** 12let b = 2 ** 7console.log(a === Math.pow(7,12)) // trueconsole.log(b === Math.pow(2,7)) // true开发者还可以操作结果:let a = 7a **= 12let b = 2b **= 7console.log(a === Math.pow(7,12)) // trueconsole.log(b === Math.pow(2,7)) // true
ES8新特性
1. Object.values/Object.entries
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]}
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/AwaitAsync/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,它更加简洁,并且处理错误、条件语句、中间值都更加方便