迭代器(Iterator)和生成器(Generation)

一、用生成器给对象定义迭代器

常规方法

const obj = {
  a: 1,
  b: 2,
  c: 3,
  [Symbol.iterator]() {
    let [index, values] = [0, Object.values(this)]
    return {
      next() {
        const done = (index >= values.length)
        const value = done ? undefined : values[index++]
        return {
          done,
          value
        }
      }
    }
  }
}
for (let v of obj) {
  console.log(v) // 1 2 3
}

“迭代器(Iterator)和生成器(Generation)”继续阅读

JavaScript高级程序设计 – [美]Nicholas C·Zakas 著 / 李松峰 曹力 译

版次:2012 年 3 月第 1 版

4 变量、作用域和内存问题

4.1 基本类型和引用类型的值

4.1.4 检测类型

如果变量是给定引用类型的实例,那么 instanceof 操作符就会返回 true

4.3 垃圾收集

找出那些不再继续使用的变量,然后释放其占用的内存。为此,垃圾收集器会按照固定的时间间隔,周期性地执行这一操作。

“JavaScript高级程序设计 – [美]Nicholas C·Zakas 著 / 李松峰 曹力 译”继续阅读

高性能JavaScript – Nicholas C.Zakas 著 / 丁琛 译 / 赵泽欣 审校

出版时间:2010 年 11 月

1 加载和执行

  • 当浏览器在执行 JavaScript 代码时,不能同时做其他任何事情。事实上,多数浏览器使用单一进程来处理用户界面(UI)刷新和 JavaScript 脚本执行,所以同一时刻只能做一件事。
  • defer 属性仅当 src 属性声明时才生效。
  • 通常来讲,把新创建的 <script> 标签添加到 <head> 标签里比添加到 <body> 里更保险,尤其是在页面加载过程中执行代码时更是如此。当 <body> 中的内容没有全部加载完成时,IE 可能会抛出一个“操作已中止”的错误信息。

“高性能JavaScript – Nicholas C.Zakas 著 / 丁琛 译 / 赵泽欣 审校”继续阅读