美文网首页
ES6部分易错点

ES6部分易错点

作者: 99ZY | 来源:发表于2021-06-09 23:39 被阅读0次

ES6----Iterator(遍历器)

1、遍历器(Iterator)是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。

2、Iterator的作用有三个:一是为各种数据结构,提供一个统一的、简便的访问接口;二是使得数据结构的成员能够按某种次序排列;三是ES6创造了一种新的遍历命令for...of循环,Iterator接口主要供for...of消费。

3、在ES6中,有些数据结构原生具备Iterator接口(比如数组),即不用任何处理,就可以被for...of循环遍历,有些就不行(比如对象)。原因在于,这些数据结构原生部署了Symbol.iterator属性(详见下文),另外一些数据结构没有。凡是部署了Symbol.iterator属性的数据结构,就称为部署了遍历器接口。调用这个接口,就会返回一个遍历器对象。
4、在ES6中,有三类数据结构原生具备Iterator接口:数组、某些类似数组的对象、Set和Map结构。

5、Object没有iterator接口,下面是一个为Object对象添加Iterator接口的例子:

let obj = {
  data: [ 'hello', 'world' ],
  [Symbol.iterator]() {
    const self = this;
    let index = 0;
    return {
      next() {
        if (index < self.data.length) {
          return {
            value: self.data[index++],
            done: false
          };
        } else {
          return { value: undefined, done: true };
        }
      }
    };
  }
};

6、下面是类似数组的对象调用数组的Symbol.iterator方法的例子。

let iterable = {
  0: 'a',
  1: 'b',
  2: 'c',
  length: 3,
  [Symbol.iterator]: Array.prototype[Symbol.iterator]
};
for (let item of iterable) {
  console.log(item); // 'a', 'b', 'c'
}

注意,普通对象部署数组的Symbol.iterator方法,并无效果。

7、有一些场合会默认调用Iterator接口(即Symbol.iterator方法),除了下文会介绍的for...of循环,还有几个别的场合。

解构赋值
扩展运算符(...)
yield_yield后面跟的是一个可遍历的结构,它会调用该结构的遍历器接口。
由于数组的遍历会调用遍历器接口,所以任何接受数组作为参数的场合,其实都调用;

8、字符串是一个类似数组的对象,也原生具有Iterator接口。
9、遍历器对象除了具有next方法,还可以具有return方法和throw方法。如果你自己写遍历器对象生成函数,那么next方法是必须部署的,return方法和throw方法是否部署是可选的。

Object.setPrototypeOf 垫片Polyfill实现

Object.setPrototypeOf 垫片Polyfill实现
我们必须借助非标准的

使用较旧的 Object.prototype.__proto__ (en-US) 属性,我们可以很容易地定义Object.setPrototypeOf 如果它不可用:

if (!Object.setPrototypeOf) {
    // 仅适用于Chrome和FireFox,在IE中不工作:
     Object.prototype.setPrototypeOf = function(obj, proto) {
         if(obj.__proto__) {
             obj.__proto__ = proto;
             return obj;
         } else {
             // 如果你想返回 prototype of Object.create(null):
             var Fn = function() {
                 for (var key in obj) {
                     Object.defineProperty(this, key, {
                         value: obj[key],
                     });
                 }
             };
             Fn.prototype = proto;
             return new Fn();
         }
     }
}

正确返回字符串长度的函数。

function codePointLength(text) {
var result = text.match(/[\s\S]/gu);
return result ? result.length : 0;
}

var s = '𠮷𠮷';

s.length // 4
codePointLength(s) // 2

浮点计算

0.1 + 0.2 === 0.3 // false

Number.EPSILON实际上是 JavaScript 能够表示的最小精度。误差如果小于这个值,就可以认为已经没有意义了,即不存在误差了。
引入一个这么小的量的目的,在于为浮点数计算,设置一个误差范围。我们知道浮点数计算是不精确的。

回调Promise

如果调用resolve函数和reject函数时带有参数,那么它们的参数会被传递给回调函数。reject函数的参数通常是Error对象的实例,表示抛出的错误;resolve函数的参数除了正常的值以外,还可能是另一个 Promise 实例,比如像下面这样。


const p1 = new Promise(function (resolve, reject) {
  // ...
});

const p2 = new Promise(function (resolve, reject) {
  // ...
  resolve(p1);
})

注意,这时p1的状态就会传递给p2,也就是说,p1的状态决定了p2的状态。如果p1的状态是pending,那么p2的回调函数就会等待p1的状态改变;如果p1的状态已经是resolved或者rejected,那么p2的回调函数将会立刻执行。

相关文章

  • ES6部分易错点

    ES6----Iterator(遍历器) 1、遍历器(Iterator)是一种接口,为各种不同的数据结构提供统一的...

  • es6易错点汇总

    https://juejin.im/post/5c76972af265da2dc4538b64#heading-1...

  • 易错点

    rate_ave=1042.00/793 而非rate_ave=1042/793if rate>=rate_av...

  • 易错点

    泛型 泛型约束使用extends而非implements 泛型类型没有多态的说法,所以出现了?通配符 泛型方法必须...

  • 四级备考笔记

    易错点 NOT!!

  • 函件易错点

    能将思维导图更好的运用在工作上,不仅能让自己的思路变的清晰,也让增加了我对工作的兴趣和热情!希望自己会有更大的改变!

  • golang易错点

    sdfsdsdfs

  • Leetcode 易错点

    1.索引变量自加的时候要注意与上下文之间的关系,要保证此变量不会再被调用,才可以自加。

  • React 易错点

    1. css的模块化 2. setState合并 3. 新的生命周期函数(16.3) 参考: https://ju...

  • 初中易错成语

    1、白驹过隙:比喻时间过得很快。 【易错点】易误解为:轻而易举。 2、百里挑一:形容十分出众。 【易错点】易误解为...

网友评论

      本文标题:ES6部分易错点

      本文链接:https://www.haomeiwen.com/subject/kgpqeltx.html