<commit_before>![9787111376613](../../../static/img/9787111376613.jpg)

# 《JavaScript权威指南（第6版）》

> 此书大概在2017年3月底看完，这本书非常严谨和基础，所以我的读书笔记基本上都是摘录。

## 第三章：类型、值和变量

- JavaScript的数据类型分为两类：原始类型（primitive type）和对象类型（object type）。
    - 原始类型包括：数字、字符串和布尔值
    - 其中包含两个特殊的原始值：null（空）和 undefined（未定义），它们不是数字、字符串和布尔值。它们通常分别代表各自特殊类型的唯一变量。
- JavaSrcipt中除了数字、字符串、布尔值、null和undefined之外的就是对象了！
    - 对象是属性（property）的集合，每个属性都有“名/值对”构成
    - 其中又一个比较特殊的对象——全局对象
    - 普通的JavaScript对象是“命名值”的无序集合
    - 特殊对象——数组（array），表是带编号的值得有序集合
    - 特殊对象——函数，具有与它关联的可执行代码的对象，通过调用函数来运行可执行代码，并返回运算结果
- 如果函数用来初始化（new）一个新建的对象，我们称之为构造函数（constructor）
    - 每个构造函数定义了一类（class）对象——由构造函数初始化的对象组合的集合
    - 类可以看做是对象类型的子类型
    - 除了数组类和函数类外，JavaScript还定义了其他三种又用的类：日期类（Date）、正则类（RegExp）和错误类（Error）
- JavaScript的类型可以分为原始类型和对象类型，也可以分为拥有方法的类型和不能拥有方法的类型，同样可分为可变类型和不可变类型。
    - 可变类型的值是可以修改的
    - 对象和数组属于可变类型：JavaScript程序可以更改对象属性值和数组元素的值
    - 数字、布尔值、null和undefined属于不可变类型
    - 字符串属于不可变类型
- 字符串是一组由16位值组成的不可变的有序序列，每个字符通常来自于Unicode字符集。
    - 字符串的长度是其所含有16位置的个数
- null是JavaScript语言的关键字，它表是一个特殊值，常用来描述“空值”。
    - 对null执行typeof运算，结果返回“object”，也就是说可将null人为是一个特殊的对象值，含义是“非对象”。但实际上通常认为null是它自有类型的唯一成员，它可以表是数字、字符串和对象是“无值”的。
- JavaScript还有第二个值类表是值的空缺——undefined。用未定义的值表是更深层次的“空值”。
    - 它是变量的一种取值，表明变量没有初始化
        - 如果要查询的对象属性或数组元素的值时返回undefined，则说明这个属性或元素不存在
        - 如果函数没有返回任何值，则返回undefined
        - 引用没有提供实参的函数形参的值也会得到undefined
        - undefined是预定义的全局变量（它和null不一样，它不是关键字），它的值是“未定义”
        - ECMAScript5中，undefined在该版本中是只读的，使用typeof运算符得到的类型是“undefined”，表明这个值是这个类型的唯一成员
 
----------

## 第七章：数组

