ES6-11新特性总结
2022-02-11 14:04:12 0 举报
AI智能生成
简单总结es6-11新特性
作者其他创作
大纲/内容
ES8(ES2017)
1. 声明
共享内存和原子操作:由全局对象SharedArrayBuffer和Atomics实现,将数据存储在一块共享内存空间中,这些数据可在JS主线程和web-worker线程之间共享
2. 字符串扩展
padStart()
把指定字符串填充到字符串头部,返回新的字符串
var str = '23';<br>var newStr = str.padStart(3,'w');<br>console.log(newStr); // w23
padEnd()
把指定字符串填充到字符串尾部,返回新的字符串
var str = '23';<br>var newStr = str.padEnd(3,'c');<br>console.log(newStr); // 23c
3. 对象扩展
Object.values()
返回以值组成的数组
var obj={a:1,b:{c:11}};<br>Object.values(obj);<br>// [1,{c:11}]
Object.entries()
返回以键和值组成的数组
var obj={a:1,b:{c:11}};<br>Object.values(obj);<br>// [['a'.'1'],['b',{c:11}]]
Object.getOwnPropertyDescriptors()
返回对象所有自身属性(非继承)的描述对象
const object1 = {<br> property1: 42<br>}<br><br>const descriptors1 = Object.getOwnPropertyDescriptors(object1)<br><br>console.log(descriptors1.property1.writable) // true<br><br>console.log(descriptors1.property1.value) // 42
4. 函数扩展
函数参数尾逗号,允许函数最后一个参数有尾逗号
// 参数定义<br>function f(p) {}<br>function f(p,) {}
// 带有尾后逗号的数组解构<br>[a, b,] = [1, 2]<br><br>// 带有尾后逗号的对象解构<br>var o = {<br> p: 42, <br> q: true,<br>}<br>var {p, q,} = o
5. for-await-of
ES9(ES2018)
1. 字符串扩展
2. 对象扩展
扩展运算符 ...
var obj = {a:10, b:20};<br>var obj1 = {...obj}
3. 正则扩展
4. Promise
finally()
5. Async
for-await-of
循环等待每个Promise对象变为resolved状态才进入下一步
ES10(ES2109)
1. 字符串扩展
trimeStart()
消除字符串头部空格,返回新的字符串
trimeEnd()
消除字符串尾部空格,返回新的字符串
2. 对象扩展
Object.fromEntries()
返回以键和值组成的对象(Object.entries()的逆操作)
3. 数组扩展
sort()稳定性
flat()
扁平化数组,返回新数组
flatMap()
映射且扁平化数组,返回新数组(只能展开一层数组)
4. 函数扩展
toString()改造
返回函数原始代码(与编码一致)
catch()
参数可省略
5. Symbol<br>
返回Symbol值的描述
ES6(ES2015)
1. 声明
Let 和 Const
2. 类 Class
ES6之前声明一个类要调用构造函数
function Person(name, age) {<br> this.name = name<br> this.age = age<br>}<br>Person.prototype.information = function () {<br> return 'My name is ' + this.name + ', I am ' + this.age<br>}
ES6之后可以使用类来声明
class Person {<br> constructor(name, age) {<br> this.name = name<br> this.age = age<br> }<br> information() {<br> return 'My name is ' + this.name + ', I am ' + this.age<br> }<br>}
3. 箭头函数(Arrow Function)<br>
ES6之前
var list = [1,2,3];<br>var newLIst = list.map(function(item){<br> return item * item<br>})<br>
ES6之后
var list = [1,2,3];<br>var newLIst = list.map((item)=>item*item)
4. 函数参数默认值(Function parameter defaults)
ES6之前
function getData(data){<br> var obj = data || {}<br>}<br>这样会有隐患,比如传入一个false的值
ES6之后
function getData(data={}){<br> // ...<br>}
5. 模板字符串(Template string)
ES6之前
var name = 'aaa';<br>var str = 'this name is' + name;<br>
ES6之后
var name = `aaa`;<br>var str = `this name is ${name}`
6. 解构赋值(Destructuring assignment)
ES6之前
var a = 1;<br>var b = 2;<br>var temp = b;<br>b = a;<br>a = temp;
ES6之后
var a = 1;<br>var b = 2;<br>[a,b] = [b,a]
7. Module
ES6之前
// add.js<br>// 输出文件<br>const ADDVAL = 10;<br>modules.exports sum = (num)=>{return num + ADDVAL}<br><br>// index.js<br>// 输入文件<br>const sum = require('./add.js');<br>console.log(`相加结果是:${sum(10)}`)
ES6之后
// add.js<br>// 输出文件<br>const ADDVAL = 10;<br>export sum = (num)=>{return num + ADDVAL}<br><br>// index.js<br>// 输入文件<br>import {sum} from './add.js';<br>console.log(`相加结果是:${sum(10)}`)
8. 扩展操作符(Spread operator)
ES6之前
var list = [1,2,3];<br>funciton add(a,b,c){<br> return a+b+c<br>}<br>var sum = add.bind(null, list);
ES6之后
var list = [1,2,3];<br>funciton add(a,b,c){<br> return a+b+c<br>}<br>var sum = add(...list);
9. 对象属性简写(Object attribute shorthand)
ES6之前
var name = 'lucy';<br>var age = 20;<br>var person = {<br> name: name,<br> age: age<br>}
ES6之后
var name = 'lucy';<br>var age = 20;<br>var person = {<br> name,<br> age<br>}<br>
10. Promise(异步解决方案)
三种状态
pending(等待中)
resolved(完成了)
rejected(拒绝了)
11. for....of
语法:<br>for (var value of myArray) {<br> console.log(value);<br>}<br>
循环一个数组
var list = [1,2,3];<br>for(var item of list){<br> console.log(item)<br>}<br>
循环一个字符串
var str = 'hello';<br>for(var item of str){<br> console.log(item)<br>}
循环一个类型化的数组
let iterable = new Uint8Array([0x00, 0xff]);<br><br>for (let value of iterable) {<br> console.log(value);<br>}
循环一个Map
let iterable = new Map([["a", 1], ["b", 2], ["c", 3]]);<br><br>for (let [key, value] of iterable) {<br> console.log(value);<br>}
循环一个 Set
let iterable = new Set([1, 1, 2, 2, 3, 3]);<br><br>for (let value of iterable) {<br> console.log(value);<br>}
循环一个 DOM collection
let articleParagraphs = document.querySelectorAll("article > p");<br><br>for (let paragraph of articleParagraphs) {<br> paragraph.classList.add("read");<br>}
循环一个拥有enumerable属性的对象
for (var key of Object.keys(someObject)) {<br> console.log(key + ": " + someObject[key]);<br>}
循环一个生成器(generators)
function* fibonacci() { // a generator function<br> let [prev, curr] = [0, 1];<br> while (true) {<br> [prev, curr] = [curr, prev + curr];<br> yield curr;<br> }<br>}<br><br>for (let n of fibonacci()) {<br> console.log(n);<br> // truncate the sequence at 1000<br> if (n >= 1000) {<br> break;<br> }<br>}
12. Symbol
const symbol1 = Symbol();<br>const symbol2 = Symbol(42);<br>const symbol3 = Symbol('foo');<br><br>console.log(typeof symbol1); // "symbol"<br>console.log(symbol3.toString()); // "Symbol(foo)"<br>console.log(Symbol('foo') === Symbol('foo')); // false
13. Iterator
Iterator
14. Generator
生成器函数使用 function*语法编写。
15. Set
Set
WeakSet
16. Map
Map
WeakMap
17. Proxy
18. Reflect
ES7(ES2016)
1. 数组扩展
includes() ,用来判断一个数组是否包含某个指定的值,包含则返回true,反之返回false
const array1 = [1, 2, 3]<br>console.log(array1.includes(2)) // true
2. 数值扩展
幂运算符 **,相当于Math.pow()
console.log(2**10) // 1024<br>console.log(Math.pow(2, 10)) // 1024
ES11(ES2020)
1. 声明
globalThis
作为顶层对象,指向全局下的this
2. 数值扩展
BigInt
任何位数的整数(新增的数据类型,使用n结尾)
子主题
3. 对象扩展
链判断操作符(?.)
判断是否存在对象属性,不存在则返回undefined且不往下执行
三种用法
对象属性:obj?.a?.a1
对象属性:obj?[exp]
函数或者对象方法的调用:func?.(...arg)
用例:<br>var obj = {<br> a: {<br> a1: 12<br> }<br>}<br><br>console.log(obj?.a?.a1);<br>console.log(obj?.b || 'kong');
Babel插件转换
安装插件:npm i @babel/plugin-syntax-optional-chaining
在babel.config.js中添加plugin
{<br> "plugins":["@babel/plugin-syntax-optional-chaining"]<br>}
Null判断操作符
判断值是否为undefined或者null,是则使用默认值
读取对象的属性时,我们需要指定默认值,通常使用 || 运算符来赋默认值。 || 或运算符表达的意思是当左侧为空串,null,undefined,false,0时右侧都会生效。
ES2020引入了??操作符,只有当左侧为undefined或者null时右侧才回生效
var a;<br>a ?? false;
⚠️注意:与&&等运算符一起使用时需要加括号表明优先级,否则会报错
babel插件转换
安装插件:npm install --save-dev @babel/plugin-proposal-nullish-coalescing-operator<br>
在babel.config.js中添加plugin
{<br> "plugins": ["@babel/plugin-proposal-nullish-coalescing-operator"]<br>}
4. 正则扩展
matchAll()
返回所有匹配的遍历器
5. import()
import()支持动态导入模块,返回Promise
import(`./home.js`) // home.js中export const export1 = ''; ....<br> .then(({export1, export2})=> <br> // 加载成功的回调<br> })<br> .catch(err => {<br> // 加载失败的回调<br> });<br>
区别:require()是同步加载,import()是异步加载
适用场合
1. 按需加载模块,比如点击时加载某个文件或者模块
2. 条件加载,比如在if判断语句中
3. 动态的模块路径,比如模块路径是实时生成的
babel插件转换
安装插件:npm install --save-dev @babel/plugin-syntax-dynamic-import<br>
在babel.config.js中配置
{<br>"plugins": ["@babel/plugin-syntax-dynamic-import"]<br>}
6. for in 遍历顺序
7. Promise
Promise.allSettled()
将多个实例包装成一个新实例,返回全部实例状态变更后的状态数组(齐变更再返回)
8. export * as from 'module'
export { foo, bar } from 'my_module';<br><br>// 可以简单理解为<br>import { foo, bar } from 'my_module';<br>export { foo, bar };<br>
ES2020之前import复合写法
import * as someIdentifier from "someModule";<br>
es2020引入对应的export写法
export * as someIdentifier from "someModule";<br>// 等同于<br>import * as ns from "mod";<br>export {ns};
babel插件转换
安装插件:npm install --save-dev @babel/plugin-proposal-export-namespace-from<br>
在babel.config.js中
{<br> "plugins": ["@babel/plugin-proposal-export-namespace-from"]<br>}<br>
收藏
0 条评论
下一页