async/await
# async/await异步函数存在以下四种使用形式:函数声明: async function foo() {}函数表达式: const foo = async function() {}对象的方式: let obj = { async foo() {} }箭头函数: const foo = async () => {}虽然Promise可以解决回调地狱的问题,但是链式调用太多,则会变成另一种形式的回调地狱 —— 面条地狱,所以在ES8里则出现了Promise的语法糖async/await,专门解决这个问题。我们先看一下下面的Promise代码:fetch('coffee.jpg') .then(response => response.blob()) .then(myBlob => { let objectURL = URL.createObjectURL(myBlob) let image = document.createElement('img') image.src = objectURL document.body.appendChild(image) }) .catch(e => { console.log('There has been a problem with your fetch operation: ' + e.message) })然后再看看async/await版的,这样看起来是不是更清晰了。async function myFetch() { let response = await fetch('coffee.jpg') let myBlob = await response.blob() let objectURL = URL.createObjectURL(myBlob) let image = document.createElement('img') image.src = objectURL document.body.appendChild(image)}myFetch()当然,如果你喜欢,你甚至可以两者混用async function myFetch() { let response = await fetch('coffee.jpg') return await response.blob()}myFetch().then((blob) => { let objectURL = URL.createObjectURL(blob) let image = document.createElement('img') image.src = objectURL document.body.appendChild(image)})
Object.values()
# Object.values()Object.values()方法返回一个给定对象自身的所有可枚举属性值的数组,值的顺序与使用for...in循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )。代码如下:const object1 = { a: 'somestring', b: 42, c: false}console.log(Object.values(object1)) // ["somestring", 42, false]
Object.entries()
# Object.entries()Object.entries()方法返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环还会枚举原型链中的属性)。代码如下:const object1 = { a: 'somestring', b: 42}for (let [key, value] of Object.entries(object1)) { console.log(`${key}: ${value}`)}// "a: somestring"// "b: 42"
padStart()
# padStart()padStart() 方法用另一个字符串填充当前字符串(重复,如果需要的话),以便产生的字符串达到给定的长度。填充从当前字符串的开始(左侧)应用的。代码如下:const str1 = '5'console.log(str1.padStart(2, '0')) // "05"const fullNumber = '2034399002125581'const last4Digits = fullNumber.slice(-4)const maskedNumber = last4Digits.padStart(fullNumber.length, '*') console.log(maskedNumber) // "************5581"
padEnd()
# padEnd()padEnd() 方法会用一个字符串填充当前字符串(如果需要的话则重复填充),返回填充后达到指定长度的字符串。从当前字符串的末尾(右侧)开始填充。const str1 = 'Breaded Mushrooms'console.log(str1.padEnd(25, '.')) // "Breaded Mushrooms........"const str2 = '200'console.log(str2.padEnd(5)) // "200 "
函数参数结尾逗号(Function parameter lists and calls trailing commas)
# 函数参数结尾逗号(Function parameter lists and calls trailing commas)在ES5里就添加了对象的尾逗号,不过并不支持函数参数,但是在ES8之后,便开始支持这一特性,代码如下:// 参数定义function f(p) {}function f(p,) {} (p) => {}(p,) => {}class C { one(a,) {}, two(a, b,) {},}var obj = { one(a,) {}, two(a, b,) {},};// 函数调用f(p)f(p,)Math.max(10, 20)Math.max(10, 20,)但是以下的方式是不合法的:仅仅包含逗号的函数参数定义或者函数调用会抛出 SyntaxError。而且,当使用剩余参数的时候,并不支持尾后逗号,例子如下:function f(,) {} // SyntaxError: missing formal parameter(,) => {} // SyntaxError: expected expression, got ','f(,) // SyntaxError: expected expression, got ','function f(...p,) {} // SyntaxError: parameter after rest parameter(...p,) => {} // SyntaxError: expected closing parenthesis, got ','在解构里也可以使用,代码如下:// 带有尾后逗号的数组解构[a, b,] = [1, 2]// 带有尾后逗号的对象解构var o = { p: 42, q: true,}var {p, q,} = o同样地,在使用剩余参数时,会抛出 SyntaxError,代码如下:var [a, ...b,] = [1, 2, 3] // SyntaxError: rest element may not have a trailing comma
ShareArrayBuffer(因安全问题,暂时在Chrome跟FireFox中被禁用)
# ShareArrayBuffer(因安全问题,暂时在Chrome跟FireFox中被禁用)SharedArrayBuffer 对象用来表示一个通用的,固定长度的原始二进制数据缓冲区,类似于 ArrayBuffer 对象,它们都可以用来在共享内存(shared memory)上创建视图。与 ArrayBuffer 不同的是,SharedArrayBuffer 不能被分离。代码如下:et sab = new SharedArrayBuffer(1024) // 必须实例化worker.postMessage(sab)
Atomics对象
# Atomics对象Atomics对象 提供了一组静态方法用来对 SharedArrayBuffer[3] 对象进行原子操作。方法如下:•Atomics.add() :将指定位置上的数组元素与给定的值相加,并返回相加前该元素的值。•Atomics.and():将指定位置上的数组元素与给定的值相与,并返回与操作前该元素的值。•Atomics.compareExchange():如果数组中指定的元素与给定的值相等,则将其更新为新的值,并返回该元素原先的值。•Atomics.exchange():将数组中指定的元素更新为给定的值,并返回该元素更新前的值。•Atomics.load():返回数组中指定元素的值。•Atomics.or():将指定位置上的数组元素与给定的值相或,并返回或操作前该元素的值。•Atomics.store():将数组中指定的元素设置为给定的值,并返回该值。•Atomics.sub():将指定位置上的数组元素与给定的值相减,并返回相减前该元素的值。•Atomics.xor():将指定位置上的数组元素与给定的值相异或,并返回异或操作前该元素的值。•Atomics.wait():检测数组中某个指定位置上的值是否仍然是给定值,是则保持挂起直到被唤醒或超时。返回值为 "ok"、"not-equal" 或 "time-out"。调用时,如果当前线程不允许阻塞,则会抛出异常(大多数浏览器都不允许在主线程中调用 wait())。•Atomics.wake():唤醒等待队列中正在数组指定位置的元素上等待的线程。返回值为成功唤醒的线程数量。•Atomics.isLockFree(size):可以用来检测当前系统是否支持硬件级的原子操作。对于指定大小的数组,如果当前系统支持硬件级的原子操作,则返回 true;否则就意味着对于该数组,Atomics 对象中的各原子操作都只能用锁来实现。此函数面向的是技术专家。
Object.getOwnPropertyDescriptors()
# Object.getOwnPropertyDescriptors()Object.getOwnPropertyDescriptors() 方法用来获取一个对象的所有自身属性的描述符。代码如下:const object1 = { property1: 42}const descriptors1 = Object.getOwnPropertyDescriptors(object1)console.log(descriptors1.property1.writable) // trueconsole.log(descriptors1.property1.value) // 42// 浅拷贝一个对象Object.create( Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj) )// 创建子类function superclass() {}superclass.prototype = { // 在这里定义方法和属性}function subclass() {}subclass.prototype = Object.create(superclass.prototype, Object.getOwnPropertyDescriptors({ // 在这里定义方法和属性}))
修饰器