- 创建数组
    - 数组直接量： `var empty = []`
    - 构造函数： `var a = new Array()`
 - 使用[]操作符来访问数组的一个元素。请记住，数组是对象的特殊形式。使用防火扩访问数组元素就想用方括号访问对象的属性一样。JavaScript将指定的数字索引转换成字符串（索引值1变成"1"）,然后将其作为属性名来使用。
 - 因为数组索引是对象属性名的一种特殊类型，这意味着JavaScript数组没有“越界”错误的概念。当视图查询任何对象中不存在属性时，不会报错，智慧得到undefined
 - ECMAScript 5中数组可以定义元素的getter和setter方法
 - 稀疏数组是包含从0开始的不连续索引的数组，其length属性值大于元素的个数
 - 当数组直接量中省略值时不会创建稀疏数组，省略的元素在数组中是存在的，其值为undefined。这和数组元素根本不存在有区别，可以用in操作符区别
 - 当省略数组直接量中的值是（`var a = [,]`），这时得到的数组也是稀疏数组省略掉的值是根本不存在的
 - 每个数组都有一个length属性，其值比数组中最大的索引大1
    - 数组长度保证大于它每个元素的索引值，或者在数组中肯定找不到一个元素的索引值大于或等于它的长度。为了维持此规则，数组有两个特殊的行为：1.如果为一个数组元素赋值，它的索引i大于或等于现有数组的长度时，length属性的值将设置为i+1；2.设置length属性为一个小鱼当前长度的非负整数n时，当前数组中那些索引值大于或者等于n的元素将从中被删除
 - 数组方法：
    - join()：Array.join()方法将数组中所有元素都转化为字符串并连接在一起，返回最后生成的字符串
    - reverse()：：Array.reverse()方法将数组中的元素颠倒顺序，并返回逆序的数组
    - sort()：Array.sort()方法将数组中的元素排序并返回排序后的数组，其参数可以是一个比较函数
    - concat()：Array.concat()方法价创建并返回一个新数组，它的元素包括调用conca()的原始数组的元素和concat()的每个参数。如果这些参数自身也是数组，则链接的是数组的元素，而非数组本身。concat()不会递归扁平化数组的数组，也不会修改调用的数组
    - slice()：Array.slice()方法将返回指定数组的一个片段或者子数组。它的两个参数分别指定了片段的开始和结束的位置。返回的数组包含第一个参数指定的位置和所有到但不含第二个参数指定的位置之间的所有数组元素。如果没第二个参数，则表示到数组结尾的所有元素。如果出现负数，则表示相对于数组中最后一个元素的位置。
     - splice()：Array.splice()方法是在数组中插入或删除元素的通用方法。**它会修改调用的数组。**splice()能够从数组中删除元素、插入元素到数组中或者同事完成这两种操作。`splice(插入/删除的起始位置，操作元素的个数)`
    - push()：再数组的尾部添加一个或多个元素，并返回数组新的长度(仅修改原始数组)
    - pop()：删除数组的最后一个元素，减小数组长度并返回它删除的值(仅修改原始数组)
    - unshift()：在数组的头部添加一个或多个元素，并将已存在的元素移动到更高索引的位置来获取足够空间，最后返回数组新的长度
    - shift()：删除数组的第一个元素并将其返回，然后把所有随后的元素下移一个位置来填补数组头部的空缺

### ECMAScript 5中的数组方法：
- forEach()：从头到尾遍历数组，为每个元素调用指定的函数。`data.forEach(value, index, data)`。forEach()无法再所有元素都传递调用的函数钱终止遍历
- map()：将调用数组的每个元素传递给指定的函数，并返回一个数组，它包含该函数的返回值。map()返回的是新数组：它不修改调用的数组。
- filter()：返回的数组元素是调用的数组的一个子集。传递的函数用布尔值判定。如果返回值为true或者能转化为true的值，那么传递给判定函数的元素就是这个子集的成员，它将被添加到一个作为返回值的数组中。它会跳过稀疏数组中缺少的元素，它返回的数组总是稠密的
- ervry()：当且仅当针对数组中的所有元素调用判定函数都返回true时，其返回true
- some()：当数组中至少又一个元素调用判定函数发回true，它就返回true；并且当且仅当数组中所有元素调用判定函数都返回false时，它才返回false
- reduce()：其接收两个参数：简化操作的函数和(可选)传递给函数的初始值。当不指定初始化调用reduce()时，它将使用数组的第一个元素作为其初始值
- reduceRight()：和reduce()原理一样，但操作数组索引是从高到低。

```javascript
var a = [2,3,4]; //计算2^(3^4)。乘方操作的优先顺序是从右至左
var big = a.reduceRight(function(accumulator, value) {
                                    return Math.pow(value, accumulator);
                                });
// 第一此调用简化函数时：没初始值，固4放acc，3放value。等于3^4；
// 第二次调用时：acc就为3^4，value为2，则等于2^(3^4)
```
- indexOf()和lastIndexOf()：搜索整个数组中具有给定值的元素，返回找到的第一个元素的索引或者没有找到就返回-1.indexOf()是从头至尾搜索，而lastIndexOf()则反向搜索
- 数组类型：

----------

## 第九章：类和模块

- modules
- JavaScript中java式的类继承
    - 实例字段：它们是基于实例的属性或变了，用以保存独立对象的状态；
    - 实例方法：它们是类的所有实例所共享的方法，由没个独立的实例调用；
    - 类字段：这些属性或变量属于类的，而不是属于类的某个实例的；
    - 类方法：这些方法是属于类的，而不是属于类的某个实例的。

----------

## 第十章：正则表达式的匹配模式

- 正则表达式的选择、分组和引用字符
    - | ： 选择，匹配的是该符号左边的自表达式或右边的子表达式
    - (...) : 组合，将几个项组合为一个单元，这个单元可以通过"*"，"+"，"?"和"!"等符号加以修饰，而且可以记住和这个组合相匹配的字符串供此后的引用使用
    - (?:...)：只组合，把项组合到一个单元，但不记忆该组相匹配的字符
