JavaScript: The Good Parts

Table of Contents

1

1.1 Meta Notes

1.2 Books

1.2.1 DONE Combo #1

  1. DONE 金字塔原理
  2. TODO Beast Machines: Transformers (cartoon)
  3. DONE 论持久战
  4. DONE 一看就懂的经济常识全图解
  5. DONE 刻意练习
  6. DONE 系统之美
  7. DONE 邓小平时代

1.2.2 INPROGRESS Combo #2

  1. DONE 新经济, 新规则 (Kevin Kelly)
  2. DONE 麦肯锡问题解决方法与技巧

1.2.5 INPROGRESS Effective Java

1.2.6 DONE Don't Make Me Think

1.2.7 DONE Clean Code

1.2.8 INPROGRESS Deep Learning

1.2.9 INPROGRESS Async JavaScript

2 前言 / Preface

3 第 1 章 精华 / Good Parts

Summary
  • class-free: 直接从其他对象继承属性

3.1 为什么是 JAVASCRIPT?

3.2 分析 JAVASCRIPT

3.3 一个简单的试验场 / A Simple Testing Ground

4 第 2 章 语法 / Grammer

Summary
  • railroad diagram

4.1 空白 / Whitespace

  • NaN 是一个数值并且不等于任何一个数值, 且不等于自己 (这个很合理), 用 isNan(num) 来测试

4.2 标识符 / Names

4.3 数字 / Numbers

4.4 字符串 / Strings

  • 16 位 Unicode, ~"A" = "\u0041"~
  • string.length

4.5 语句 / Statements

  • falsy
    • false/null
    • undefined
    • " " (space)
    • 0
    • NaN

4.6 表达式 / Expressions

  • typeof:
    • number
    • string
    • boolean
    • undefined
    • function
    • object: 包括 array, null

4.7 字面量 / Literals

4.8 函数 / Functions

5 第 3 章 对象 / Objects

Summary
  • 属性值可以是 undefined 之外任何值
  • 原型链

5.1 对象字面量 / Object Literals

5.2 检索 / Retrieval

  • 用短路语句避免对 null 找属性

5.3 更新 / Update

5.4 引用 / Reference

5.5 原型 / Prototype   best

  • Object.prototype
    if (typeof Object.create !== 'function') {
        Object.create = function (o) {
    	var F = function () {};
    	F.prototype = o;
    	return new F();
        }
    }
    
  • 一层一层从 .__proto__ 找, 直到 Object.

5.6 反射 / Reflection

  • typeof flight.constructor ('function')
  • flight.hasOwnProperty(prop)

5.7 枚举 / Enumeration

  • for (prop in flight)

5.8 删除 / Delete

  • delete flight.name (set to undefined), 如果是数组, 形成空洞

5.9 减少全局变量污染 / Global Abatement

  • 通过绑定到属性的方法, 把一堆杂七杂八的变量统领到一个变量下

6 第 4 章 函数 / Functions

Summary
  • 编程: 把需求分解成一组函数与数据结果的技能.

6.1 函数对象 / Function Objects

  • 函数就是对象
  • Function.prototype -> Object.prototype

6.2 函数字面量 / Function Literals

  • 通过函数字面量创建的函数对象包含一个连到外部上下文的连接. Closure.

6.3 调用 / Invocation   best

  • 两个额外参数: this 和 arguments (array-like, 只有 length 属性)
  • 缺失的参数 -> undefined
  • 四种调用模式
    • The Method Invocation Pattern: 方法调用: object 的 (public) method 的调用. this 绑定到了对象.
    • The Function Invocation Pattern: 函数调用: var sum = add(3,4), this 绑定到了全局.
    • The Constructor Invocation Pattern: 构造器调用: new Func(), this 绑定到了 new 出来的对象.
    • The Apply Invocation Pattern: apply 调用: func.apply(context, arguments), this 绑定到了第一个参数.

6.4 参数 / Arguments

  • arguments is 'array-like'

6.5 返回 / Return

  • 函数总是返回, 如果没有返回值, 就返回 undefined
  • new Func(), 如果 Func 返回的不是对象, 则返回 this (一个新对象)

6.6 异常 / Exceptions

6.7 给类型增加方法 / Augmenting Types

  • Function.prototype.<method> = function(…) {…}
    Function.prototype.method = function (name, func) {
        if (!this.prototype[name]) {
    	this.prototype[name] = func;
        }
    }
    
    // typeof Number === 'function'
    Number.method('interger', function () {
        return Math[this < 0 ? 'ceil' : 'floor'](this);
    });
    // (12.34).interger()
    
    String.method('trim', function() {
        return this.replace(/^\s+|\s+$/g, '');
    });
    // " abc ".trim()
    

