JavaScript: The Good Parts
Table of Contents
- 1. ☰
- 1.1. Meta Notes
- 1.2. Books
- 1.2.1. DONE Combo #1
- 1.2.2. INPROGRESS Combo #2
- 1.2.3. DONE JavaScript: The Good Parts
- 1.2.4. DONE Domain Specific Languages
- 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
- 1.2.10. INPROGRESS ng-book2
- 1.2.11. INPROGRESS Combo #3: SLAM
- 2. 前言 / Preface
- 3. 第 1 章 精华 / Good Parts
- 4. 第 2 章 语法 / Grammer
- 5. 第 3 章 对象 / Objects
- 6. 第 4 章 函数 / Functions
- 6.1. 函数对象 / Function Objects
- 6.2. 函数字面量 / Function Literals
- 6.3. 调用 / Invocation best
- 6.4. 参数 / Arguments
- 6.5. 返回 / Return
- 6.6. 异常 / Exceptions
- 6.7. 给类型增加方法 / Augmenting Types
- 6.8. 递归 / Recursion
- 6.9. 作用域 / Scope
- 6.10. 闭包 / Closure
- 6.11. 回调 / Callbacks
- 6.12. 模块 / Module
- 6.13. 级联 / Cascade
- 6.14. 科里化 / Curry
- 6.15. 记忆 / Memoization
- 7. 第 5 章 继承 / Inheritance
- 8. 第 6 章 数组 / Arrays
- 9. 第 7 章 正则表达式 / Regular Expressions
- 10. TODO 第 8 章 方法
- 11. 第 9 章 代码风格 / Style
- 12. 第 10 章 优美的特性 / Beautiful Features
- 13. 附录 A: 毒瘤 / Awful Parts
- 14. 附录 B: 鸡肋 / Bad Parts
- 15. 附录 C: JSLint
- 16. 附录 D: 语法图
- 17. 附录 E: JSON
- 18. 索引
1 ☰
1.1 Meta Notes
1.2 Books
1.2.1 DONE Combo #1
1.2.3 DONE JavaScript: The Good Parts
1.2.4 DONE Domain Specific Languages
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
1.2.10 INPROGRESS ng-book2
1.2.11 INPROGRESS Combo #3: SLAM
2 前言 / Preface
- Douglas Crockford
- JavaScript: The Good Parts
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 toundefined
), 如果是数组, 形成空洞
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 索引
- 译者说为了方便读者对着索引看原文, 索引不翻译… 这个解释太牵强. 我有原书, 那我也有它的索引啊. 明明是自己懒得生成中文的索引. (或者只能手工, 搞不定)