- 正则表达式中的锚字符
    - ^ ： 匹配字符串的开头，再多行检索中，匹配一行的开头
    - $ ： 匹配字符串的结尾，再多行检索中，匹配一行的结尾
    - \b： 匹配一个单词的边界，简言之，就是位于字符串\w和\W之间的位置，或位于字符\w和字符串的开头或者结尾之间的位置（但需要注意，[\b]匹配的是退格符）
    - \B： 匹配费单词边界的位置
    - (?=p)：零宽正向先行断言，要求接下来的字符串都与p匹配，但不能跑酷哦匹配p的那些字符
    - (?!p)：零宽负向先行断言，要求接下来的字符不与p匹配
- 正则表达式修饰符
    - i ： 执行不区分大小写的匹配
    - g ： 执行一个全局匹配，简言之，即找到所有的匹配，而不是在找打第一个之后就停止
    - m ： 多行匹配模式，^匹配一行的开头和字符串的开头，$匹配航的结束和字符串的结束 

----------

## 第十二章：服务端JavaScript

- 由于Node的函数和方法都是异步的，因此当他们等待运算完成时并不产生阻塞。非阻塞方法的返回值无法返回异步运算的结果给你。如果你想获取结果，或者想知道完成运算的时间，当结果准备好或完成运算（或发生错误）时，就必须提供Node能调用的一个函数（callback）。

----------

## 第十三章：客服端JavaScript

- JavaScript程序的执行有两个阶段。在第一个阶段，载入文档内容，并执行<script>元素里的代码（包括内敛脚本和外部脚本）。当文档载入完毕，并且所有脚本执行完毕后，JavaScript执行就进入它的第二个阶段。这个阶段是异步的。在事件驱动阶段，Web浏览器调用事件处理程序函数（由第一阶段里执行的脚本制定的HTML时间处理程序，或之前调用的事件处理程序来定义），来响应异步发生的事情。调用时间处理程序通常是响应用户输入，但还可以由网络活动，运行时间或JavaScript代码中的错误触发。
- 事件驱动阶段里发生的第一个事件就是window.onload事件，只是文档已经完全载入，并可以操作。

----------

## 第十五章：脚本化文档

- 每个Window对象又一个document属性引用了Document。<commit_msg>fixed 《JavaScript权威指南（第6版）》typo<commit_after>![9787111376613](../../../static/img/9787111376613.jpg)

# 《JavaScript权威指南（第6版）》

> 此书大概在2017年3月底看完，这本书非常严谨和基础，所以我的读书笔记基本上都是摘录。

## 第三章：类型、值和变量

- JavaScript的数据类型分为两类：原始类型（primitive type）和对象类型（object type）。
    - 原始类型包括：数字、字符串和布尔值
    - 其中包含两个特殊的原始值：null（空）和 undefined（未定义），它们不是数字、字符串和布尔值。它们通常分别代表各自特殊类型的唯一变量。
- JavaSrcipt中除了数字、字符串、布尔值、null和undefined之外的就是对象了！
    - 对象是属性（property）的集合，每个属性都有“名/值对”构成
    - 其中又一个比较特殊的对象——全局对象
    - 普通的JavaScript对象是“命名值”的无序集合
    - 特殊对象——数组（array），表是带编号的值得有序集合
    - 特殊对象——函数，具有与它关联的可执行代码的对象，通过调用函数来运行可执行代码，并返回运算结果
- 如果函数用来初始化（new）一个新建的对象，我们称之为构造函数（constructor）
    - 每个构造函数定义了一类（class）对象——由构造函数初始化的对象组合的集合
    - 类可以看做是对象类型的子类型
    - 除了数组类和函数类外，JavaScript还定义了其他三种又用的类：日期类（Date）、正则类（RegExp）和错误类（Error）
- JavaScript的类型可以分为原始类型和对象类型，也可以分为拥有方法的类型和不能拥有方法的类型，同样可分为可变类型和不可变类型。
    - 可变类型的值是可以修改的
    - 对象和数组属于可变类型：JavaScript程序可以更改对象属性值和数组元素的值
    - 数字、布尔值、null和undefined属于不可变类型
    - 字符串属于不可变类型
- 字符串是一组由16位值组成的不可变的有序序列，每个字符通常来自于Unicode字符集。
    - 字符串的长度是其所含有16位置的个数
- null是JavaScript语言的关键字，它表是一个特殊值，常用来描述“空值”。
    - 对null执行typeof运算，结果返回“object”，也就是说可将null人为是一个特殊的对象值，含义是“非对象”。但实际上通常认为null是它自有类型的唯一成员，它可以表是数字、字符串和对象是“无值”的。