6.8 递归 / Recursion

6.9 作用域 / Scope

6.10 闭包 / Closure

6.11 回调 / Callbacks

6.12 模块 / Module

  • closure

6.13 级联 / Cascade

  • 就是 chaining

6.14 科里化 / Curry

  • better curry than java 8
    Function.method('curry', function() {
        var slice = Array.prototype.slice,
    	args = slice.apply(arguments),
    	that = this;
        return function() {
    	return that.apply(null, args.concat(slice.apply(arguments)));
        };
    });
    

6.15 记忆 / Memoization

7 第 5 章 继承 / Inheritance

7.1 伪类 / Pseudoclassical

  • 构造器函数, 最好大写字母开头

7.2 对象说明符 / Object Specifiers

7.3 原型 / Prototypal

7.4 函数化 / Functional

  • 给私有对象起一个奇怪的名字, 来防止别人使用它
  • 如果对象的状态都是私有的, 则 tamper-proof (防伪)
  • durable 的对象: 只有函数, 没有状态 (不会被入侵)

7.5 部件 / Parts

8 第 6 章 数组 / Arrays

Summary
  • 不是真正的 array, 只是 array-like (因为内存不连续)

8.1 数组字面量 / Array Literals

  • […]
  • {'0': …, …}

8.2 长度 / Length

  • 很容易形成空洞

8.3 删除 / Delete

  • delete array[index]
  • inplace cut off: array.splice(startPos, nElementToCutOff)

8.4 枚举 / Enumeration

8.5 混淆的地方 / Confusion

  • [].constructor === Array (true)

8.6 方法 / Methods

  • reduce
    Array.method('reduce', function (f, value) {
        for (var i = 0; i < this.length; i++) {
    	value = f(this[i], value);
        }
        return value;
    });
    

8.7 维度 / Dimensions

9 第 7 章 正则表达式 / Regular Expressions

9.1 一个例子 / An Example

  • regex.exec
  • regex.test
  • string.match
  • string.replace
  • string.search
  • string.split
  • 不要尝试写一个大而全的 regex

9.2 结构 / Construction

  • /regex/
  • i, g, m

9.3 元素 / Elements

9.3.1 正则表达式分支 / Regexp Choice

  • (a|b), choose a or b

9.3.2 正则表达式序列 / Regexp Sequence

  • regexp factor, regexp quantifier: x{min,max}

9.3.3 正则表达式因子 / Regexp Factor

  • regexp factor, regexp quantifier: x{min,max}

9.3.4 正则表达式转义 / Regexp Escape

  • \d: digits, \D: non-digits
  • \s : whitespaces, \S : non-whitespaces
  • \b: boundry
  • \1: captured group #1

9.4 正则表达式分组 / Regexp Group

  • capturing
  • noncapturing
  • positive lookahead
  • negative lookahead

10 TODO 第 8 章 方法

  • 这部分查文档

11 第 9 章 代码风格 / Style

12 第 10 章 优美的特性 / Beautiful Features

13 附录 A: 毒瘤 / Awful Parts

  • global variables: 没有 linker, 全局变量
  • scope: 语法上有 block scope, 实际上没有
  • semicolon insertion
  • reserved words
  • unicode
  • typeof: typeof null === object
  • parseInt, 小心进制问题, 尤其在处理时间上
    • 不仅还是个单目运算符, 可以转化字符串成数字
  • Floating point
  • NaN: 是 number, isFinite
  • Phony arrays
  • Falsy values: 0, false, null, undefined, ' '
  • undefined 和 NaN 是全局变量, 可能被修改, lodash 库里为了防止别人修改了这个值, 用 var undefined; 来保证它是 undefined.

    令人惊讶的是所有的没有初始化对象都相等…

    var x
    // undefined
    x
    // undefined
    var y
    // undefined
    x === y
    // true
    var undefined
    // undefined
    x === undefined
    // true
    
  • hasOwnProperty
  • Object

14 附录 B: 鸡肋 / Bad Parts

  • =====
  • eval
  • continue (?? why)
  • switch fall through
  • block-less statements
  • ++, –
  • bitwise operators
  • function statements versus the function function expression
  • typed wrappers: use [], {}, new, void

15 附录 C: JSLint

  • unreachable code
  • not looked for (不检查的内容): inited or not

16 附录 D: 语法图

17 附录 E: JSON

18 索引

  • 译者说为了方便读者对着索引看原文, 索引不翻译… 这个解释太牵强. 我有原书, 那我也有它的索引啊. 明明是自己懒得生成中文的索引. (或者只能手工, 搞不定)

Author: TANG ZhiXiong

Created: 2018-01-25 Thu 12:45

Emacs 25.3.1 (Org mode 8.2.10)

Validate