Array.prototyp.includes (es7)

替代数组的indexOf方法,检查数组中是否存在检查值,返回布尔值。

  1. const arr = [1,2,3]
  2. arr.includes(1) // true
  3. // 可以填入第二可选参数,从指定位置查找
  4. arr.includes(2, 1) // true
  5. arr.includes(2, 2) // false

还可以用于字符串:

  1. const mvvm = 'React Vue Angular'
  2. mvvm.includes('Vue') // true

Exponentiation Operator(求幂运算) (es7)

  1. // 在es6及之前,指数只能通过Math内置方法求得
  2. let a = Math.pow(2, 3) // 8
  3. //而在es7,可以通过 ** 来运算
  4. let b = 2 ** 3 // 8

运算符与coffee和python一样。

Object.values(es8)

Object.valuesObject.keys对应

  1. const obj = {name: 1, age: 18, gender: 'male'}
  2. Object.keys(obj).forEach((key, i) => {
  3. console.log(key,': ', obj[key])
  4. })
  5. // name: 1
  6. // age: 18
  7. // gender: 'male'

在es5中也可以使用for of遍历对象

  1. for (let key of Object.keys(obj)) {
  2. console.log(key, obj[key])
  3. }

如果通过Object.keysObject.values获得了对应的keys or values 数组。

tip: 尽量不要使用for in遍历对象,因为会有这样一个问题:Object.prototype上添加的可枚举属性也会被遍历出来。

  1. Object.prototype.someEnumeration = 'boom!'
  2. for (let key in obj) {
  3. console.log(key, obj[key])
  4. }
  5. // 会打印出 someEnumeration: boom!

Object.entries(es7)

Object.entries返回对象自身可迭代属性key-value对数组,分别以数组的形式存入数组。

  1. const obj = {name: 1, age: 18, gender: 'male'}
  2. const objArray = Object.entries(obj)
  3. console.log(JSON.stringify(objArray))
  4. // [["name",1],["age",18],["gender","male"]]

这个api对于提取和迭代对象的属性非常有用

String.prototype.padStartString.prototype.padEnd

padStart()在开始部位填充,返回一个给出长度的字符串,填充物给定字符串,把字符串填充到期望的长度。

  1. console.log('0.00'.padStart(20))
  2. console.log('10,000.00'.padStart(20))
  3. console.log('250,000.00'.padStart(20))
  4. // 打印出
  5. // 0.00
  6. // 10,000.00
  7. // 250,000.00

也可以通过第二个参数来设置填充的字符

  1. console.log('react'.padStart(10, '_'))
  2. // "_____react"

async/await(es7)

实现一个sleep函数

  1. var sleep = function (time) {
  2. return new Promise(function (resolve, reject) {
  3. setTimeout(function () {
  4. resolve()
  5. }, time)
  6. })
  7. }
  8. var start = async function () {
  9. // 在这里使用起来就像同步代码那样直观
  10. console.log('start')
  11. await sleep(3000)
  12. console.log('end')
  13. }
  14. start();

控制台先输出start,稍等3秒后,输出了end。

使用的基本规则:

  • async 表示这是一个async函数,await只能用在这个函数里面
  • await表示在这里 等待promise返回结果,再继续执行
  • await 后面跟着的应该是一个promise对象(当然,其他返回值也没关系,只是会立即执行,不过那样就没有意义)
  • await必须在async函数的上下文中的

如何获取返回值?

  1. var sleep = function (time) {
  2. return new Promise(function (resolve, reject) {
  3. setTimeout(function () {
  4. // 返回 ‘ok’
  5. resolve('ok')
  6. }, time)
  7. })
  8. }
  9. var start = async function () {
  10. let result = await sleep(3000)
  11. console.log(result) // ‘ok’
  12. }
  13. start()

如何捕捉错误

  1. var sleep = function(time) {
  2. return new Promise((resolve, reject) => {
  3. setTimeout(() => {
  4. reject('error')
  5. }, time)
  6. })
  7. }
  8. var start = async function() {
  9. try{
  10. console.log('start')
  11. await sleep(3000) // 这里返回错误
  12. console.log('end') // 不会执行了
  13. }catch(err) {
  14. console.log(err) // error
  15. }
  16. }
  17. start()

使用赋值解构生成自然数数组

  1. let arr = [...Array.from({ length }).keys()]

Proxy用法

  1. var handler = {
  2. get: function(target, name) {
  3. if (name === 'prototype') {
  4. return Object.prototype;
  5. }
  6. return 'Hello, ' + name;
  7. },
  8. apply: function(target, thisBinding, args) {
  9. return args[0];
  10. },
  11. construct: function(target, args) {
  12. return {value: args[1]};
  13. }
  14. };
  15. var fproxy = new Proxy(function(x, y) {
  16. return x + y;
  17. }, handler);
  18. fproxy(1, 2) // 作为apply调用,1
  19. new fproxy(1,2) // 作为构造函数调用{value: 2}
  20. fproxy.prototype === Object.prototype // true
  21. fproxy.foo // "Hello, foo"