- JavaScript还有第二个值类表是值的空缺——undefined。用未定义的值表是更深层次的“空值”。
    - 它是变量的一种取值，表明变量没有初始化
        - 如果要查询的对象属性或数组元素的值时返回undefined，则说明这个属性或元素不存在
        - 如果函数没有返回任何值，则返回undefined
        - 引用没有提供实参的函数形参的值也会得到undefined
        - undefined是预定义的全局变量（它和null不一样，它不是关键字），它的值是“未定义”
        - ECMAScript5中，undefined在该版本中是只读的，使用typeof运算符得到的类型是“undefined”，表明这个值是这个类型的唯一成员
 
----------

## 第七章：数组

- 创建数组
    - 数组直接量： `var empty = []`
    - 构造函数： `var a = new Array()`
 - 使用[]操作符来访问数组的一个元素。请记住，数组是对象的特殊形式。使用防火扩访问数组元素就想用方括号访问对象的属性一样。JavaScript将指定的数字索引转换成字符串（索引值1变成"1"）,然后将其作为属性名来使用。
 - 因为数组索引是对象属性名的一种特殊类型，这意味着JavaScript数组没有“越界”错误的概念。当视图查询任何对象中不存在属性时，不会报错，智慧得到undefined
 - ECMAScript 5中数组可以定义元素的getter和setter方法
 - 稀疏数组是包含从0开始的不连续索引的数组，其length属性值大于元素的个数
 - 当数组直接量中省略值时不会创建稀疏数组，省略的元素在数组中是存在的，其值为undefined。这和数组元素根本不存在有区别，可以用in操作符区别
 - 当省略数组直接量中的值是（`var a = [,]`），这时得到的数组也是稀疏数组省略掉的值是根本不存在的
 - 每个数组都有一个length属性，其值比数组中最大的索引大1
    - 数组长度保证大于它每个元素的索引值，或者在数组中肯定找不到一个元素的索引值大于或等于它的长度。为了维持此规则，数组有两个特殊的行为：1.如果为一个数组元素赋值，它的索引i大于或等于现有数组的长度时，length属性的值将设置为i+1；2.设置length属性为一个小鱼当前长度的非负整数n时，当前数组中那些索引值大于或者等于n的元素将从中被删除
 - 数组方法：
    - join()：Array.join()方法将数组中所有元素都转化为字符串并连接在一起，返回最后生成的字符串
    - reverse()：：Array.reverse()方法将数组中的元素颠倒顺序，并返回逆序的数组
    - sort()：Array.sort()方法将数组中的元素排序并返回排序后的数组，其参数可以是一个比较函数
    - concat()：Array.concat()方法价创建并返回一个新数组，它的元素包括调用conca()的原始数组的元素和concat()的每个参数。如果这些参数自身也是数组，则链接的是数组的元素，而非数组本身。concat()不会递归扁平化数组的数组，也不会修改调用的数组
    - slice()：Array.slice()方法将返回指定数组的一个片段或者子数组。它的两个参数分别指定了片段的开始和结束的位置。返回的数组包含第一个参数指定的位置和所有到但不含第二个参数指定的位置之间的所有数组元素。如果没第二个参数，则表示到数组结尾的所有元素。如果出现负数，则表示相对于数组中最后一个元素的位置。
     - splice()：Array.splice()方法是在数组中插入或删除元素的通用方法。**它会修改调用的数组。**splice()能够从数组中删除元素、插入元素到数组中或者同事完成这两种操作。`splice(插入/删除的起始位置，操作元素的个数)`
    - push()：再数组的尾部添加一个或多个元素，并返回数组新的长度(仅修改原始数组)
    - pop()：删除数组的最后一个元素，减小数组长度并返回它删除的值(仅修改原始数组)
    - unshift()：在数组的头部添加一个或多个元素，并将已存在的元素移动到更高索引的位置来获取足够空间，最后返回数组新的长度
    - shift()：删除数组的第一个元素并将其返回，然后把所有随后的元素下移一个位置来填补数组头部的空缺

### ECMAScript 5中的数组方法：
- forEach()：从头到尾遍历数组，为每个元素调用指定的函数。`data.forEach(value, index, data)`。forEach()无法再所有元素都传递调用的函数钱终止遍历
- map()：将调用数组的每个元素传递给指定的函数，并返回一个数组，它包含该函数的返回值。map()返回的是新数组：它不修改调用的数组。
- filter()：返回的数组元素是调用的数组的一个子集。传递的函数用布尔值判定。如果返回值为true或者能转化为true的值，那么传递给判定函数的元素就是这个子集的成员，它将被添加到一个作为返回值的数组中。它会跳过稀疏数组中缺少的元素，它返回的数组总是稠密的
- ervry()：当且仅当针对数组中的所有元素调用判定函数都返回true时，其返回true
- some()：当数组中至少又一个元素调用判定函数发回true，它就返回true；并且当且仅当数组中所有元素调用判定函数都返回false时，它才返回false
- reduce()：其接收两个参数：简化操作的函数和(可选)传递给函数的初始值。当不指定初始化调用reduce()时，它将使用数组的第一个元素作为其初始值
- reduceRight()：和reduce()原理一样，但操作数组索引是从高到低。

```javascript
var a = [2,3,4]; //计算2^(3^4)。乘方操作的优先顺序是从右至左
var big = a.reduceRight(function(accumulator, value) {
                                    return Math.pow(value, accumulator);
                                });
// 第一此调用简化函数时：没初始值，固4放acc，3放value。等于3^4；
// 第二次调用时：acc就为3^4，value为2，则等于2^(3^4)
```
- indexOf()和lastIndexOf()：搜索整个数组中具有给定值的元素，返回找到的第一个元素的索引或者没有找到就返回-1.indexOf()是从头至尾搜索，而lastIndexOf()则反向搜索
- 数组类型：

----------

## 第九章：类和模块

- modules
- JavaScript中java式的类继承
    - 实例字段：它们是基于实例的属性或变了，用以保存独立对象的状态；
    - 实例方法：它们是类的所有实例所共享的方法，由没个独立的实例调用；
    - 类字段：这些属性或变量属于类的，而不是属于类的某个实例的；
    - 类方法：这些方法是属于类的，而不是属于类的某个实例的。

----------

## 第十章：正则表达式的匹配模式

- 正则表达式的选择、分组和引用字符
    - | ： 选择，匹配的是该符号左边的自表达式或右边的子表达式
    - (...) : 组合，将几个项组合为一个单元，这个单元可以通过"*"，"+"，"?"和"!"等符号加以修饰，而且可以记住和这个组合相匹配的字符串供此后的引用使用
    - (?:...)：只组合，把项组合到一个单元，但不记忆该组相匹配的字符
- 正则表达式中的锚字符
    - ^ ： 匹配字符串的开头，再多行检索中，匹配一行的开头
    - $ ： 匹配字符串的结尾，再多行检索中，匹配一行的结尾
    - \b： 匹配一个单词的边界，简言之，就是位于字符串\w和\W之间的位置，或位于字符\w和字符串的开头或者结尾之间的位置（但需要注意，[\b]匹配的是退格符）
    - \B： 匹配费单词边界的位置
    - (?=p)：零宽正向先行断言，要求接下来的字符串都与p匹配，但不能跑酷哦匹配p的那些字符
    - (?!p)：零宽负向先行断言，要求接下来的字符不与p匹配
- 正则表达式修饰符
    - i ： 执行不区分大小写的匹配
    - g ： 执行一个全局匹配，简言之，即找到所有的匹配，而不是在找打第一个之后就停止
    - m ： 多行匹配模式，^匹配一行的开头和字符串的开头，$匹配航的结束和字符串的结束 

----------

## 第十二章：服务端JavaScript

- 由于Node的函数和方法都是异步的，因此当他们等待运算完成时并不产生阻塞。非阻塞方法的返回值无法返回异步运算的结果给你。如果你想获取结果，或者想知道完成运算的时间，当结果准备好或完成运算（或发生错误）时，就必须提供Node能调用的一个函数（callback）。

----------

## 第十三章：客服端JavaScript

- JavaScript程序的执行有两个阶段。在第一个阶段，载入文档内容，并执行`<script>`元素里的代码（包括内敛脚本和外部脚本）。当文档载入完毕，并且所有脚本执行完毕后，JavaScript执行就进入它的第二个阶段。这个阶段是异步的。在事件驱动阶段，Web浏览器调用事件处理程序函数（由第一阶段里执行的脚本制定的HTML时间处理程序，或之前调用的事件处理程序来定义），来响应异步发生的事情。调用时间处理程序通常是响应用户输入，但还可以由网络活动，运行时间或JavaScript代码中的错误触发。
- 事件驱动阶段里发生的第一个事件就是window.onload事件，只是文档已经完全载入，并可以操作。

----------

## 第十五章：脚本化文档

- 每个Window对象又一个document属性引用了Document。
{'fraction_non_alphanumeric': 0.1310909090909091, 'fraction_numerical': 0.011545454545454546, 'mean_word_length': 6.134241245136187, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 7, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '394571', 'n_tokens_mistral': 8515, 'n_tokens_neox': 9695, 'n_words': 260}