From 26a4628dbb7e4d366e2cdfbdf881449a5204edbf Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sat, 26 Sep 2020 10:23:55 +0800 Subject: [PATCH 001/112] docs(stdlib): edit JSON --- docs/stdlib/json.md | 77 ++++++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 33 deletions(-) diff --git a/docs/stdlib/json.md b/docs/stdlib/json.md index b4250aa..dfe1b76 100644 --- a/docs/stdlib/json.md +++ b/docs/stdlib/json.md @@ -59,7 +59,7 @@ JSON 对值的类型和格式有严格的规定。 ### 基本用法 -`JSON.stringify`方法用于将一个值转为 JSON 字符串。该字符串符合 JSON 格式,并且可以被`JSON.parse`方法还原。 +`JSON.stringify()`方法用于将一个值转为 JSON 字符串。该字符串符合 JSON 格式,并且可以被`JSON.parse()`方法还原。 ```javascript JSON.stringify('abc') // ""abc"" @@ -93,7 +93,7 @@ JSON.stringify('false') // "\"false\"" 上面代码中,如果不是内层的双引号,将来还原的时候,引擎就无法知道原始值是布尔值还是字符串。 -如果对象的属性是`undefined`、函数或 XML 对象,该属性会被`JSON.stringify`过滤。 +如果对象的属性是`undefined`、函数或 XML 对象,该属性会被`JSON.stringify()`过滤。 ```javascript var obj = { @@ -121,7 +121,7 @@ JSON.stringify(arr) // "[null,null]" JSON.stringify(/foo/) // "{}" ``` -`JSON.stringify`方法会忽略对象的不可遍历的属性。 +`JSON.stringify()`方法会忽略对象的不可遍历的属性。 ```javascript var obj = {}; @@ -143,7 +143,7 @@ JSON.stringify(obj); // "{"foo":1}" ### 第二个参数 -`JSON.stringify`方法还可以接受一个数组,作为第二个参数,指定需要转成字符串的属性。 +`JSON.stringify()`方法还可以接受一个数组,作为第二个参数,指定参数对象的哪些属性需要转成字符串。 ```javascript var obj = { @@ -158,7 +158,7 @@ JSON.stringify(obj, selectedProperties) // "{"prop1":"value1","prop2":"value2"}" ``` -上面代码中,`JSON.stringify`方法的第二个参数指定,只转`prop1`和`prop2`两个属性。 +上面代码中,`JSON.stringify()`方法的第二个参数指定,只转`prop1`和`prop2`两个属性。 这个类似白名单的数组,只对对象的属性有效,对数组无效。 @@ -172,7 +172,7 @@ JSON.stringify({0: 'a', 1: 'b'}, ['0']) 上面代码中,第二个参数指定 JSON 格式只转`0`号属性,实际上对数组是无效的,只对对象有效。 -第二个参数还可以是一个函数,用来更改`JSON.stringify`的返回值。 +第二个参数还可以是一个函数,用来更改`JSON.stringify()`的返回值。 ```javascript function f(key, value) { @@ -191,26 +191,26 @@ JSON.stringify({ a: 1, b: 2 }, f) 注意,这个处理函数是递归处理所有的键。 ```javascript -var o = {a: {b: 1}}; +var obj = {a: {b: 1}}; function f(key, value) { console.log("["+ key +"]:" + value); return value; } -JSON.stringify(o, f) +JSON.stringify(obj, f) // []:[object Object] // [a]:[object Object] // [b]:1 // '{"a":{"b":1}}' ``` -上面代码中,对象`o`一共会被`f`函数处理三次,最后那行是`JSON.stringify`的输出。第一次键名为空,键值是整个对象`o`;第二次键名为`a`,键值是`{b: 1}`;第三次键名为`b`,键值为1。 +上面代码中,对象`obj`一共会被`f`函数处理三次,输出的最后那行是`JSON.stringify()`的默认输出。第一次键名为空,键值是整个对象`obj`;第二次键名为`a`,键值是`{b: 1}`;第三次键名为`b`,键值为1。 递归处理中,每一次处理的对象,都是前一次返回的值。 ```javascript -var o = {a: 1}; +var obj = {a: 1}; function f(key, value) { if (typeof value === 'object') { @@ -219,11 +219,11 @@ function f(key, value) { return value * 2; } -JSON.stringify(o, f) +JSON.stringify(obj, f) // "{"b": 4}" ``` -上面代码中,`f`函数修改了对象`o`,接着`JSON.stringify`方法就递归处理修改后的对象`o`。 +上面代码中,`f`函数修改了对象`obj`,接着`JSON.stringify()`方法就递归处理修改后的对象`obj`。 如果处理函数返回`undefined`或没有返回值,则该属性会被忽略。 @@ -243,7 +243,26 @@ JSON.stringify({ a: "abc", b: 123 }, f) ### 第三个参数 -`JSON.stringify`还可以接受第三个参数,用于增加返回的 JSON 字符串的可读性。如果是数字,表示每个属性前面添加的空格(最多不超过10个);如果是字符串(不超过10个字符),则该字符串会添加在每行前面。 +`JSON.stringify()`还可以接受第三个参数,用于增加返回的 JSON 字符串的可读性。 + +默认返回的是单行字符串,对于大型的 JSON 对象,可读性非常差。第三个参数使得每个属性单独占据一行,并且将每个属性前面添加指定的前缀(不超过10个字符)。 + +```javascript +// 默认输出 +JSON.stringify({ p1: 1, p2: 2 }) +// JSON.stringify({ p1: 1, p2: 2 }) + +// 分行输出 +JSON.stringify({ p1: 1, p2: 2 }, null, '\t') +// { +// "p1": 1, +// "p2": 2 +// } +``` + +上面例子中,第三个属性`\t`在每个属性前面添加一个制表符,然后分行显示。 + +第三个属性如果是一个数字,则表示每个属性前面添加的空格(最多不超过10个)。 ```javascript JSON.stringify({ p1: 1, p2: 2 }, null, 2); @@ -253,19 +272,11 @@ JSON.stringify({ p1: 1, p2: 2 }, null, 2); "p2": 2 }" */ - -JSON.stringify({ p1:1, p2:2 }, null, '|-'); -/* -"{ -|-"p1": 1, -|-"p2": 2 -}" -*/ ``` -### 参数对象的 toJSON 方法 +### 参数对象的 toJSON() 方法 -如果参数对象有自定义的`toJSON`方法,那么`JSON.stringify`会使用这个方法的返回值作为参数,而忽略原对象的其他属性。 +如果参数对象有自定义的`toJSON()`方法,那么`JSON.stringify()`会使用这个方法的返回值作为参数,而忽略原对象的其他属性。 下面是一个普通的对象。 @@ -283,7 +294,7 @@ JSON.stringify(user) // "{"firstName":"三","lastName":"张","fullName":"张三"}" ``` -现在,为这个对象加上`toJSON`方法。 +现在,为这个对象加上`toJSON()`方法。 ```javascript var user = { @@ -305,9 +316,9 @@ JSON.stringify(user) // "{"name":"张三"}" ``` -上面代码中,`JSON.stringify`发现参数对象有`toJSON`方法,就直接使用这个方法的返回值作为参数,而忽略原对象的其他参数。 +上面代码中,`JSON.stringify()`发现参数对象有`toJSON()`方法,就直接使用这个方法的返回值作为参数,而忽略原对象的其他参数。 -`Date`对象就有一个自己的`toJSON`方法。 +`Date`对象就有一个自己的`toJSON()`方法。 ```javascript var date = new Date('2015-01-01'); @@ -315,9 +326,9 @@ date.toJSON() // "2015-01-01T00:00:00.000Z" JSON.stringify(date) // ""2015-01-01T00:00:00.000Z"" ``` -上面代码中,`JSON.stringify`发现处理的是`Date`对象实例,就会调用这个实例对象的`toJSON`方法,将该方法的返回值作为参数。 +上面代码中,`JSON.stringify()`发现处理的是`Date`对象实例,就会调用这个实例对象的`toJSON()`方法,将该方法的返回值作为参数。 -`toJSON`方法的一个应用是,将正则对象自动转为字符串。因为`JSON.stringify`默认不能转换正则对象,但是设置了`toJSON`方法以后,就可以转换正则对象了。 +`toJSON()`方法的一个应用是,将正则对象自动转为字符串。因为`JSON.stringify()`默认不能转换正则对象,但是设置了`toJSON()`方法以后,就可以转换正则对象了。 ```javascript var obj = { @@ -336,7 +347,7 @@ JSON.stringify(/foo/) // ""/foo/"" ## JSON.parse() -`JSON.parse`方法用于将 JSON 字符串转换成对应的值。 +`JSON.parse()`方法用于将 JSON 字符串转换成对应的值。 ```javascript JSON.parse('{}') // {} @@ -349,7 +360,7 @@ var o = JSON.parse('{"name": "张三"}'); o.name // 张三 ``` -如果传入的字符串不是有效的 JSON 格式,`JSON.parse`方法将报错。 +如果传入的字符串不是有效的 JSON 格式,`JSON.parse()`方法将报错。 ```javascript JSON.parse("'String'") // illegal single quotes @@ -358,7 +369,7 @@ JSON.parse("'String'") // illegal single quotes 上面代码中,双引号字符串中是一个单引号字符串,因为单引号字符串不符合 JSON 格式,所以报错。 -为了处理解析错误,可以将`JSON.parse`方法放在`try...catch`代码块中。 +为了处理解析错误,可以将`JSON.parse()`方法放在`try...catch`代码块中。 ```javascript try { @@ -368,7 +379,7 @@ try { } ``` -`JSON.parse`方法可以接受一个处理函数,作为第二个参数,用法与`JSON.stringify`方法类似。 +`JSON.parse()`方法可以接受一个处理函数,作为第二个参数,用法与`JSON.stringify()`方法类似。 ```javascript function f(key, value) { @@ -382,7 +393,7 @@ JSON.parse('{"a": 1, "b": 2}', f) // {a: 11, b: 2} ``` -上面代码中,`JSON.parse`的第二个参数是一个函数,如果键名是`a`,该函数会将键值加上10。 +上面代码中,`JSON.parse()`的第二个参数是一个函数,如果键名是`a`,该函数会将键值加上10。 ## 参考链接 From f86175c4daedbc6806c261baa44ac61a3f51a37d Mon Sep 17 00:00:00 2001 From: Jacty Date: Sun, 27 Sep 2020 16:08:10 +0800 Subject: [PATCH 002/112] Typo typo --- docs/types/function.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/types/function.md b/docs/types/function.md index 70c41ee..6144979 100644 --- a/docs/types/function.md +++ b/docs/types/function.md @@ -828,7 +828,7 @@ f // 1 (function(){ /* code */ })(); ``` -上面两种写法都是以圆括号开头,引擎就会认为后面跟的是一个表示式,而不是函数定义语句,所以就避免了错误。这就叫做“立即调用的函数表达式”(Immediately-Invoked Function Expression),简称 IIFE。 +上面两种写法都是以圆括号开头,引擎就会认为后面跟的是一个表达式,而不是函数定义语句,所以就避免了错误。这就叫做“立即调用的函数表达式”(Immediately-Invoked Function Expression),简称 IIFE。 注意,上面两种写法最后的分号都是必须的。如果省略分号,遇到连着两个 IIFE,可能就会报错。 From 8259709a2668dd59ba01391967ecbeb5f242b9f6 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sun, 27 Sep 2020 18:55:32 +0800 Subject: [PATCH 003/112] docs(types/function): fix typo --- docs/types/function.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/types/function.md b/docs/types/function.md index 6144979..6792f03 100644 --- a/docs/types/function.md +++ b/docs/types/function.md @@ -816,11 +816,11 @@ var f = function f(){ return 1}(); f // 1 ``` -上面的代码中,函数定义后直接加圆括号调用,没有报错。原因就是`function`作为表达式,引擎就把函数定义当作一个值。这种情况下,就不会报错 +上面的代码中,函数定义后直接加圆括号调用,没有报错。原因就是`function`作为表达式,引擎就把函数定义当作一个值。这种情况下,就不会报错。 为了避免解析的歧义,JavaScript 规定,如果`function`关键字出现在行首,一律解释成语句。因此,引擎看到行首是`function`关键字之后,认为这一段都是函数的定义,不应该以圆括号结尾,所以就报错了。 -解决方法就是不要让`function`出现在行首,让引擎将其理解成一个表达式。最简单的处理,就是将其放在一个圆括号里面。 +函数定义后立即调用的解决方法,就是不要让`function`出现在行首,让引擎将其理解成一个表达式。最简单的处理,就是将其放在一个圆括号里面。 ```javascript (function(){ /* code */ }()); From aa04c24e40cd52184220467115dd674aaed2e636 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sun, 27 Sep 2020 19:09:14 +0800 Subject: [PATCH 004/112] docs(types/function): fix #188 --- docs/types/function.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/types/function.md b/docs/types/function.md index 6792f03..82c3e0c 100644 --- a/docs/types/function.md +++ b/docs/types/function.md @@ -695,7 +695,7 @@ f1() // 999 上面代码中,函数`f1`可以读取全局变量`n`。 -但是,函数外部无法读取函数内部声明的变量。 +但是,正常情况下,函数外部无法读取函数内部声明的变量。 ```javascript function f1() { From f53a87adc2064aa43300c44a7b182991b305c819 Mon Sep 17 00:00:00 2001 From: None Date: Thu, 1 Oct 2020 20:06:24 +0800 Subject: [PATCH 005/112] Update event.md docs(events): fix typo --- docs/events/event.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/events/event.md b/docs/events/event.md index e7576c5..57c33c7 100644 --- a/docs/events/event.md +++ b/docs/events/event.md @@ -114,7 +114,7 @@ if (event.defaultPrevented) { ### Event.currentTarget,Event.target -事件发生以后,会经过捕获和冒泡两个阶段,依次通过多个 DOM 节点。因此,任意时点都有两个与事件相关的节点,一个是事件的原始触发节点(`Event.target`),另一个是事件当前正在通过的节点(`Event.currentTarget`)。前者通常是后者的后代节点。 +事件发生以后,会经过捕获和冒泡两个阶段,依次通过多个 DOM 节点。因此,任意事件都有两个与事件相关的节点,一个是事件的原始触发节点(`Event.target`),另一个是事件当前正在通过的节点(`Event.currentTarget`)。前者通常是后者的后代节点。 `Event.currentTarget`属性返回事件当前所在的节点,即事件当前正在通过的节点,也就是当前正在执行的监听函数所在的那个节点。随着事件的传播,这个属性的值会变。 From f0cdffa3c131c617b8d794d2b4ea7b560ce9e546 Mon Sep 17 00:00:00 2001 From: None Date: Fri, 2 Oct 2020 18:21:47 +0800 Subject: [PATCH 006/112] Update drag.md docs(events): fix typo --- docs/events/drag.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/events/drag.md b/docs/events/drag.md index 8764a86..4310edb 100644 --- a/docs/events/drag.md +++ b/docs/events/drag.md @@ -283,7 +283,7 @@ function doDragOver(event) { } ``` -上面代码中,只有当被拖拉的节点是一个链接时,才允许在当前节点放下。 +上面代码中,只有当被拖拉的节点有一个是链接时,才允许在当前节点放下。 ### DataTransfer.items From df48e91614df0d52125284be7f371e4d6df0d4ed Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sat, 3 Oct 2020 19:53:16 +0800 Subject: [PATCH 007/112] docs(event/common): edit throttle() #193 --- docs/events/common.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/events/common.md b/docs/events/common.md index 13bab7f..5ff2d22 100644 --- a/docs/events/common.md +++ b/docs/events/common.md @@ -215,7 +215,7 @@ window.addEventListener('optimizedScroll', function() { }); ``` -上面代码中,`throttle`函数用于控制事件触发频率,`requestAnimationFrame`方法保证每次页面重绘(每秒60次),只会触发一次`scroll`事件的监听函数。也就是说,上面方法将`scroll`事件的触发频率,限制在每秒60次。具体来说,就是`scroll`事件只要频率低于每秒60次,就会触发`optimizedScroll`事件,从而执行`optimizedScroll`事件的监听函数。 +上面代码中,`throttle`函数用于控制事件触发频率,它有一个内部函数`func`,每次`scroll`事件实际上触发的是这个函数。`func`函数内部使用`requestAnimationFrame()`方法,保证只有每次页面重绘时(每秒60次),才可能会触发`optimizedScroll`事件,从而实际上将`scroll`事件转换为`optimizedScroll`事件,触发频率被控制在每秒最多60次。 改用`setTimeout`方法,可以放置更大的时间间隔。 From 2e50838c60be2f731dd873c4da4aa21580d69549 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sat, 3 Oct 2020 20:00:21 +0800 Subject: [PATCH 008/112] docs(events/common): edit throttle() --- docs/events/common.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/events/common.md b/docs/events/common.md index 5ff2d22..7acb5bc 100644 --- a/docs/events/common.md +++ b/docs/events/common.md @@ -206,7 +206,7 @@ window.addEventListener('scroll', callback); obj.addEventListener(type, func); }; - // 将 scroll 事件重定义为 optimizedScroll 事件 + // 将 scroll 事件转为 optimizedScroll 事件 throttle('scroll', 'optimizedScroll'); })(); @@ -215,9 +215,9 @@ window.addEventListener('optimizedScroll', function() { }); ``` -上面代码中,`throttle`函数用于控制事件触发频率,它有一个内部函数`func`,每次`scroll`事件实际上触发的是这个函数。`func`函数内部使用`requestAnimationFrame()`方法,保证只有每次页面重绘时(每秒60次),才可能会触发`optimizedScroll`事件,从而实际上将`scroll`事件转换为`optimizedScroll`事件,触发频率被控制在每秒最多60次。 +上面代码中,`throttle()`函数用于控制事件触发频率,它有一个内部函数`func()`,每次`scroll`事件实际上触发的是这个函数。`func()`函数内部使用`requestAnimationFrame()`方法,保证只有每次页面重绘时(每秒60次),才可能会触发`optimizedScroll`事件,从而实际上将`scroll`事件转换为`optimizedScroll`事件,触发频率被控制在每秒最多60次。 -改用`setTimeout`方法,可以放置更大的时间间隔。 +改用`setTimeout()`方法,可以放置更大的时间间隔。 ```javascript (function() { From 74a452b0929e5a65a8e9203db015451050e5f9bd Mon Sep 17 00:00:00 2001 From: None Date: Thu, 8 Oct 2020 17:16:01 +0800 Subject: [PATCH 009/112] Update window.md docs(bom): fix typo --- docs/bom/window.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/bom/window.md b/docs/bom/window.md index f5eea3b..72df85d 100644 --- a/docs/bom/window.md +++ b/docs/bom/window.md @@ -154,7 +154,7 @@ if (window.parent !== window.top) { `window.innerHeight`和`window.innerWidth`属性,返回网页在当前窗口中可见部分的高度和宽度,即“视口”(viewport)的大小(单位像素)。这两个属性只读。 -用户放大网页的时候(比如将网页从100%的大小放大为200%),这两个属性会变小。因为这时网页的像素大小不变(比如宽度还是960像素),只是每个像素占据的屏幕空间变大了,因为可见部分(视口)就变小了。 +用户放大网页的时候(比如将网页从100%的大小放大为200%),这两个属性会变小。因为这时网页的像素大小不变(比如宽度还是960像素),只是每个像素占据的屏幕空间变大了,因此可见部分(视口)就变小了。 注意,这两个属性值包括滚动条的高度和宽度。 From a4c7ad9f242ac95e5d63fbba9fe23695b3fe2787 Mon Sep 17 00:00:00 2001 From: None Date: Thu, 8 Oct 2020 18:26:57 +0800 Subject: [PATCH 010/112] Update window.md docs(bom): fix typo --- docs/bom/window.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/bom/window.md b/docs/bom/window.md index 72df85d..a012d61 100644 --- a/docs/bom/window.md +++ b/docs/bom/window.md @@ -599,7 +599,7 @@ window.requestAnimationFrame(step); 它跟`window.requestAnimationFrame()`的区别在于,后者指定回调函数在下一次浏览器重排时执行,问题在于下一次重排时,系统资源未必空闲,不一定能保证在16毫秒之内完成;`window.requestIdleCallback()`可以保证回调函数在系统资源空闲时执行。 -该方法接受一个回调函数和一个配置对象作为参数。配置对象可以指定一个推迟执行的最长时间,如果过了这个时间,回调函数不管系统资源有无空虚,都会执行。 +该方法接受一个回调函数和一个配置对象作为参数。配置对象可以指定一个推迟执行的最长时间,如果过了这个时间,回调函数不管系统资源有无空闲,都会执行。 ```javascript window.requestIdleCallback(callback[, options]) From c6b4ccc55d74127b6abfb9794d9dab83cb8719f6 Mon Sep 17 00:00:00 2001 From: None Date: Fri, 9 Oct 2020 09:29:39 +0800 Subject: [PATCH 011/112] Update navigator.md docs(bom): fix typo --- docs/bom/navigator.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/bom/navigator.md b/docs/bom/navigator.md index f703551..f0644e4 100644 --- a/docs/bom/navigator.md +++ b/docs/bom/navigator.md @@ -140,7 +140,7 @@ Screen 对象表示当前窗口所在的屏幕,提供显示设备的信息。` - `Screen.availWidth`:浏览器窗口可用的屏幕宽度(单位像素)。 - `Screen.pixelDepth`:整数,表示屏幕的色彩位数,比如`24`表示屏幕提供24位色彩。 - `Screen.colorDepth`:`Screen.pixelDepth`的别名。严格地说,colorDepth 表示应用程序的颜色深度,pixelDepth 表示屏幕的颜色深度,绝大多数情况下,它们都是同一件事。 -- `Screen.orientation`:返回一个对象,表示屏幕的方向。该对象的`type`属性是一个字符串,表示屏幕的具体方向,`landscape-primary`表示横放,`landscape-secondary`表示颠倒的横放,`portrait-primary`表示竖放,`portrait-secondary`。 +- `Screen.orientation`:返回一个对象,表示屏幕的方向。该对象的`type`属性是一个字符串,表示屏幕的具体方向,`landscape-primary`表示横放,`landscape-secondary`表示颠倒的横放,`portrait-primary`表示竖放,`portrait-secondary`表示颠倒的竖放。 下面是`Screen.orientation`的例子。 From 4e4a5a6c8cf3937caff003ccfc81246efe6219be Mon Sep 17 00:00:00 2001 From: None Date: Sun, 11 Oct 2020 18:53:57 +0800 Subject: [PATCH 012/112] Update webworker.md docs(bom): fix typo --- docs/bom/webworker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/bom/webworker.md b/docs/bom/webworker.md index 7a7f38a..618f197 100644 --- a/docs/bom/webworker.md +++ b/docs/bom/webworker.md @@ -381,7 +381,7 @@ Worker 线程有一些自己的全局属性和方法。 - self.onmessage:指定`message`事件的监听函数。 - self.onmessageerror:指定 messageerror 事件的监听函数。发送的数据无法序列化成字符串时,会触发这个事件。 - self.close():关闭 Worker 线程。 -- self.postMessage():向产生这个 Worker 线程发送消息。 +- self.postMessage():向产生这个 Worker 的线程发送消息。 - self.importScripts():加载 JS 脚本。 (完) From 09f075801a7c994dd3aa6f3729465213028ee838 Mon Sep 17 00:00:00 2001 From: None Date: Sun, 11 Oct 2020 21:43:33 +0800 Subject: [PATCH 013/112] Update input.md docs(elements): fix --- docs/elements/input.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/elements/input.md b/docs/elements/input.md index d64c55a..5d76291 100644 --- a/docs/elements/input.md +++ b/docs/elements/input.md @@ -84,7 +84,7 @@ - `select()`:选中``元素内部的所有文本。该方法不能保证``获得焦点,最好先用`focus()`方法,再用这个方法。 - `click()`:模拟鼠标点击当前的``元素。 - `setSelectionRange()`:选中``元素内部的一段文本,但不会将焦点转移到选中的文本。该方法接受三个参数,第一个参数是开始的位置(从0开始),第二个参数是结束的位置(不包括该位置),第三个参数是可选的,表示选择的方向,有三个可能的值(`forward`、`backward`和默认值`none`)。 -- `setRangeText()`:新文本替换选中的文本。该方法接受四个参数,第一个参数是新文本,第二个参数是替换的开始位置,第三个参数是结束位置,第四个参数表示替换后的行为(可选),有四个可能的值:`select`(选中新插入的文本)、`start`(选中的开始位置移到插入的文本之前)、`end`(选中的文本移到插入的文本之后)、`preserve`(保留原先选中的位置,默认值)。 +- `setRangeText()`:新文本替换选中的文本。该方法接受四个参数,第一个参数是新文本,第二个参数是替换的开始位置,第三个参数是结束位置,第四个参数表示替换后的行为(可选),有四个可能的值:`select`(选中新插入的文本)、`start`(光标位置移到插入的文本之前)、`end`(光标位置移到插入的文本之后)、`preserve`(默认值,如果原先就有文本被选中且本次替换位置与原先选中位置有交集,则被选择的文本为替换后的文本与原先被选择的文本,否则保留原先选中的文本)。 - `setCustomValidity()`:该方法用于自定义校验失败时的报错信息。它的参数就是报错的提示信息。注意,一旦设置了自定义报错信息,该字段就不会校验通过了,因此用户重新输入时,必须将自定义报错信息设为空字符串,请看下面的例子。 - `checkValidity()`:返回一个布尔值,表示当前节点的校验结果。如果返回`false`,表示不满足校验要求,否则就是校验成功或不必校验。 - `stepDown()`:将当前``节点的值减少一个步长。该方法可以接受一个整数`n`作为参数,表示一次性减少`n`个步长,默认是`1`。有几种情况会抛错:当前``节点不适合递减或递增、当前节点没有`step`属性、``节点的值不能转为数字、递减之后的值小于`min`属性或大于`max`属性。 From aa4e3810be90a76071cef0b90027b6de6f89b740 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Fri, 16 Oct 2020 07:56:23 +0800 Subject: [PATCH 014/112] docs(oop/new): fix #200 --- docs/oop/new.md | 2 +- package-lock.json | 99 +++++++++++++++++++---------------------------- 2 files changed, 40 insertions(+), 61 deletions(-) diff --git a/docs/oop/new.md b/docs/oop/new.md index aad7aeb..aa1a8cb 100644 --- a/docs/oop/new.md +++ b/docs/oop/new.md @@ -16,7 +16,7 @@ JavaScript 语言具有很强的面向对象编程能力,本章介绍 JavaScri **(2)对象是一个容器,封装了属性(property)和方法(method)。** -属性是对象的状态,方法是对象的行为(完成某种任务)。比如,我们可以把动物抽象为`animal`对象,使用“属性”记录具体是那一种动物,使用“方法”表示动物的某种行为(奔跑、捕猎、休息等等)。 +属性是对象的状态,方法是对象的行为(完成某种任务)。比如,我们可以把动物抽象为`animal`对象,使用“属性”记录具体是哪一种动物,使用“方法”表示动物的某种行为(奔跑、捕猎、休息等等)。 ## 构造函数 diff --git a/package-lock.json b/package-lock.json index be3471c..176bde4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -73,11 +73,6 @@ } } }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" - }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -94,11 +89,10 @@ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -187,9 +181,9 @@ } }, "cliui": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.1.tgz", - "integrity": "sha512-rcvHOWyGyid6I1WjT/3NatKj2kDt9OdSHSXpyLXaMWFbKpGACNW8pRhhdPUq9MWUOdwn8Rz9AVETjF4105rZZQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.2.tgz", + "integrity": "sha512-lhpKkuUj67j5JgZIPZxLe7nSa4MQoojzRVWQyzMqBp2hBg6gwRjUDAwC1YDeBaC3APDBKNnjWbv2mlDF4XgOSA==", "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -273,11 +267,11 @@ "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==" }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" }, "dependencies": { "ms": { @@ -379,9 +373,9 @@ } }, "escalade": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.0.tgz", - "integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-html": { "version": "1.0.3", @@ -556,9 +550,9 @@ } }, "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" }, "has-flag": { "version": "4.0.0", @@ -571,9 +565,9 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, "highlight.js": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.2.0.tgz", - "integrity": "sha512-OryzPiqqNCfO/wtFo619W+nPYALM6u7iCQkum4bqRmmlcTikOkmlL06i009QelynBPAlNByTQU6cBB2cOBQtCw==" + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.2.1.tgz", + "integrity": "sha512-A+sckVPIb9zQTUydC9lpRX1qRFO/N0OKEh0NwIr65ckvWA/oMY8v9P3+kGRK3w2ULSh9E8v5MszXafodQ6039g==" }, "html-minifier": { "version": "4.0.0", @@ -746,9 +740,9 @@ } }, "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, "log-symbols": { "version": "4.0.0", @@ -814,11 +808,6 @@ "universalify": "^1.0.0" } }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - }, "universalify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", @@ -847,13 +836,6 @@ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "requires": { "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } } }, "markdown-it": { @@ -1151,19 +1133,11 @@ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, "promptly": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/promptly/-/promptly-3.0.3.tgz", - "integrity": "sha512-EWnzOsxVKUjqKeE6SStH1/cO4+DE44QolaoJ4ojGd9z6pcNkpgfJKr1ncwxrOFHSTIzoudo7jG8y0re30/LO1g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/promptly/-/promptly-3.1.0.tgz", + "integrity": "sha512-ygvIcmkt+eWtrQwI1/w7wDfzfAWI7IJX1AUVsWQEQwTmpQ5jeSyiD1g6NuI9VXWhz8LK5a5Bcngp/sKnOgQtiA==", "requires": { - "pify": "^3.0.0", "read": "^1.0.4" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } } }, "query-string": { @@ -1223,6 +1197,11 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, "semver-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", @@ -1448,9 +1427,9 @@ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, "uglify-js": { - "version": "3.10.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.4.tgz", - "integrity": "sha512-kBFT3U4Dcj4/pJ52vfjCSfyLyvG9VYYuGYPmrPvAxRw/i7xHiT4VvCev+uiEMcEEiu6UNB6KgWmGtSUYIWScbw==" + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.11.2.tgz", + "integrity": "sha512-G440NU6fewtnQftSgqRV1r2A5ChKbU1gqFCJ7I8S7MPpY/eZZfLGefaY6gUZYiWebMaO+txgiQ1ZyLDuNWJulg==" }, "universalify": { "version": "0.1.2", @@ -1522,9 +1501,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "y18n": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.1.tgz", - "integrity": "sha512-/jJ831jEs4vGDbYPQp4yGKDYPSCCEQ45uZWJHE1AoYBzqdZi8+LDWas0z4HrmJXmKdpFsTiowSHXdxyFhpmdMg==" + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.2.tgz", + "integrity": "sha512-CkwaeZw6dQgqgPGeTWKMXCRmMcBgETFlTml1+ZOO+q7kGst8NREJ+eWwFNPVUQ4QGdAaklbqCZHH6Zuep1RjiA==" }, "yaml": { "version": "1.10.0", @@ -1546,9 +1525,9 @@ } }, "yargs-parser": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.0.0.tgz", - "integrity": "sha512-8eblPHTL7ZWRkyjIZJjnGf+TijiKJSwA24svzLRVvtgoi/RZiKa9fFQTrlx0OKLnyHSdt/enrdadji6WFfESVA==" + "version": "20.2.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.2.tgz", + "integrity": "sha512-XmrpXaTl6noDsf1dKpBuUNCOHqjs0g3jRMXf/ztRxdOmb+er8kE5z5b55Lz3p5u2T8KJ59ENBnASS8/iapVJ5g==" } } } From 73384a2d47bfe8c919225f44eae68ae75753c4c9 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Fri, 16 Oct 2020 08:01:56 +0800 Subject: [PATCH 015/112] docs(oop/new): edit text --- docs/oop/new.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/oop/new.md b/docs/oop/new.md index aa1a8cb..ae7d32d 100644 --- a/docs/oop/new.md +++ b/docs/oop/new.md @@ -12,7 +12,7 @@ JavaScript 语言具有很强的面向对象编程能力,本章介绍 JavaScri **(1)对象是单个实物的抽象。** -一本书、一辆汽车、一个人都可以是对象,一个数据库、一张网页、一个与远程服务器的连接也可以是对象。当实物被抽象成对象,实物之间的关系就变成了对象之间的关系,从而就可以模拟现实情况,针对对象进行编程。 +一本书、一辆汽车、一个人都可以是对象,一个数据库、一张网页、一个远程服务器连接也可以是对象。当实物被抽象成对象,实物之间的关系就变成了对象之间的关系,从而就可以模拟现实情况,针对对象进行编程。 **(2)对象是一个容器,封装了属性(property)和方法(method)。** @@ -26,7 +26,7 @@ JavaScript 语言具有很强的面向对象编程能力,本章介绍 JavaScri JavaScript 语言使用构造函数(constructor)作为对象的模板。所谓”构造函数”,就是专门用来生成实例对象的函数。它就是对象的模板,描述实例对象的基本结构。一个构造函数,可以生成多个实例对象,这些实例对象都有相同的结构。 -构造函数就是一个普通的函数,但是有自己的特征和用法。 +构造函数就是一个普通的函数,但具有自己的特征和用法。 ```javascript var Vehicle = function () { From 9fe39f1fe22f0ca5f26f547d861c689571735c3c Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sat, 17 Oct 2020 15:20:10 +0800 Subject: [PATCH 016/112] docs(elements): edit input/setRangeText --- docs/elements/input.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/elements/input.md b/docs/elements/input.md index 5d76291..9a04e0e 100644 --- a/docs/elements/input.md +++ b/docs/elements/input.md @@ -84,7 +84,7 @@ - `select()`:选中``元素内部的所有文本。该方法不能保证``获得焦点,最好先用`focus()`方法,再用这个方法。 - `click()`:模拟鼠标点击当前的``元素。 - `setSelectionRange()`:选中``元素内部的一段文本,但不会将焦点转移到选中的文本。该方法接受三个参数,第一个参数是开始的位置(从0开始),第二个参数是结束的位置(不包括该位置),第三个参数是可选的,表示选择的方向,有三个可能的值(`forward`、`backward`和默认值`none`)。 -- `setRangeText()`:新文本替换选中的文本。该方法接受四个参数,第一个参数是新文本,第二个参数是替换的开始位置,第三个参数是结束位置,第四个参数表示替换后的行为(可选),有四个可能的值:`select`(选中新插入的文本)、`start`(光标位置移到插入的文本之前)、`end`(光标位置移到插入的文本之后)、`preserve`(默认值,如果原先就有文本被选中且本次替换位置与原先选中位置有交集,则被选择的文本为替换后的文本与原先被选择的文本,否则保留原先选中的文本)。 +- `setRangeText()`:新文本替换选中的文本。该方法接受四个参数,第一个参数是新文本,第二个参数是替换的开始位置(从`0`开始计算),第三个参数是结束位置(该位置不包括在内),第四个参数表示替换后的行为(可选),有四个可能的值:`select`(选中新插入的文本)、`start`(光标位置移到插入的文本之前)、`end`(光标位置移到插入的文本之后)、`preserve`(默认值,如果原先就有文本被选中且本次替换位置与原先选中位置有交集,则替换后同时选中新插入的文本与原先选中的文本,否则保持原先选中的文本)。 - `setCustomValidity()`:该方法用于自定义校验失败时的报错信息。它的参数就是报错的提示信息。注意,一旦设置了自定义报错信息,该字段就不会校验通过了,因此用户重新输入时,必须将自定义报错信息设为空字符串,请看下面的例子。 - `checkValidity()`:返回一个布尔值,表示当前节点的校验结果。如果返回`false`,表示不满足校验要求,否则就是校验成功或不必校验。 - `stepDown()`:将当前``节点的值减少一个步长。该方法可以接受一个整数`n`作为参数,表示一次性减少`n`个步长,默认是`1`。有几种情况会抛错:当前``节点不适合递减或递增、当前节点没有`step`属性、``节点的值不能转为数字、递减之后的值小于`min`属性或大于`max`属性。 From 96fc3fe99d22d28fba493f98bb909c0413650f02 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sat, 17 Oct 2020 20:10:36 +0800 Subject: [PATCH 017/112] docs(feature/conversion): fix typo #199 --- docs/features/conversion.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/features/conversion.md b/docs/features/conversion.md index deea015..f495f4b 100644 --- a/docs/features/conversion.md +++ b/docs/features/conversion.md @@ -322,13 +322,13 @@ if ('abc') { - [1, 2, 3] // NaN ``` -自动转换的规则是这样的:预期什么类型的值,就调用该类型的转换函数。比如,某个位置预期为字符串,就调用`String`函数进行转换。如果该位置即可以是字符串,也可能是数值,那么默认转为数值。 +自动转换的规则是这样的:预期什么类型的值,就调用该类型的转换函数。比如,某个位置预期为字符串,就调用`String()`函数进行转换。如果该位置既可以是字符串,也可能是数值,那么默认转为数值。 -由于自动转换具有不确定性,而且不易除错,建议在预期为布尔值、数值、字符串的地方,全部使用`Boolean`、`Number`和`String`函数进行显式转换。 +由于自动转换具有不确定性,而且不易除错,建议在预期为布尔值、数值、字符串的地方,全部使用`Boolean()`、`Number()`和`String()`函数进行显式转换。 ### 自动转换为布尔值 -JavaScript 遇到预期为布尔值的地方(比如`if`语句的条件部分),就会将非布尔值的参数自动转换为布尔值。系统内部会自动调用`Boolean`函数。 +JavaScript 遇到预期为布尔值的地方(比如`if`语句的条件部分),就会将非布尔值的参数自动转换为布尔值。系统内部会自动调用`Boolean()`函数。 因此除了以下五个值,其他都是自动转为`true`。 @@ -351,7 +351,7 @@ if ( !undefined } // true ``` -下面两种写法,有时也用于将一个表达式转为布尔值。它们内部调用的也是`Boolean`函数。 +下面两种写法,有时也用于将一个表达式转为布尔值。它们内部调用的也是`Boolean()`函数。 ```javascript // 写法一 @@ -392,7 +392,7 @@ obj.width + 20 // "10020" ### 自动转换为数值 -JavaScript 遇到预期为数值的地方,就会将参数值自动转换为数值。系统内部会自动调用`Number`函数。 +JavaScript 遇到预期为数值的地方,就会将参数值自动转换为数值。系统内部会自动调用`Number()`函数。 除了加法运算符(`+`)有可能把运算子转为字符串,其他运算符都会把运算子自动转成数值。 From 95e0e1ae395ab7dcc1141df2d397c54558d5efc1 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sat, 24 Oct 2020 07:28:50 +0800 Subject: [PATCH 018/112] docs(events): edit paste event --- docs/events/common.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/events/common.md b/docs/events/common.md index 7acb5bc..c1d7b98 100644 --- a/docs/events/common.md +++ b/docs/events/common.md @@ -303,7 +303,15 @@ document.addEventListener('fullscreenchange', function (event) { - `copy`:进行复制动作时触发。 - `paste`:剪贴板内容粘贴到文档后触发。 -这三个事件都是`ClipboardEvent`接口的实例。`ClipboardEvent`有一个实例属性`clipboardData`,是一个 DataTransfer 对象,存放剪贴的数据。具体的 API 接口和操作方法,请参见《拖拉事件》的 DataTransfer 对象部分。 +举例来说,如果希望禁止输入框的粘贴事件,可以使用下面的代码。 + +```javascript +inputElement.addEventListener('paste',e => e.preventDefault()); +``` + +上面的代码使得用户无法在``输入框里面粘贴内容。 + +`cut`、`copy`、`paste`这三个事件的事件对象都是`ClipboardEvent`接口的实例。`ClipboardEvent`有一个实例属性`clipboardData`,是一个 DataTransfer 对象,存放剪贴的数据。具体的 API 接口和操作方法,请参见《拖拉事件》的 DataTransfer 对象部分。 ```javascript document.addEventListener('copy', function (e) { @@ -324,7 +332,7 @@ document.addEventListener('copy', function (e) { - `focusin`:元素节点将要获得焦点时触发,发生在`focus`事件之前。该事件会冒泡。 - `focusout`:元素节点将要失去焦点时触发,发生在`blur`事件之前。该事件会冒泡。 -这四个事件都继承了`FocusEvent`接口。`FocusEvent`实例具有以下属性。 +这四个事件的事件对象都继承了`FocusEvent`接口。`FocusEvent`实例具有以下属性。 - `FocusEvent.target`:事件的目标节点。 - `FocusEvent.relatedTarget`:对于`focusin`事件,返回失去焦点的节点;对于`focusout`事件,返回将要接受焦点的节点;对于`focus`和`blur`事件,返回`null`。 From 025dd71c73eb90c4e6a1508bdb75262deb1dc8ea Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sat, 24 Oct 2020 09:28:38 +0800 Subject: [PATCH 019/112] docs(events): edit paste event --- docs/events/common.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/events/common.md b/docs/events/common.md index c1d7b98..b89f092 100644 --- a/docs/events/common.md +++ b/docs/events/common.md @@ -306,7 +306,7 @@ document.addEventListener('fullscreenchange', function (event) { 举例来说,如果希望禁止输入框的粘贴事件,可以使用下面的代码。 ```javascript -inputElement.addEventListener('paste',e => e.preventDefault()); +inputElement.addEventListener('paste', e => e.preventDefault()); ``` 上面的代码使得用户无法在``输入框里面粘贴内容。 From aaa117a6635c4d588cdb9f6668ecc9c1dcd65798 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Tue, 27 Oct 2020 18:34:45 +0800 Subject: [PATCH 020/112] docs(elements/video): fix #201 --- docs/elements/video.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/elements/video.md b/docs/elements/video.md index 6e62499..1625b70 100644 --- a/docs/elements/video.md +++ b/docs/elements/video.md @@ -66,7 +66,7 @@ - HTMLMediaElement.addTextTrack():添加文本轨道(比如字幕)到媒体文件。 - HTMLMediaElement.captureStream():返回一个 MediaStream 对象,用来捕获当前媒体文件的流内容。 -- HTMLMediaElement.canPlayType():该方法接受一个 MIME 字符串作为参数,用来判断这种类型的媒体文件是否可以播放。该反复返回一个字符串,有三种可能的值,`probably`表示似乎可播放,`maybe`表示无法在不播放的情况下判断是否可播放,空字符串表示无法播放。 +- HTMLMediaElement.canPlayType():该方法接受一个 MIME 字符串作为参数,用来判断这种类型的媒体文件是否可以播放。该方法返回一个字符串,有三种可能的值,`probably`表示似乎可播放,`maybe`表示无法在不播放的情况下判断是否可播放,空字符串表示无法播放。 - HTMLMediaElement.fastSeek():该方法接受一个浮点数作为参数,表示指定的时间(单位秒)。该方法将媒体文件移动到指定时间。 - HTMLMediaElement.load():重新加载媒体文件。 - HTMLMediaElement.pause():暂停播放。该方法没有返回值。 @@ -101,7 +101,7 @@ HTMLVideoElement 接口的属性。 HTMLVideoElement 接口的方法。 -- HTMLVideoElement.getVideoPlaybackQuality():返回一个对象,包含了当前视频回访的一些数据。 +- HTMLVideoElement.getVideoPlaybackQuality():返回一个对象,包含了当前视频回放的一些数据。 ## HTMLAudioElement 接口 @@ -146,8 +146,9 @@ if (a.canPlayType('audio/wav')) { - seeked:`seeking`属性变回`false`时触发。 - ended:媒体文件播放完毕时触发。 - durationchange:`duration`属性变化时触发。 -- volumechange:音量变回或者静音时触发。 +- volumechange:音量变化时触发。 - ratechange:播放速度或默认的播放速度变化时触发。 - abort:停止加载媒体文件时触发,通常是用户主动要求停止下载。 - error:网络或其他原因导致媒体文件无法加载时触发。 - emptied:由于`error`或`abort`事件导致`networkState`属性变成无法获取数据时触发。 + From cce2da1b5191aefc5e7444f08e65954f32de6868 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Tue, 27 Oct 2020 19:05:02 +0800 Subject: [PATCH 021/112] docs(oop/object): edit Object.create() --- docs/oop/object.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/oop/object.md b/docs/oop/object.md index f376b16..a7e0340 100644 --- a/docs/oop/object.md +++ b/docs/oop/object.md @@ -62,7 +62,7 @@ F.call(f); 生成实例对象的常用方法是,使用`new`命令让构造函数返回一个实例。但是很多时候,只能拿到一个实例对象,它可能根本不是由构建函数生成的,那么能不能从一个实例对象,生成另一个实例对象呢? -JavaScript 提供了`Object.create`方法,用来满足这种需求。该方法接受一个对象作为参数,然后以它为原型,返回一个实例对象。该实例完全继承原型对象的属性。 +JavaScript 提供了`Object.create()`方法,用来满足这种需求。该方法接受一个对象作为参数,然后以它为原型,返回一个实例对象。该实例完全继承原型对象的属性。 ```javascript // 原型对象 @@ -80,9 +80,9 @@ B.print() // hello B.print === A.print // true ``` -上面代码中,`Object.create`方法以`A`对象为原型,生成了`B`对象。`B`继承了`A`的所有属性和方法。 +上面代码中,`Object.create()`方法以`A`对象为原型,生成了`B`对象。`B`继承了`A`的所有属性和方法。 -实际上,`Object.create`方法可以用下面的代码代替。 +实际上,`Object.create()`方法可以用下面的代码代替。 ```javascript if (typeof Object.create !== 'function') { @@ -94,7 +94,7 @@ if (typeof Object.create !== 'function') { } ``` -上面代码表明,`Object.create`方法的实质是新建一个空的构造函数`F`,然后让`F.prototype`属性指向参数对象`obj`,最后返回一个`F`的实例,从而实现让该实例继承`obj`的属性。 +上面代码表明,`Object.create()`方法的实质是新建一个空的构造函数`F`,然后让`F.prototype`属性指向参数对象`obj`,最后返回一个`F`的实例,从而实现让该实例继承`obj`的属性。 下面三种方式生成的新对象是等价的。 @@ -104,7 +104,7 @@ var obj2 = Object.create(Object.prototype); var obj3 = new Object(); ``` -如果想要生成一个不继承任何属性(比如没有`toString`和`valueOf`方法)的对象,可以将`Object.create`的参数设为`null`。 +如果想要生成一个不继承任何属性(比如没有`toString()`和`valueOf()`方法)的对象,可以将`Object.create()`的参数设为`null`。 ```javascript var obj = Object.create(null); @@ -113,9 +113,9 @@ obj.valueOf() // TypeError: Object [object Object] has no method 'valueOf' ``` -上面代码中,对象`obj`的原型是`null`,它就不具备一些定义在`Object.prototype`对象上面的属性,比如`valueOf`方法。 +上面代码中,对象`obj`的原型是`null`,它就不具备一些定义在`Object.prototype`对象上面的属性,比如`valueOf()`方法。 -使用`Object.create`方法的时候,必须提供对象原型,即参数不能为空,或者不是对象,否则会报错。 +使用`Object.create()`方法的时候,必须提供对象原型,即参数不能为空,或者不是对象,否则会报错。 ```javascript Object.create() @@ -124,7 +124,7 @@ Object.create(123) // TypeError: Object prototype may only be an Object or null ``` -`Object.create`方法生成的新对象,动态继承了原型。在原型上添加或修改任何方法,会立刻反映在新对象之上。 +`Object.create()`方法生成的新对象,动态继承了原型。在原型上添加或修改任何方法,会立刻反映在新对象之上。 ```javascript var obj1 = { p: 1 }; @@ -136,7 +136,7 @@ obj2.p // 2 上面代码中,修改对象原型`obj1`会影响到实例对象`obj2`。 -除了对象的原型,`Object.create`方法还可以接受第二个参数。该参数是一个属性描述对象,它所描述的对象属性,会添加到实例对象,作为该对象自身的属性。 +除了对象的原型,`Object.create()`方法还可以接受第二个参数。该参数是一个属性描述对象,它所描述的对象属性,会添加到实例对象,作为该对象自身的属性。 ```javascript var obj = Object.create({}, { @@ -160,7 +160,7 @@ obj.p1 = 123; obj.p2 = 'abc'; ``` -`Object.create`方法生成的对象,继承了它的原型对象的构造函数。 +`Object.create()`方法生成的对象,继承了它的原型对象的构造函数。 ```javascript function A() {} From 78e09da825708f2083e1a1a8470e6ac6d96c33d6 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Thu, 5 Nov 2020 22:35:35 +0800 Subject: [PATCH 022/112] docs(oop/prototype/instanceof): fix #203 --- docs/oop/prototype.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/oop/prototype.md b/docs/oop/prototype.md index f01c701..6efc2bb 100644 --- a/docs/oop/prototype.md +++ b/docs/oop/prototype.md @@ -262,7 +262,7 @@ v instanceof Vehicle // true 上面代码中,对象`v`是构造函数`Vehicle`的实例,所以返回`true`。 -`instanceof`运算符的左边是实例对象,右边是构造函数。它会检查右边构建函数的原型对象(prototype),是否在左边对象的原型链上。因此,下面两种写法是等价的。 +`instanceof`运算符的左边是实例对象,右边是构造函数。它会检查右边构造函数的原型对象(prototype),是否在左边对象的原型链上。因此,下面两种写法是等价的。 ```javascript v instanceof Vehicle @@ -270,7 +270,7 @@ v instanceof Vehicle Vehicle.prototype.isPrototypeOf(v) ``` -上面代码中,`Object.prototype.isPrototypeOf`的详细解释见后文。 +上面代码中,`Object`是对象的构造函数,它的原型对象是`Object.prototype`,`isPrototypeOf()`方法用于检查某个对象是否为另一个对象的原型,详细解释见后文。 由于`instanceof`检查整个原型链,因此同一个实例对象,可能会对多个构造函数都返回`true`。 @@ -298,10 +298,10 @@ null instanceof Object // false ```javascript var obj = Object.create(null); typeof obj // "object" -Object.create(null) instanceof Object // false +obj instanceof Object // false ``` -上面代码中,`Object.create(null)`返回一个新对象`obj`,它的原型是`null`(`Object.create`的详细介绍见后文)。右边的构造函数`Object`的`prototype`属性,不在左边的原型链上,因此`instanceof`就认为`obj`不是`Object`的实例。但是,只要一个对象的原型不是`null`,`instanceof`运算符的判断就不会失真。 +上面代码中,`Object.create(null)`返回一个新对象`obj`,它的原型是`null`(`Object.create()`的详细介绍见后文)。右边的构造函数`Object`的`prototype`属性,不在左边的原型链上,因此`instanceof`就认为`obj`不是`Object`的实例。这是唯一的`instanceof`运算符判断会失真的情况(一个对象的原型是`null`)。 `instanceof`运算符的一个用处,是判断值的类型。 From 3898d66a7001e2fc72db7392715af874c2c8ed97 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Fri, 6 Nov 2020 23:20:37 +0800 Subject: [PATCH 023/112] docs(oop/prototype): fix typo --- docs/oop/prototype.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/oop/prototype.md b/docs/oop/prototype.md index 6efc2bb..76077e2 100644 --- a/docs/oop/prototype.md +++ b/docs/oop/prototype.md @@ -270,7 +270,7 @@ v instanceof Vehicle Vehicle.prototype.isPrototypeOf(v) ``` -上面代码中,`Object`是对象的构造函数,它的原型对象是`Object.prototype`,`isPrototypeOf()`方法用于检查某个对象是否为另一个对象的原型,详细解释见后文。 +上面代码中,`Vehicle`是对象`v`的构造函数,它的原型对象是`Vehicle.prototype`,`isPrototypeOf()`方法是 JavaScript 提供的原生方法,用于检查某个对象是否为另一个对象的原型,详细解释见后文。 由于`instanceof`检查整个原型链,因此同一个实例对象,可能会对多个构造函数都返回`true`。 From ce1ed097ff1476a2be8eb5868420fce92171d0a5 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Wed, 2 Dec 2020 04:23:01 +0800 Subject: [PATCH 024/112] docs(dom): edit parentNode --- docs/dom/parentnode.md | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/docs/dom/parentnode.md b/docs/dom/parentnode.md index 1aa2d0c..813ee3e 100644 --- a/docs/dom/parentnode.md +++ b/docs/dom/parentnode.md @@ -54,9 +54,11 @@ document.body.childElementCount // 13 ### ParentNode.append(),ParentNode.prepend() -`append`方法为当前节点追加一个或多个子节点,位置是最后一个元素子节点的后面。 +**(1)ParentNode.append()** -该方法不仅可以添加元素子节点,还可以添加文本子节点。 +`append()`方法为当前节点追加一个或多个子节点,位置是最后一个元素子节点的后面。 + +该方法不仅可以添加元素子节点(参数为元素节点),还可以添加文本子节点(参数为字符串)。 ```javascript var parent = document.body; @@ -78,9 +80,17 @@ var p = document.createElement('p'); parent.append('Hello', p); ``` -注意,该方法没有返回值。 +该方法没有返回值。 + +注意,该方法与`Node.prototype.appendChild()`方法有三点不同。 + +- `append()`允许字符串作为参数,`appendChild()`只允许接受子节点作为参数。 +- `append()`没有返回值,而`appendChild()`返回添加的子节点。 +- `append()`可以附加多个子节点和字符串(即允许多个参数),`appendChild()`只能添加一个节点(即只能有一个参数)。 + +**(2)ParentNode.prepend()** -`prepend`方法为当前节点追加一个或多个子节点,位置是第一个元素子节点的前面。它的用法与`append`方法完全一致,也是没有返回值。 +`prepend()`方法为当前节点追加一个或多个子节点,位置是第一个元素子节点的前面。它的用法与`append()`方法完全一致,也是没有返回值。 ## ChildNode 接口 @@ -88,7 +98,7 @@ parent.append('Hello', p); ### ChildNode.remove() -`remove`方法用于从父节点移除当前节点。 +`remove()`方法用于从父节点移除当前节点。 ```javascript el.remove() @@ -98,7 +108,9 @@ el.remove() ### ChildNode.before(),ChildNode.after() -`before`方法用于在当前节点的前面,插入一个或多个同级节点。两者拥有相同的父节点。 +**(1)ChildNode.before()** + +`before()`方法用于在当前节点的前面,插入一个或多个同级节点。两者拥有相同的父节点。 注意,该方法不仅可以插入元素节点,还可以插入文本节点。 @@ -119,11 +131,13 @@ el.before(p, p1); el.before(p, 'Hello'); ``` -`after`方法用于在当前节点的后面,插入一个或多个同级节点,两者拥有相同的父节点。用法与`before`方法完全相同。 +**(2)ChildNode.after()** + +`after()`方法用于在当前节点的后面,插入一个或多个同级节点,两者拥有相同的父节点。用法与`before`方法完全相同。 ### ChildNode.replaceWith() -`replaceWith`方法使用参数节点,替换当前节点。参数可以是元素节点,也可以是文本节点。 +`replaceWith()`方法使用参数节点,替换当前节点。参数可以是元素节点,也可以是文本节点。 ```javascript var span = document.createElement('span'); @@ -131,3 +145,4 @@ el.replaceWith(span); ``` 上面代码中,`el`节点将被`span`节点替换。 + From 2403863fc424387520ccc5f94fdde39453c5b519 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Wed, 2 Dec 2020 04:29:00 +0800 Subject: [PATCH 025/112] docs(dom): edit parentNode --- docs/dom/parentnode.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/dom/parentnode.md b/docs/dom/parentnode.md index 813ee3e..a4183a1 100644 --- a/docs/dom/parentnode.md +++ b/docs/dom/parentnode.md @@ -84,9 +84,9 @@ parent.append('Hello', p); 注意,该方法与`Node.prototype.appendChild()`方法有三点不同。 -- `append()`允许字符串作为参数,`appendChild()`只允许接受子节点作为参数。 +- `append()`允许字符串作为参数,`appendChild()`只允许子节点作为参数。 - `append()`没有返回值,而`appendChild()`返回添加的子节点。 -- `append()`可以附加多个子节点和字符串(即允许多个参数),`appendChild()`只能添加一个节点(即只能有一个参数)。 +- `append()`可以添加多个子节点和字符串(即允许多个参数),`appendChild()`只能添加一个节点(即只允许一个参数)。 **(2)ParentNode.prepend()** From 75a986b194a8ef8ae684de767b985412c3682cb8 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Wed, 2 Dec 2020 12:00:16 +0800 Subject: [PATCH 026/112] docs(types/function): edit closure #204 --- docs/types/function.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/types/function.md b/docs/types/function.md index 82c3e0c..98811c8 100644 --- a/docs/types/function.md +++ b/docs/types/function.md @@ -277,6 +277,8 @@ f.toString() // } ``` +上面示例中,函数`f`的`toString()`方法返回了`f`的源码,包含换行符在内。 + 对于那些原生的函数,`toString()`方法返回`function (){[native code]}`。 ```javascript @@ -319,6 +321,8 @@ multiline(f); // 多行注释" ``` +上面示例中,函数`f`内部有一个多行注释,`toString()`方法拿到`f`的源码后,去掉首尾两行,就得到了一个多行字符串。 + ## 函数作用域 ### 定义 @@ -740,7 +744,7 @@ result(); // 999 闭包就是函数`f2`,即能够读取其他函数内部变量的函数。由于在 JavaScript 语言中,只有函数内部的子函数才能读取内部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。闭包最大的特点,就是它可以“记住”诞生的环境,比如`f2`记住了它诞生的环境`f1`,所以从`f2`可以得到`f1`的内部变量。在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。 -闭包的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。请看下面的例子,闭包使得内部变量记住上一次调用时的运算结果。 +闭包的最大用处有两个,一个是可以读取外层函数内部的变量,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。请看下面的例子,闭包使得内部变量记住上一次调用时的运算结果。 ```javascript function createIncrementor(start) { @@ -758,7 +762,7 @@ inc() // 7 上面代码中,`start`是函数`createIncrementor`的内部变量。通过闭包,`start`的状态被保留了,每一次调用都是在上一次调用的基础上进行计算。从中可以看到,闭包`inc`使得函数`createIncrementor`的内部环境,一直存在。所以,闭包可以看作是函数内部作用域的一个接口。 -为什么会这样呢?原因就在于`inc`始终在内存中,而`inc`的存在依赖于`createIncrementor`,因此也始终在内存中,不会在调用结束后,被垃圾回收机制回收。 +为什么闭包能够返回外层函数的内部变量?原因是闭包(上例的`inc`)用到了外层变量(`start`),导致外层函数(`createIncrementor`)不能从内存释放。只要闭包没有被垃圾回收机制清除,外层函数提供的运行环境也不会被清除,它的内部变量就始终保存着当前值,供闭包读取。 闭包的另一个用处,是封装对象的私有属性和私有方法。 From d1a2ff053d90e8114fc13c8484d307e098b584a2 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Wed, 9 Dec 2020 13:53:19 +0800 Subject: [PATCH 027/112] refactor: update dependencies --- package-lock.json | 12 ++++++------ package.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 176bde4..e433feb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -629,9 +629,9 @@ } }, "husky": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.0.tgz", - "integrity": "sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.5.tgz", + "integrity": "sha512-E5S/1HMoDDaqsH8kDF5zeKEQbYqe3wL9zJDyqyYqc8I4vHBtAoxkDBGXox0lZ9RI+k5GyB728vZdmnM4bYap+g==", "requires": { "chalk": "^4.0.0", "ci-info": "^2.0.0", @@ -646,9 +646,9 @@ } }, "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", + "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" diff --git a/package.json b/package.json index e2fb260..b787c4f 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "homepage": "https://github.com/wangdoc/javascript-tutorial", "dependencies": { "gh-pages": "^3.1.0", - "husky": "^4.3.0", + "husky": "^4.3.5", "loppo": "^0.6.20", "loppo-theme-wangdoc": "^0.4.6" } From 7094b33428c84c131b437ad76826e99bdd0858f7 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Wed, 9 Dec 2020 13:56:05 +0800 Subject: [PATCH 028/112] docs(bom/arraybuffer): fix #206 --- docs/bom/arraybuffer.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/bom/arraybuffer.md b/docs/bom/arraybuffer.md index 1ad0e2b..89a5ddd 100644 --- a/docs/bom/arraybuffer.md +++ b/docs/bom/arraybuffer.md @@ -164,8 +164,8 @@ FileReader 对象提供四个方法,处理 Blob 对象。Blob 对象作为参 ```javascript // HTML 代码如下 -// -//

+// 
+// 

 function readfile(f) {
   var reader = new FileReader();
   reader.readAsText(f);
@@ -210,3 +210,4 @@ function typefile(file) {
   };
 }
 ```
+

From d9040700c1392b809338e8ef4d6918abecb3c954 Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Wed, 16 Dec 2020 16:57:01 +0800
Subject: [PATCH 029/112] docs(bom/webworker): fix #207

---
 docs/bom/webworker.md | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/docs/bom/webworker.md b/docs/bom/webworker.md
index 618f197..d005a8b 100644
--- a/docs/bom/webworker.md
+++ b/docs/bom/webworker.md
@@ -142,11 +142,11 @@ importScripts('script1.js', 'script2.js');
 主线程可以监听 Worker 是否发生错误。如果发生错误,Worker 会触发主线程的`error`事件。
 
 ```javascript
-worker.onerror(function (event) {
-  console.log([
+worker.onerror = function (event) {
+  console.log(
     'ERROR: Line ', event.lineno, ' in ', event.filename, ': ', event.message
-  ].join(''));
-});
+  );
+};
 
 // 或者
 worker.addEventListener('error', function (event) {

From 581793501e20e3a3c9c3d30d2ef4c919ac5ce94d Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Wed, 16 Dec 2020 16:57:55 +0800
Subject: [PATCH 030/112] refactor: update dependencies

---
 package-lock.json | 18 +++++++++---------
 package.json      |  2 +-
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index e433feb..d742dc0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5,17 +5,17 @@
   "requires": true,
   "dependencies": {
     "@babel/code-frame": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
-      "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+      "version": "7.12.11",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+      "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
       "requires": {
         "@babel/highlight": "^7.10.4"
       }
     },
     "@babel/helper-validator-identifier": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-      "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw=="
+      "version": "7.12.11",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+      "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw=="
     },
     "@babel/highlight": {
       "version": "7.10.4",
@@ -629,9 +629,9 @@
       }
     },
     "husky": {
-      "version": "4.3.5",
-      "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.5.tgz",
-      "integrity": "sha512-E5S/1HMoDDaqsH8kDF5zeKEQbYqe3wL9zJDyqyYqc8I4vHBtAoxkDBGXox0lZ9RI+k5GyB728vZdmnM4bYap+g==",
+      "version": "4.3.6",
+      "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.6.tgz",
+      "integrity": "sha512-o6UjVI8xtlWRL5395iWq9LKDyp/9TE7XMOTvIpEVzW638UcGxTmV5cfel6fsk/jbZSTlvfGVJf2svFtybcIZag==",
       "requires": {
         "chalk": "^4.0.0",
         "ci-info": "^2.0.0",
diff --git a/package.json b/package.json
index b787c4f..9afffe5 100644
--- a/package.json
+++ b/package.json
@@ -36,7 +36,7 @@
   "homepage": "https://github.com/wangdoc/javascript-tutorial",
   "dependencies": {
     "gh-pages": "^3.1.0",
-    "husky": "^4.3.5",
+    "husky": "^4.3.6",
     "loppo": "^0.6.20",
     "loppo-theme-wangdoc": "^0.4.6"
   }

From 534b91337dd54de2d671beed035edd75959b33be Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Sat, 19 Dec 2020 00:33:10 +0800
Subject: [PATCH 031/112] feat: switch CI from Travis-CI to GitHub Actions

---
 .github/workflows/wangdoc.yml  | 37 +++++++++++++++++
 .travis.yml => .travis.yml.bak |  0
 docs/bom/navigator.md          | 72 +++++++++++++++++++++++++++++++++-
 3 files changed, 107 insertions(+), 2 deletions(-)
 create mode 100644 .github/workflows/wangdoc.yml
 rename .travis.yml => .travis.yml.bak (100%)

diff --git a/.github/workflows/wangdoc.yml b/.github/workflows/wangdoc.yml
new file mode 100644
index 0000000..80f8bfe
--- /dev/null
+++ b/.github/workflows/wangdoc.yml
@@ -0,0 +1,37 @@
+name: JavaScript tutorial CI
+on:
+  push:
+    branches:
+      - master
+
+jobs:
+  page-generator:
+    name: Generating pages
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v2
+        with:
+          persist-credentials: false
+      - name: Setup Node.js
+        uses: actions/setup-node@main
+        with:
+          node-version: '14'
+      - name: Install dependencies
+        run: npm install
+      - name: Build pages
+        run: npm run build
+      - name: Deploy to website
+        uses: JamesIves/github-pages-deploy-action@3.7.1
+        with:
+          GIT_CONFIG_NAME: wangdoc-bot
+          GIT_CONFIG_EMAIL: yifeng.ruan@gmail.com
+          REPOSITORY_NAME: wangdoc/website
+          ACCESS_TOKEN: ${{ secrets.WANGDOC_BOT_TOKEN }}
+          BASE_BRANCH: master
+          BRANCH: master # The branch the action should deploy to.
+          FOLDER: dist # The folder the action should deploy.
+          TARGET_FOLDER: dist/javascript
+          CLEAN: true # Automatically remove deleted files from the deploy branch
+          COMMIT_MESSAGE: update from JavaScript tutorial
+
diff --git a/.travis.yml b/.travis.yml.bak
similarity index 100%
rename from .travis.yml
rename to .travis.yml.bak
diff --git a/docs/bom/navigator.md b/docs/bom/navigator.md
index f0644e4..0a92794 100644
--- a/docs/bom/navigator.md
+++ b/docs/bom/navigator.md
@@ -106,7 +106,7 @@ Geolocation 对象提供下面三个方法。
 
 ### Navigator.cookieEnabled
 
-`Navigator.cookieEnabled`属性返回一个布尔值,表示浏览器的 Cookie 功能是否打开。
+`navigator.cookieEnabled`属性返回一个布尔值,表示浏览器的 Cookie 功能是否打开。
 
 ```javascript
 navigator.cookieEnabled // true
@@ -118,7 +118,7 @@ navigator.cookieEnabled // true
 
 ### Navigator.javaEnabled()
 
-`Navigator.javaEnabled()`方法返回一个布尔值,表示浏览器是否能运行 Java Applet 小程序。
+`navigator.javaEnabled()`方法返回一个布尔值,表示浏览器是否能运行 Java Applet 小程序。
 
 ```javascript
 navigator.javaEnabled() // false
@@ -128,6 +128,73 @@ navigator.javaEnabled() // false
 
 `Navigator.sendBeacon()`方法用于向服务器异步发送数据,详见《XMLHttpRequest 对象》一章。
 
+## Navigator 的实验性属性
+
+Navigator 对象有一些实验性属性,在部分浏览器可用。
+
+### Navigator.deviceMemory
+
+`navigator.deviceMemory`属性返回当前计算机的内存数量(单位为 GB)。该属性只读,只在 HTTPS 环境下可用。
+
+它的返回值是一个近似值,四舍五入到最接近的2的幂,通常是 0.25、0.5、1、2、4、8。实际内存超过 8GB,也返回`8`。
+
+```javascript
+if (navigator.deviceMemory > 1) {
+  await import('./costly-module.js');
+}
+```
+
+上面示例中,只有当前内存大于 1GB,才加载大型的脚本。
+
+### Navigator.hardwareConcurrency
+
+`navigator.hardwareConcurrency`属性返回用户计算机上可用的逻辑处理器的数量。该属性只读。
+
+现代计算机的 CPU 有多个物理核心,每个物理核心有时支持一次运行多个线程。因此,四核 CPU 可以提供八个逻辑处理器核心。
+
+```javascript
+if (navigator.hardwareConcurrency > 4) {
+  await import('./costly-module.js');
+}
+```
+
+上面示例中,可用的逻辑处理器大于4,才会加载大型脚本。
+
+该属性通过用于创建 Web Worker,每个可用的逻辑处理器都创建一个 Worker。
+
+```javascript
+let workerList = [];
+
+for (let i = 0; i < window.navigator.hardwareConcurrency; i++) {
+  let newWorker = {
+    worker: new Worker('cpuworker.js'),
+    inUse: false
+  };
+  workerList.push(newWorker);
+}
+```
+
+上面示例中,有多少个可用的逻辑处理器,就创建多少个 Web Worker。
+
+### Navigator.connection
+
+`navigator.connection`属性返回一个对象,包含当前网络连接的相关信息。
+
+- downlink:有效带宽估计值(单位:兆比特/秒,Mbps),四舍五入到每秒 25KB 的最接近倍数。
+- downlinkMax:当前连接的最大下行链路速度(单位:兆比特每秒,Mbps)。
+- effectiveType:返回连接的等效类型,可能的值为`slow-2g`、`2g`、`3g`、`4g`。
+- rtt:当前连接的估计有效往返时间,四舍五入到最接近的25毫秒的倍数。
+- saveData:用户是否设置了浏览器的减少数据使用量选项(比如不加载图片),返回`true`或者`false`。
+- type:当前连接的介质类型,可能的值为`bluetooth`、`cellular`、`ethernet`、`none`、`wifi`、`wimax`、`other`、`unknown`。
+
+```javascript
+if (navigator.connection.effectiveType === '4g') {
+  await import('./costly-module.js');
+}
+```
+
+上面示例中,如果网络连接是 4G,则加载大型脚本。
+
 ## Screen 对象
 
 Screen 对象表示当前窗口所在的屏幕,提供显示设备的信息。`window.screen`属性指向这个对象。
@@ -166,3 +233,4 @@ if ((screen.width <= 800) && (screen.height <= 600)) {
   window.location.replace('wide.html');
 }
 ```
+

From 6f22958aca904064b8e0b618d86aa728929ccfe8 Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Sat, 19 Dec 2020 00:44:37 +0800
Subject: [PATCH 032/112] refactor: update dependencies

---
 package-lock.json | 290 ++++++++++++++++++++++------------------------
 package.json      |   2 +-
 2 files changed, 140 insertions(+), 152 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index d742dc0..af8f76f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -73,6 +73,14 @@
         }
       }
     },
+    "@iktakahiro/markdown-it-katex": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/@iktakahiro/markdown-it-katex/-/markdown-it-katex-4.0.1.tgz",
+      "integrity": "sha512-kGFooO7fIOgY34PSG8ZNVsUlKhhNoqhzW2kq94TNGa8COzh73PO4KsEoPOsQVG1mEAe8tg7GqG0FoVao0aMHaw==",
+      "requires": {
+        "katex": "^0.12.0"
+      }
+    },
     "@types/minimatch": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
@@ -181,9 +189,9 @@
       }
     },
     "cliui": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.2.tgz",
-      "integrity": "sha512-lhpKkuUj67j5JgZIPZxLe7nSa4MQoojzRVWQyzMqBp2hBg6gwRjUDAwC1YDeBaC3APDBKNnjWbv2mlDF4XgOSA==",
+      "version": "7.0.4",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
       "requires": {
         "string-width": "^4.2.0",
         "strip-ansi": "^6.0.0",
@@ -267,9 +275,9 @@
       "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w=="
     },
     "debug": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
-      "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+      "version": "4.3.1",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+      "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
       "requires": {
         "ms": "2.1.2"
       },
@@ -281,6 +289,11 @@
         }
       }
     },
+    "deepmerge": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
+    },
     "depd": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
@@ -292,46 +305,56 @@
       "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
     },
     "dom-serializer": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
-      "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.2.0.tgz",
+      "integrity": "sha512-n6kZFH/KlCrqs/1GHMOd5i2fd/beQHuehKdWvNNffbGHTr/almdhuVvTVFb3V7fglz+nC50fFusu3lY33h12pA==",
       "requires": {
         "domelementtype": "^2.0.1",
+        "domhandler": "^4.0.0",
         "entities": "^2.0.0"
       },
       "dependencies": {
-        "domelementtype": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz",
-          "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA=="
-        },
-        "entities": {
-          "version": "2.0.3",
-          "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz",
-          "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ=="
+        "domhandler": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.0.0.tgz",
+          "integrity": "sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA==",
+          "requires": {
+            "domelementtype": "^2.1.0"
+          }
         }
       }
     },
     "domelementtype": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
-      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz",
+      "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w=="
     },
     "domhandler": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
-      "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz",
+      "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==",
       "requires": {
-        "domelementtype": "1"
+        "domelementtype": "^2.0.1"
       }
     },
     "domutils": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
-      "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+      "version": "2.4.4",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.4.4.tgz",
+      "integrity": "sha512-jBC0vOsECI4OMdD0GC9mGn7NXPLb+Qt6KW1YDQzeQYRUFKmNG8lh7mO5HiELfr+lLQE7loDVI4QcAxV80HS+RA==",
       "requires": {
-        "dom-serializer": "0",
-        "domelementtype": "1"
+        "dom-serializer": "^1.0.1",
+        "domelementtype": "^2.0.1",
+        "domhandler": "^4.0.0"
+      },
+      "dependencies": {
+        "domhandler": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.0.0.tgz",
+          "integrity": "sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA==",
+          "requires": {
+            "domelementtype": "^2.1.0"
+          }
+        }
       }
     },
     "ee-first": {
@@ -360,9 +383,9 @@
       "integrity": "sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw=="
     },
     "entities": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
-      "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
+      "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w=="
     },
     "error-ex": {
       "version": "1.3.2",
@@ -565,9 +588,9 @@
       "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
     },
     "highlight.js": {
-      "version": "10.2.1",
-      "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.2.1.tgz",
-      "integrity": "sha512-A+sckVPIb9zQTUydC9lpRX1qRFO/N0OKEh0NwIr65ckvWA/oMY8v9P3+kGRK3w2ULSh9E8v5MszXafodQ6039g=="
+      "version": "10.4.1",
+      "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.4.1.tgz",
+      "integrity": "sha512-yR5lWvNz7c85OhVAEAeFhVCc/GV4C30Fjzc/rCP0aCWzc1UUOPUk55dK/qdwTZHBvMZo+eZ2jpk62ndX/xMFlg=="
     },
     "html-minifier": {
       "version": "4.0.0",
@@ -584,27 +607,26 @@
       }
     },
     "html-to-text": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-5.1.1.tgz",
-      "integrity": "sha512-Bci6bD/JIfZSvG4s0gW/9mMKwBRoe/1RWLxUME/d6WUSZCdY7T60bssf/jFf7EYXRyqU4P5xdClVqiYU0/ypdA==",
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-6.0.0.tgz",
+      "integrity": "sha512-r0KNC5aqCAItsjlgtirW6RW25c92Ee3ybQj8z//4Sl4suE3HIPqM4deGpYCUJULLjtVPEP1+Ma+1ZeX1iMsCiA==",
       "requires": {
+        "deepmerge": "^4.2.2",
         "he": "^1.2.0",
-        "htmlparser2": "^3.10.1",
-        "lodash": "^4.17.11",
-        "minimist": "^1.2.0"
+        "htmlparser2": "^4.1.0",
+        "lodash": "^4.17.20",
+        "minimist": "^1.2.5"
       }
     },
     "htmlparser2": {
-      "version": "3.10.1",
-      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
-      "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz",
+      "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==",
       "requires": {
-        "domelementtype": "^1.3.1",
-        "domhandler": "^2.3.0",
-        "domutils": "^1.5.1",
-        "entities": "^1.1.1",
-        "inherits": "^2.0.1",
-        "readable-stream": "^3.1.1"
+        "domelementtype": "^2.0.1",
+        "domhandler": "^3.0.0",
+        "domutils": "^2.0.0",
+        "entities": "^2.0.0"
       }
     },
     "http-errors": {
@@ -689,9 +711,9 @@
       "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
     },
     "js-yaml": {
-      "version": "3.14.0",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
-      "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
+      "version": "3.14.1",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
       "requires": {
         "argparse": "^1.0.7",
         "esprima": "^4.0.0"
@@ -711,11 +733,11 @@
       }
     },
     "katex": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/katex/-/katex-0.6.0.tgz",
-      "integrity": "sha1-EkGOCRIcBckgQbazuftrqyE8tvM=",
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/katex/-/katex-0.12.0.tgz",
+      "integrity": "sha512-y+8btoc/CK70XqcHqjxiGWBOeIL8upbS0peTPXTvgrh21n1RiWWcIpSWM+4uXq+IAgNh9YYQWdc7LVDPDAEEAg==",
       "requires": {
-        "match-at": "^0.1.0"
+        "commander": "^2.19.0"
       }
     },
     "lines-and-columns": {
@@ -765,27 +787,27 @@
       }
     },
     "loppo": {
-      "version": "0.6.20",
-      "resolved": "https://registry.npmjs.org/loppo/-/loppo-0.6.20.tgz",
-      "integrity": "sha512-+b8XgeBKV6BxVBA8E3rX/MTtamLwor0sqlkLeWSkgPhpheT79goM1TRpRwvaxoE3b65hBlIqH2J9Pff6HkFkjw==",
+      "version": "0.6.23",
+      "resolved": "https://registry.npmjs.org/loppo/-/loppo-0.6.23.tgz",
+      "integrity": "sha512-PVlL8OH3Vwu8Rjm+S6DAPtFCgFW8SwfSlr+MAkTCL6iBrilQpcnFOp1t5pkwxPF6cLE5Z1Fm9IyzG2G/MeS0rQ==",
       "requires": {
         "connect": "^3.7.0",
-        "debug": "4.x",
+        "debug": "^4.3.1",
         "fs-extra": "^9.0.1",
         "html-minifier": "4.x",
-        "html-to-text": "5.x",
-        "js-yaml": "^3.14.0",
+        "html-to-text": "6.x",
+        "js-yaml": "^3.14.1",
         "lodash": "^4.17.20",
         "log-symbols": "4.x",
         "log4js": "^6.3.0",
         "loppo-theme-oceandeep": "2.x",
-        "promptly": "^3.0.3",
+        "promptly": "^3.2.0",
         "serve-static": "^1.14.1",
         "tarim": "^0.1.2",
-        "turpan": "^0.3.0",
+        "turpan": "^0.3.1",
         "walk-sync": "^2.2.0",
         "wordcount": "^1.1.1",
-        "yargs": "16.x"
+        "yargs": "^16.2.0"
       },
       "dependencies": {
         "fs-extra": {
@@ -800,12 +822,19 @@
           }
         },
         "jsonfile": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
-          "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+          "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
           "requires": {
             "graceful-fs": "^4.1.6",
-            "universalify": "^1.0.0"
+            "universalify": "^2.0.0"
+          },
+          "dependencies": {
+            "universalify": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+              "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
+            }
           }
         },
         "universalify": {
@@ -839,21 +868,21 @@
       }
     },
     "markdown-it": {
-      "version": "11.0.1",
-      "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-11.0.1.tgz",
-      "integrity": "sha512-aU1TzmBKcWNNYvH9pjq6u92BML+Hz3h5S/QpfTFwiQF852pLT+9qHsrhM9JYipkOXZxGn+sGH8oyJE9FD9WezQ==",
+      "version": "12.0.3",
+      "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.0.3.tgz",
+      "integrity": "sha512-M57RsMv+QQmJHz1yCu0gTJRMx/LlxRPtrrw+2kb/CpDVK/graCmWO0qfNnz/SE1FCNdyq3pkMMZ+itTnyT/YGA==",
       "requires": {
-        "argparse": "^1.0.7",
-        "entities": "~2.0.0",
+        "argparse": "^2.0.1",
+        "entities": "~2.1.0",
         "linkify-it": "^3.0.1",
         "mdurl": "^1.0.1",
         "uc.micro": "^1.0.5"
       },
       "dependencies": {
-        "entities": {
-          "version": "2.0.3",
-          "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz",
-          "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ=="
+        "argparse": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+          "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
         }
       }
     },
@@ -873,9 +902,9 @@
       "integrity": "sha512-3OuqoRUlSxJiuQYu0cWTLHNhhq2xtoSFqsZK8plANg91+RJQU1ziQ6lA2LzmFAEes18uPBsHZpcX6We5l76Nzg=="
     },
     "markdown-it-emoji": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-1.4.0.tgz",
-      "integrity": "sha1-m+4OmpkKljupbfaYDE/dsF37Tcw="
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.0.tgz",
+      "integrity": "sha512-39j7/9vP/CPCKbEI44oV8yoPJTpvfeReTn/COgRhSpNrjWF3PfP/JUxxB0hxV6ynOY8KH8Y8aX9NMDdo6z+6YQ=="
     },
     "markdown-it-footnote": {
       "version": "3.0.2",
@@ -897,14 +926,6 @@
       "resolved": "https://registry.npmjs.org/markdown-it-ins/-/markdown-it-ins-3.0.0.tgz",
       "integrity": "sha512-+vyAdBuMGwmT2yMlAFJSx2VR/0QZ1onQ/Mkkmr4l9tDFOh5sVoAgRbkgbuSsk+sxJ9vaMH/IQ323ydfvQrPO/Q=="
     },
-    "markdown-it-katex": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/markdown-it-katex/-/markdown-it-katex-2.0.3.tgz",
-      "integrity": "sha1-17hqGuoLnWSW+rTnkZoY/e9YnDk=",
-      "requires": {
-        "katex": "^0.6.0"
-      }
-    },
     "markdown-it-mark": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/markdown-it-mark/-/markdown-it-mark-3.0.0.tgz",
@@ -925,11 +946,6 @@
       "resolved": "https://registry.npmjs.org/markdown-it-task-lists/-/markdown-it-task-lists-2.1.1.tgz",
       "integrity": "sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA=="
     },
-    "match-at": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/match-at/-/match-at-0.1.1.tgz",
-      "integrity": "sha512-h4Yd392z9mST+dzc+yjuybOGFNOZjmXIPKWjxBd1Bb23r4SmDOsk2NYCU2BMUBGbSpZqwVsZYNq26QS3xfaT3Q=="
-    },
     "match-words": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/match-words/-/match-words-0.1.1.tgz",
@@ -1133,9 +1149,9 @@
       "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
     },
     "promptly": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/promptly/-/promptly-3.1.0.tgz",
-      "integrity": "sha512-ygvIcmkt+eWtrQwI1/w7wDfzfAWI7IJX1AUVsWQEQwTmpQ5jeSyiD1g6NuI9VXWhz8LK5a5Bcngp/sKnOgQtiA==",
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/promptly/-/promptly-3.2.0.tgz",
+      "integrity": "sha512-WnR9obtgW+rG4oUV3hSnNGl1pHm3V1H/qD9iJBumGSmVsSC5HpZOLuu8qdMb6yCItGfT7dcRszejr/5P3i9Pug==",
       "requires": {
         "read": "^1.0.4"
       }
@@ -1162,16 +1178,6 @@
         "mute-stream": "~0.0.4"
       }
     },
-    "readable-stream": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-      "requires": {
-        "inherits": "^2.0.3",
-        "string_decoder": "^1.1.1",
-        "util-deprecate": "^1.0.1"
-      }
-    },
     "relateurl": {
       "version": "0.2.7",
       "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
@@ -1192,11 +1198,6 @@
       "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz",
       "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug=="
     },
-    "safe-buffer": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
-    },
     "semver": {
       "version": "6.3.0",
       "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -1337,14 +1338,6 @@
         }
       }
     },
-    "string_decoder": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
-      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
-      "requires": {
-        "safe-buffer": "~5.2.0"
-      }
-    },
     "strip-ansi": {
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
@@ -1397,28 +1390,28 @@
       }
     },
     "turpan": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/turpan/-/turpan-0.3.0.tgz",
-      "integrity": "sha512-pFI2Uo4AkalVy+xNuFO8AUW2Ys0ngeQfhBkLrNswBjsX1XLC5r4lgVY2cjeZSDuh9gIZCNYwjKMqvbSPJqT3lw==",
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/turpan/-/turpan-0.3.1.tgz",
+      "integrity": "sha512-jL6AMHTA2yExzbSoZTRinbWPzf9nvQfVFk0V6JlBTIbPCKMbAfgXRFHZuOFe6ZXm6+LE6s3jypNRNXkAY2yKaw==",
       "requires": {
+        "@iktakahiro/markdown-it-katex": "^4.0.1",
         "clone": "^2.1.1",
         "github-slugger": "^1.1.1",
-        "highlight.js": "^10.2.0",
-        "markdown-it": "^11.0.1",
+        "highlight.js": "^10.4.1",
+        "markdown-it": "^12.0.1",
         "markdown-it-abbr": "^1.0.4",
         "markdown-it-container": "^3.0.0",
         "markdown-it-deflist": "^2.0.1",
-        "markdown-it-emoji": "^1.3.0",
+        "markdown-it-emoji": "^2.0.0",
         "markdown-it-footnote": "^3.0.1",
         "markdown-it-implicit-figures": "^0.10.0",
         "markdown-it-imsize": "^2.0.1",
         "markdown-it-ins": "^3.0.0",
-        "markdown-it-katex": "^2.0.3",
         "markdown-it-mark": "^3.0.0",
         "markdown-it-sub": "^1.0.0",
         "markdown-it-sup": "^1.0.0",
         "markdown-it-task-lists": "^2.1.1",
-        "yargs": "^16.0.3"
+        "yargs": "^16.1.1"
       }
     },
     "uc.micro": {
@@ -1427,9 +1420,9 @@
       "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
     },
     "uglify-js": {
-      "version": "3.11.2",
-      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.11.2.tgz",
-      "integrity": "sha512-G440NU6fewtnQftSgqRV1r2A5ChKbU1gqFCJ7I8S7MPpY/eZZfLGefaY6gUZYiWebMaO+txgiQ1ZyLDuNWJulg=="
+      "version": "3.12.2",
+      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.2.tgz",
+      "integrity": "sha512-rWYleAvfJPjduYCt+ELvzybNah/zIkRteGXIBO8X0lteRZPGladF61hFi8tU7qKTsF7u6DUQCtT9k00VlFOgkg=="
     },
     "universalify": {
       "version": "0.1.2",
@@ -1446,11 +1439,6 @@
       "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
       "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg="
     },
-    "util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
-    },
     "utils-merge": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
@@ -1501,9 +1489,9 @@
       "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
     },
     "y18n": {
-      "version": "5.0.2",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.2.tgz",
-      "integrity": "sha512-CkwaeZw6dQgqgPGeTWKMXCRmMcBgETFlTml1+ZOO+q7kGst8NREJ+eWwFNPVUQ4QGdAaklbqCZHH6Zuep1RjiA=="
+      "version": "5.0.5",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz",
+      "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg=="
     },
     "yaml": {
       "version": "1.10.0",
@@ -1511,23 +1499,23 @@
       "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg=="
     },
     "yargs": {
-      "version": "16.0.3",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.0.3.tgz",
-      "integrity": "sha512-6+nLw8xa9uK1BOEOykaiYAJVh6/CjxWXK/q9b5FpRgNslt8s22F2xMBqVIKgCRjNgGvGPBy8Vog7WN7yh4amtA==",
+      "version": "16.2.0",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+      "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
       "requires": {
-        "cliui": "^7.0.0",
-        "escalade": "^3.0.2",
+        "cliui": "^7.0.2",
+        "escalade": "^3.1.1",
         "get-caller-file": "^2.0.5",
         "require-directory": "^2.1.1",
         "string-width": "^4.2.0",
-        "y18n": "^5.0.1",
-        "yargs-parser": "^20.0.0"
+        "y18n": "^5.0.5",
+        "yargs-parser": "^20.2.2"
       }
     },
     "yargs-parser": {
-      "version": "20.2.2",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.2.tgz",
-      "integrity": "sha512-XmrpXaTl6noDsf1dKpBuUNCOHqjs0g3jRMXf/ztRxdOmb+er8kE5z5b55Lz3p5u2T8KJ59ENBnASS8/iapVJ5g=="
+      "version": "20.2.4",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+      "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA=="
     }
   }
 }
diff --git a/package.json b/package.json
index 9afffe5..f88f0b9 100644
--- a/package.json
+++ b/package.json
@@ -37,7 +37,7 @@
   "dependencies": {
     "gh-pages": "^3.1.0",
     "husky": "^4.3.6",
-    "loppo": "^0.6.20",
+    "loppo": "^0.6.23",
     "loppo-theme-wangdoc": "^0.4.6"
   }
 }

From 0d4bbdca4cc7b30c159be721792cdc496a5ff87e Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Sun, 20 Dec 2020 18:24:23 +0800
Subject: [PATCH 033/112] docs(bom): edit URL

---
 docs/bom/form.md     |  8 ++++----
 docs/bom/location.md | 12 +++++++-----
 2 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/docs/bom/form.md b/docs/bom/form.md
index c4bb42b..7b71500 100644
--- a/docs/bom/form.md
+++ b/docs/bom/form.md
@@ -80,15 +80,15 @@ formElement.reset()
 
 ### 概述
 
-表单数据以键值对的形式向服务器发送,这个过程是浏览器自动完成的。但是有时候,我们希望通过脚本完成过程,构造和编辑表单键值对,然后通过`XMLHttpRequest.send()`方法发送。浏览器原生提供了 FormData 对象来完成这项工作。
+表单数据以键值对的形式向服务器发送,这个过程是浏览器自动完成的。但是有时候,我们希望通过脚本完成这个过程,构造或编辑表单的键值对,然后通过脚本发送给服务器。浏览器原生提供了 FormData 对象来完成这项工作。
 
-FormData 首先是一个构造函数,用来生成实例。
+`FormData()`首先是一个构造函数,用来生成表单的实例。
 
 ```javascript
 var formdata = new FormData(form);
 ```
 
-`FormData()`构造函数的参数是一个表单元素,这个参数是可选的。如果省略参数,就表示一个空的表单,否则就会处理表单元素里面的键值对。
+`FormData()`构造函数的参数是一个 DOM 的表单元素,构造函数会自动处理表单的键值对。这个参数是可选的,如果省略该参数,就表示一个空的表单。
 
 下面是一个表单。
 
@@ -110,7 +110,7 @@ var formdata = new FormData(form);
 
 ```
 
-我们用 FormData 对象处理上面这个表单。
+我们用`FormData()`处理上面这个表单。
 
 ```javascript
 var myForm = document.getElementById('myForm');
diff --git a/docs/bom/location.md b/docs/bom/location.md
index 4ea667e..8d75a8f 100644
--- a/docs/bom/location.md
+++ b/docs/bom/location.md
@@ -173,11 +173,11 @@ decodeURIComponent('%E6%98%A5%E8%8A%82')
 
 ## URL 接口
 
-`URL`接口是一个构造函数,浏览器原生提供,可以用来构造、解析和编码 URL。一般情况下,通过`window.URL`可以拿到这个构造函数。
+浏览器原生提供`URL()`接口,它是一个构造函数,用来构造、解析和编码 URL。一般情况下,通过`window.URL`可以拿到这个构造函数。
 
 ### 构造函数
 
-`URL`作为构造函数,可以生成 URL 实例。它接受一个表示 URL 的字符串作为参数。如果参数不是合法的 URL,会报错。
+`URL()`作为构造函数,可以生成 URL 实例。它接受一个表示 URL 的字符串作为参数。如果参数不是合法的 URL,会报错。
 
 ```javascript
 var url = new URL('http://www.example.com/index.html');
@@ -185,7 +185,9 @@ url.href
 // "http://www.example.com/index.html"
 ```
 
-如果参数是另一个 URL 实例,构造函数会自动读取该实例的`href`属性,作为实际参数。
+上面示例生成了一个 URL 实例,用来代表指定的网址。
+
+除了字符串,`URL()`的参数也可以是另一个 URL 实例。这时,`URL()`会自动读取该实例的`href`属性,作为实际参数。
 
 如果 URL 字符串是一个相对路径,那么需要表示绝对路径的第二个参数,作为计算基准。
 
@@ -251,7 +253,7 @@ url.username
 // "user"
 ```
 
-这些属性里面,只有`origin`属性是只读的,其他属性都可写。
+这些属性里面,只有`origin`属性是只读的,其他属性都可写,并且会立即生效。
 
 ```javascript
 var url = new URL('http://example.com/index.html#part1');
@@ -367,7 +369,7 @@ fetch('https://example.com/api', {
 
 上面代码中,`fetch`命令向服务器发送命令时,可以直接使用`URLSearchParams`实例。
 
-`URLSearchParams`可以与`URL`接口结合使用。
+`URLSearchParams`可以与`URL()`接口结合使用。
 
 ```javascript
 var url = new URL(window.location);

From 881f0b246549fa3cb9e177a4fc95c40edff50a8f Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Thu, 24 Dec 2020 21:42:34 +0800
Subject: [PATCH 034/112] refactor: update dependencies

---
 package-lock.json | 6 +++---
 package.json      | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index af8f76f..68bd04d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -850,9 +850,9 @@
       "integrity": "sha1-Mswjj72pUEpmZVTkbZdlh8LA9Ww="
     },
     "loppo-theme-wangdoc": {
-      "version": "0.4.6",
-      "resolved": "https://registry.npmjs.org/loppo-theme-wangdoc/-/loppo-theme-wangdoc-0.4.6.tgz",
-      "integrity": "sha512-6rIopeDYe83kCDMatFkDzc/fZKtwUJ6+raV+maSmP05BFKkdtp3+k2yJjLsNj4QhkPB/RO0vfTwgcE30FBBwHw=="
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/loppo-theme-wangdoc/-/loppo-theme-wangdoc-0.5.1.tgz",
+      "integrity": "sha512-tgGNCZeoKCcKDvwDmuoaOW3FJ0Q3Zvjj4JwLqxtU+rAeFz0YIIc0ZCgm5jXcaFxa+V79RzTu/JZKJq+os4no4A=="
     },
     "lower-case": {
       "version": "1.1.4",
diff --git a/package.json b/package.json
index f88f0b9..c09b2e8 100644
--- a/package.json
+++ b/package.json
@@ -38,6 +38,6 @@
     "gh-pages": "^3.1.0",
     "husky": "^4.3.6",
     "loppo": "^0.6.23",
-    "loppo-theme-wangdoc": "^0.4.6"
+    "loppo-theme-wangdoc": "^0.5.1"
   }
 }

From 51a586c6ab87f567940e338b731f1b0b85d35efe Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Thu, 14 Jan 2021 11:06:11 +0800
Subject: [PATCH 035/112] docs(XMLHttpRequest: fix #211

---
 docs/bom/xmlhttprequest.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/bom/xmlhttprequest.md b/docs/bom/xmlhttprequest.md
index be0ee13..8855064 100644
--- a/docs/bom/xmlhttprequest.md
+++ b/docs/bom/xmlhttprequest.md
@@ -143,7 +143,7 @@ xhr.onreadystatechange = function () {
 
 ### XMLHttpRequest.responseType
 
-`XMLHttpRequest.responseType`属性是一个字符串,表示服务器返回数据的类型。这个属性是可写的,可以在调用`open()`方法之后、调用`send()`方法之前,设置这个属性的值,告诉服务器返回指定类型的数据。如果`responseType`设为空字符串,就等同于默认值`text`。
+`XMLHttpRequest.responseType`属性是一个字符串,表示服务器返回数据的类型。这个属性是可写的,可以在调用`open()`方法之后、调用`send()`方法之前,设置这个属性的值,告诉浏览器如何解读返回的数据。如果`responseType`设为空字符串,就等同于默认值`text`。
 
 `XMLHttpRequest.responseType`属性可以等于以下值。
 

From a9c543be2b9e925a5909de052d5d260bc65100fc Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Fri, 22 Jan 2021 22:57:03 +0800
Subject: [PATCH 036/112] docs(bom): fix location

---
 docs/bom/location.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/bom/location.md b/docs/bom/location.md
index 8d75a8f..7233095 100644
--- a/docs/bom/location.md
+++ b/docs/bom/location.md
@@ -481,7 +481,7 @@ params.toString() // "foo=3"
 ```javascript
 // URL: https://example.com?version=1.0
 var params = new URLSearchParams(location.search.slice(1));
-params.set('version', 2.0);
+params.set('version', '2.0');
 
 window.history.replaceState({}, '', location.pathname + `?` + params);
 // URL: https://example.com?version=2.0

From 692eb7162d1969eecc933722c1836ea5d09626cb Mon Sep 17 00:00:00 2001
From: wqliang <2462792@qq.com>
Date: Thu, 4 Feb 2021 11:43:10 +0800
Subject: [PATCH 037/112] =?UTF-8?q?#212=20FIX=209.3=20Object.definePropert?=
 =?UTF-8?q?y,=E5=AF=B9=E8=B1=A1=E5=90=8Do=E5=BA=94=E8=AF=A5=E6=98=AFobj?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 docs/stdlib/attributes.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/stdlib/attributes.md b/docs/stdlib/attributes.md
index 1440a67..f1f3af6 100644
--- a/docs/stdlib/attributes.md
+++ b/docs/stdlib/attributes.md
@@ -635,7 +635,7 @@ Object.getOwnPropertyDescriptor(obj, 'p')
 //   configurable: false
 // }
 
-Object.defineProperty(o, 'p', {
+Object.defineProperty(obj, 'p', {
   enumerable: false
 })
 // TypeError: Cannot redefine property: p

From df064ca9e33627481435bad105909bcc48791e9d Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Thu, 11 Feb 2021 15:47:21 +0800
Subject: [PATCH 038/112] docs(stdlib/array): fix typo

---
 docs/stdlib/array.md |   8 ++--
 package-lock.json    | 108 +++++++++++++++++++++++++++++++------------
 2 files changed, 82 insertions(+), 34 deletions(-)

diff --git a/docs/stdlib/array.md b/docs/stdlib/array.md
index f2d971f..caacce2 100644
--- a/docs/stdlib/array.md
+++ b/docs/stdlib/array.md
@@ -15,14 +15,14 @@ arr // [ empty x 2 ]
 如果没有使用`new`关键字,运行结果也是一样的。
 
 ```javascript
-var arr = new Array(2);
-// 等同于
 var arr = Array(2);
+// 等同于
+var arr = new Array(2);
 ```
 
-考虑到语义性,以及与其他构造函数用户保持一致,建议总是加上`new`。
+考虑到语义性,以及与其他构造函数用法保持一致,建议总是加上`new`。
 
-`Array()`构造函数有一个很大的缺陷,不同的参数会导致行为不一致。
+`Array()`构造函数有一个很大的缺陷,不同的参数个数会导致不一致的行为。
 
 ```javascript
 // 无参数时,返回一个空数组
diff --git a/package-lock.json b/package-lock.json
index 68bd04d..12d5408 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -488,11 +488,11 @@
       }
     },
     "find-versions": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz",
-      "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz",
+      "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==",
       "requires": {
-        "semver-regex": "^2.0.0"
+        "semver-regex": "^3.1.2"
       }
     },
     "flatted": {
@@ -588,9 +588,9 @@
       "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
     },
     "highlight.js": {
-      "version": "10.4.1",
-      "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.4.1.tgz",
-      "integrity": "sha512-yR5lWvNz7c85OhVAEAeFhVCc/GV4C30Fjzc/rCP0aCWzc1UUOPUk55dK/qdwTZHBvMZo+eZ2jpk62ndX/xMFlg=="
+      "version": "10.5.0",
+      "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.5.0.tgz",
+      "integrity": "sha512-xTmvd9HiIHR6L53TMC7TKolEj65zG1XU+Onr8oi86mYa+nLcIbxTTWkpW7CsEwv/vK7u1zb8alZIMLDqqN6KTw=="
     },
     "html-minifier": {
       "version": "4.0.0",
@@ -651,26 +651,69 @@
       }
     },
     "husky": {
-      "version": "4.3.6",
-      "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.6.tgz",
-      "integrity": "sha512-o6UjVI8xtlWRL5395iWq9LKDyp/9TE7XMOTvIpEVzW638UcGxTmV5cfel6fsk/jbZSTlvfGVJf2svFtybcIZag==",
+      "version": "4.3.7",
+      "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.7.tgz",
+      "integrity": "sha512-0fQlcCDq/xypoyYSJvEuzbDPHFf8ZF9IXKJxlrnvxABTSzK1VPT2RKYQKrcgJ+YD39swgoB6sbzywUqFxUiqjw==",
       "requires": {
         "chalk": "^4.0.0",
         "ci-info": "^2.0.0",
         "compare-versions": "^3.6.0",
         "cosmiconfig": "^7.0.0",
-        "find-versions": "^3.2.0",
+        "find-versions": "^4.0.0",
         "opencollective-postinstall": "^2.0.2",
-        "pkg-dir": "^4.2.0",
+        "pkg-dir": "^5.0.0",
         "please-upgrade-node": "^3.2.0",
         "slash": "^3.0.0",
         "which-pm-runs": "^1.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+          "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+          "requires": {
+            "locate-path": "^6.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+          "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+          "requires": {
+            "p-locate": "^5.0.0"
+          }
+        },
+        "p-limit": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+          "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+          "requires": {
+            "yocto-queue": "^0.1.0"
+          }
+        },
+        "p-locate": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+          "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+          "requires": {
+            "p-limit": "^3.0.2"
+          }
+        },
+        "pkg-dir": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
+          "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==",
+          "requires": {
+            "find-up": "^5.0.0"
+          }
+        }
       }
     },
     "import-fresh": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz",
-      "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==",
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
       "requires": {
         "parent-module": "^1.0.0",
         "resolve-from": "^4.0.0"
@@ -868,9 +911,9 @@
       }
     },
     "markdown-it": {
-      "version": "12.0.3",
-      "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.0.3.tgz",
-      "integrity": "sha512-M57RsMv+QQmJHz1yCu0gTJRMx/LlxRPtrrw+2kb/CpDVK/graCmWO0qfNnz/SE1FCNdyq3pkMMZ+itTnyT/YGA==",
+      "version": "12.0.4",
+      "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.0.4.tgz",
+      "integrity": "sha512-34RwOXZT8kyuOJy25oJNJoulO8L0bTHYWXcdZBYZqFnjIy3NgjeoM3FmPXIOFQ26/lSHYMr8oc62B6adxXcb3Q==",
       "requires": {
         "argparse": "^2.0.1",
         "entities": "~2.1.0",
@@ -922,14 +965,14 @@
       "integrity": "sha1-zKBCeQXQUziiR8ucqdloxc3dUXA="
     },
     "markdown-it-ins": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/markdown-it-ins/-/markdown-it-ins-3.0.0.tgz",
-      "integrity": "sha512-+vyAdBuMGwmT2yMlAFJSx2VR/0QZ1onQ/Mkkmr4l9tDFOh5sVoAgRbkgbuSsk+sxJ9vaMH/IQ323ydfvQrPO/Q=="
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/markdown-it-ins/-/markdown-it-ins-3.0.1.tgz",
+      "integrity": "sha512-32SSfZqSzqyAmmQ4SHvhxbFqSzPDqsZgMHDwxqPzp+v+t8RsmqsBZRG+RfRQskJko9PfKC2/oxyOs4Yg/CfiRw=="
     },
     "markdown-it-mark": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/markdown-it-mark/-/markdown-it-mark-3.0.0.tgz",
-      "integrity": "sha512-HqMWeKfMMOu4zBO0emmxsoMWmbf2cPKZY1wP6FsTbKmicFfp5y4L3KXAsNeO1rM6NTJVOrNlLKMPjWzriBGspw=="
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/markdown-it-mark/-/markdown-it-mark-3.0.1.tgz",
+      "integrity": "sha512-HyxjAu6BRsdt6Xcv6TKVQnkz/E70TdGXEFHRYBGLncRE9lBFwDNLVtFojKxjJWgJ+5XxUwLaHXy+2sGBbDn+4A=="
     },
     "markdown-it-sub": {
       "version": "1.0.0",
@@ -1209,9 +1252,9 @@
       "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w="
     },
     "semver-regex": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz",
-      "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw=="
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.2.tgz",
+      "integrity": "sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA=="
     },
     "send": {
       "version": "0.17.1",
@@ -1420,9 +1463,9 @@
       "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
     },
     "uglify-js": {
-      "version": "3.12.2",
-      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.2.tgz",
-      "integrity": "sha512-rWYleAvfJPjduYCt+ELvzybNah/zIkRteGXIBO8X0lteRZPGladF61hFi8tU7qKTsF7u6DUQCtT9k00VlFOgkg=="
+      "version": "3.12.4",
+      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.4.tgz",
+      "integrity": "sha512-L5i5jg/SHkEqzN18gQMTWsZk3KelRsfD1wUVNqtq0kzqWQqcJjyL8yc1o8hJgRrWqrAl2mUFbhfznEIoi7zi2A=="
     },
     "universalify": {
       "version": "0.1.2",
@@ -1516,6 +1559,11 @@
       "version": "20.2.4",
       "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
       "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA=="
+    },
+    "yocto-queue": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
     }
   }
 }

From d848f184a3267b39ccfd00c136bbd45349ec1027 Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Fri, 12 Feb 2021 17:28:08 +0800
Subject: [PATCH 039/112] refactor: update dependencies

---
 package-lock.json | 84 +++++++++++++++++++++++++++++++++++++----------
 package.json      |  2 +-
 2 files changed, 67 insertions(+), 19 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 68bd04d..458cd9d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -488,11 +488,11 @@
       }
     },
     "find-versions": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz",
-      "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz",
+      "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==",
       "requires": {
-        "semver-regex": "^2.0.0"
+        "semver-regex": "^3.1.2"
       }
     },
     "flatted": {
@@ -651,26 +651,69 @@
       }
     },
     "husky": {
-      "version": "4.3.6",
-      "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.6.tgz",
-      "integrity": "sha512-o6UjVI8xtlWRL5395iWq9LKDyp/9TE7XMOTvIpEVzW638UcGxTmV5cfel6fsk/jbZSTlvfGVJf2svFtybcIZag==",
+      "version": "4.3.8",
+      "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.8.tgz",
+      "integrity": "sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow==",
       "requires": {
         "chalk": "^4.0.0",
         "ci-info": "^2.0.0",
         "compare-versions": "^3.6.0",
         "cosmiconfig": "^7.0.0",
-        "find-versions": "^3.2.0",
+        "find-versions": "^4.0.0",
         "opencollective-postinstall": "^2.0.2",
-        "pkg-dir": "^4.2.0",
+        "pkg-dir": "^5.0.0",
         "please-upgrade-node": "^3.2.0",
         "slash": "^3.0.0",
         "which-pm-runs": "^1.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+          "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+          "requires": {
+            "locate-path": "^6.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+          "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+          "requires": {
+            "p-locate": "^5.0.0"
+          }
+        },
+        "p-limit": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+          "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+          "requires": {
+            "yocto-queue": "^0.1.0"
+          }
+        },
+        "p-locate": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+          "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+          "requires": {
+            "p-limit": "^3.0.2"
+          }
+        },
+        "pkg-dir": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
+          "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==",
+          "requires": {
+            "find-up": "^5.0.0"
+          }
+        }
       }
     },
     "import-fresh": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz",
-      "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==",
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
       "requires": {
         "parent-module": "^1.0.0",
         "resolve-from": "^4.0.0"
@@ -1079,9 +1122,9 @@
       }
     },
     "parse-json": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
-      "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
       "requires": {
         "@babel/code-frame": "^7.0.0",
         "error-ex": "^1.3.1",
@@ -1209,9 +1252,9 @@
       "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w="
     },
     "semver-regex": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz",
-      "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw=="
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.2.tgz",
+      "integrity": "sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA=="
     },
     "send": {
       "version": "0.17.1",
@@ -1516,6 +1559,11 @@
       "version": "20.2.4",
       "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
       "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA=="
+    },
+    "yocto-queue": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
     }
   }
 }
diff --git a/package.json b/package.json
index c09b2e8..e610caa 100644
--- a/package.json
+++ b/package.json
@@ -36,7 +36,7 @@
   "homepage": "https://github.com/wangdoc/javascript-tutorial",
   "dependencies": {
     "gh-pages": "^3.1.0",
-    "husky": "^4.3.6",
+    "husky": "^4.3.8",
     "loppo": "^0.6.23",
     "loppo-theme-wangdoc": "^0.5.1"
   }

From 962851dbccf61933bd66f22bff57788a6df14e00 Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Fri, 12 Feb 2021 17:37:57 +0800
Subject: [PATCH 040/112] docs(event/drag): fix typo

---
 docs/events/drag.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/events/drag.md b/docs/events/drag.md
index 4310edb..b524c3a 100644
--- a/docs/events/drag.md
+++ b/docs/events/drag.md
@@ -200,7 +200,7 @@ source.addEventListener('dragstart', function (e) {
 });
 
 target.addEventListener('dragover', function (e) {
-  ev.dataTransfer.dropEffect = 'move';
+  e.dataTransfer.dropEffect = 'move';
 });
 ```
 

From 173079e708e576ba4022d9aa3c0355cb24570060 Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Sun, 14 Feb 2021 20:42:07 +0800
Subject: [PATCH 041/112] docs(basic/history): fixed #214

---
 docs/basic/history.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/basic/history.md b/docs/basic/history.md
index 06a4131..0c03d6d 100644
--- a/docs/basic/history.md
+++ b/docs/basic/history.md
@@ -125,7 +125,7 @@ JavaScript 伴随着互联网的发展一起发展。互联网周边技术的快
 
 2007年,Webkit 引擎在 iPhone 手机中得到部署。它最初基于 KDE 项目,2003年苹果公司首先采用,2005年开源。这标志着 JavaScript 语言开始能在手机中使用了,意味着有可能写出在桌面电脑和手机中都能使用的程序。
 
-2007年,Douglas Crockford 发表了名为《JavaScript: The good parts》的演讲,次年由 O'Reilly 出版社出版。这标志着软件行业开始严肃对待 JavaScript 语言,对它的语法开始重新认识,
+2007年,Douglas Crockford 发表了名为《JavaScript: The good parts》的演讲,次年由 O'Reilly 出版社出版。这标志着软件行业开始严肃对待 JavaScript 语言,对它的语法开始重新认识。
 
 2008年,V8 编译器诞生。这是 Google 公司为 Chrome 浏览器而开发的,它的特点是让 JavaScript 的运行变得非常快。它提高了 JavaScript 的性能,推动了语法的改进和标准化,改变外界对 JavaScript 的不佳印象。同时,V8 是开源的,任何人想要一种快速的嵌入式脚本语言,都可以采用 V8,这拓展了 JavaScript 的应用领域。
 

From d492be03bed0fcaa13565f7fc13091162a1453d8 Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Sun, 14 Feb 2021 20:46:48 +0800
Subject: [PATCH 042/112] docs(types/general): fixed #215

---
 docs/types/general.md | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/docs/types/general.md b/docs/types/general.md
index 3c0ea7e..8454b44 100644
--- a/docs/types/general.md
+++ b/docs/types/general.md
@@ -4,10 +4,10 @@
 
 JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型,共有六种。(ES6 又新增了第七种 Symbol 类型的值,本教程不涉及。)
 
-- 数值(number):整数和小数(比如`1`和`3.14`)
+- 数值(number):整数和小数(比如`1`和`3.14`)。
 - 字符串(string):文本(比如`Hello World`)。
-- 布尔值(boolean):表示真伪的两个特殊值,即`true`(真)和`false`(假)
-- `undefined`:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值
+- 布尔值(boolean):表示真伪的两个特殊值,即`true`(真)和`false`(假)。
+- `undefined`:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值。
 - `null`:表示空值,即此处的值为空。
 - 对象(object):各种值组成的集合。
 

From 39c49f385844d628058ae0c643400f93be0c618b Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Wed, 24 Feb 2021 09:05:36 +0800
Subject: [PATCH 043/112] docs(bom/storage): fixed #216

---
 docs/bom/storage.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/bom/storage.md b/docs/bom/storage.md
index 0d5723e..a79fa5f 100644
--- a/docs/bom/storage.md
+++ b/docs/bom/storage.md
@@ -86,7 +86,7 @@ window.localStorage.clear()
 
 ### Storage.key()
 
-`Storage.key()`接受一个整数作为参数(从零开始),返回该位置对应的键值。
+`Storage.key()`接受一个整数作为参数(从零开始),返回该位置对应的键名。
 
 ```javascript
 window.sessionStorage.setItem('key', 'value');

From 6ff80f283883616c460aa0bcc5b09f71369918db Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Wed, 24 Feb 2021 09:06:46 +0800
Subject: [PATCH 044/112] docs(bom/storage): fixed #216

---
 docs/bom/storage.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/bom/storage.md b/docs/bom/storage.md
index a79fa5f..2eb48d2 100644
--- a/docs/bom/storage.md
+++ b/docs/bom/storage.md
@@ -86,7 +86,7 @@ window.localStorage.clear()
 
 ### Storage.key()
 
-`Storage.key()`接受一个整数作为参数(从零开始),返回该位置对应的键名。
+`Storage.key()`方法接受一个整数作为参数(从零开始),返回该位置对应的键名。
 
 ```javascript
 window.sessionStorage.setItem('key', 'value');

From ac09300fc250f2f251889f73af3ebb9961a24a9d Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Sun, 7 Mar 2021 13:36:26 +0800
Subject: [PATCH 045/112] docs(feat/error): edit text

---
 docs/features/error.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/docs/features/error.md b/docs/features/error.md
index a361a99..7fc26b4 100644
--- a/docs/features/error.md
+++ b/docs/features/error.md
@@ -9,7 +9,7 @@ var err = new Error('出错了');
 err.message // "出错了"
 ```
 
-上面代码中,我们调用`Error`构造函数,生成一个实例对象`err`。`Error`构造函数接受一个参数,表示错误提示,可以从实例的`message`属性读到这个参数。抛出`Error`实例对象以后,整个程序就中断在发生错误的地方,不再往下执行。
+上面代码中,我们调用`Error()`构造函数,生成一个实例对象`err`。`Error()`构造函数接受一个参数,表示错误提示,可以从实例的`message`属性读到这个参数。抛出`Error`实例对象以后,整个程序就中断在发生错误的地方,不再往下执行。
 
 JavaScript 语言标准只提到,`Error`实例对象必须有`message`属性,表示出错时的提示信息,没有提到其他属性。大多数 JavaScript 引擎,对`Error`实例还提供`name`和`stack`属性,分别表示错误的名称和错误的堆栈,但它们是非标准的,不是每种实现都有。
 
@@ -105,7 +105,7 @@ new Array(-1)
 
 ```javascript
 new 123
-// Uncaught TypeError: number is not a func
+// Uncaught TypeError: 123 is not a constructor
 
 var obj = {};
 obj.unknownMethod()

From 78db1506f640718d71bedd6b09eb2b39a270b8d7 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 6 May 2021 20:36:38 +0000
Subject: [PATCH 046/112] build(deps): bump lodash from 4.17.20 to 4.17.21

Bumps [lodash](https://github.com/lodash/lodash) from 4.17.20 to 4.17.21.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.20...4.17.21)

Signed-off-by: dependabot[bot] 
---
 package-lock.json | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 15444de..6e827eb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -805,9 +805,9 @@
       }
     },
     "lodash": {
-      "version": "4.17.20",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-      "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
+      "version": "4.17.21",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
     },
     "log-symbols": {
       "version": "4.0.0",

From 3e1522e9dd2d8074b6c9a9a5c35b961049dd18ec Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Wed, 12 May 2021 00:06:00 +0800
Subject: [PATCH 047/112] refactor: update theme

---
 package-lock.json | 6 +++---
 package.json      | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 15444de..51bd6bb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -893,9 +893,9 @@
       "integrity": "sha1-Mswjj72pUEpmZVTkbZdlh8LA9Ww="
     },
     "loppo-theme-wangdoc": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/loppo-theme-wangdoc/-/loppo-theme-wangdoc-0.5.1.tgz",
-      "integrity": "sha512-tgGNCZeoKCcKDvwDmuoaOW3FJ0Q3Zvjj4JwLqxtU+rAeFz0YIIc0ZCgm5jXcaFxa+V79RzTu/JZKJq+os4no4A=="
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/loppo-theme-wangdoc/-/loppo-theme-wangdoc-0.5.2.tgz",
+      "integrity": "sha512-IkRaTMb5rg4AUHIoLCOkv3zYtJtn7NnUui70c3uR0LHKJGRy2vNru+NjOOxsIAns1I8FnEew3F4Hktex+RiFxw=="
     },
     "lower-case": {
       "version": "1.1.4",
diff --git a/package.json b/package.json
index e610caa..0713b02 100644
--- a/package.json
+++ b/package.json
@@ -38,6 +38,6 @@
     "gh-pages": "^3.1.0",
     "husky": "^4.3.8",
     "loppo": "^0.6.23",
-    "loppo-theme-wangdoc": "^0.5.1"
+    "loppo-theme-wangdoc": "^0.5.2"
   }
 }

From db30f689bffa1ec49085d6c9a070f0e08383896c Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Wed, 12 May 2021 00:08:11 +0800
Subject: [PATCH 048/112] docs(feature/error): fixed text

---
 docs/features/error.md | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/docs/features/error.md b/docs/features/error.md
index 7fc26b4..670e377 100644
--- a/docs/features/error.md
+++ b/docs/features/error.md
@@ -166,13 +166,15 @@ new UserError('这是自定义的错误!');
 `throw`语句的作用是手动中断程序执行,抛出一个错误。
 
 ```javascript
+var x = -1;
+
 if (x <= 0) {
   throw new Error('x 必须为正数');
 }
-// Uncaught ReferenceError: x is not defined
+// Uncaught Error: x 必须为正数
 ```
 
-上面代码中,如果变量`x`小于等于`0`,就手动抛出一个错误,告诉用户`x`的值不正确,整个程序就会在这里中断执行。可以看到,`throw`抛出的错误就是它的参数,这里是一个`Error`实例。
+上面代码中,如果变量`x`小于等于`0`,就手动抛出一个错误,告诉用户`x`的值不正确,整个程序就会在这里中断执行。可以看到,`throw`抛出的错误就是它的参数,这里是一个`Error`对象的实例。
 
 `throw`也可以抛出自定义错误。
 

From 4164309b0201bca8e91f70e871a06f1a4e58d6e1 Mon Sep 17 00:00:00 2001
From: mikusa <31799398+mikusaa@users.noreply.github.com>
Date: Sat, 15 May 2021 10:39:56 +0800
Subject: [PATCH 049/112] Update grammar.md

---
 docs/basic/grammar.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/basic/grammar.md b/docs/basic/grammar.md
index fdf6f33..a449c41 100644
--- a/docs/basic/grammar.md
+++ b/docs/basic/grammar.md
@@ -238,7 +238,7 @@ JavaScript 提供`if`结构和`switch`结构,完成条件判断,即只有满
 
 ### if 结构
 
-`if`结构先判断一个表达式的布尔值,然后根据布尔值的真伪,执行不同的语句。所谓布尔值,指的是 JavaScript 的两个特殊值,`true`表示真,`false`表示`伪`。
+`if`结构先判断一个表达式的布尔值,然后根据布尔值的真伪,执行不同的语句。所谓布尔值,指的是 JavaScript 的两个特殊值,`true`表示`真`,`false`表示`伪`。
 
 ```javascript
 if (布尔值)

From 2945da67858d2e1d93a8a08ed4d4eda94993b1a8 Mon Sep 17 00:00:00 2001
From: mikusa <31799398+mikusaa@users.noreply.github.com>
Date: Sat, 15 May 2021 18:06:54 +0800
Subject: [PATCH 050/112] Update function.md

---
 docs/types/function.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/types/function.md b/docs/types/function.md
index 98811c8..9003c93 100644
--- a/docs/types/function.md
+++ b/docs/types/function.md
@@ -803,7 +803,7 @@ function(){ /* code */ }();
 // SyntaxError: Unexpected token (
 ```
 
-产生这个错误的原因是,`function`这个关键字即可以当作语句,也可以当作表达式。
+产生这个错误的原因是,`function`这个关键字既可以当作语句,也可以当作表达式。
 
 ```javascript
 // 语句

From fe154d41cdf69877db2eb5d6615be3dc9662af7e Mon Sep 17 00:00:00 2001
From: mikusa <31799398+mikusaa@users.noreply.github.com>
Date: Sat, 15 May 2021 18:14:23 +0800
Subject: [PATCH 051/112] =?UTF-8?q?=E8=AF=AD=E7=97=85=E4=BF=AE=E6=AD=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 docs/types/function.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/types/function.md b/docs/types/function.md
index 9003c93..d8e649e 100644
--- a/docs/types/function.md
+++ b/docs/types/function.md
@@ -948,7 +948,7 @@ a // 2
 
 上面代码中,严格模式下,`eval`内部还是改写了外部变量,可见安全风险依然存在。
 
-总之,`eval`的本质是在当前作用域之中,注入代码。由于安全风险和不利于 JavaScript 引擎优化执行速度,所以一般不推荐使用。通常情况下,`eval`最常见的场合是解析 JSON 数据的字符串,不过正确的做法应该是使用原生的`JSON.parse`方法。
+总之,`eval`的本质是在当前作用域之中,注入代码。由于安全风险和不利于 JavaScript 引擎优化执行速度,一般不推荐使用。通常情况下,`eval`最常见的场合是解析 JSON 数据的字符串,不过正确的做法应该是使用原生的`JSON.parse`方法。
 
 ### eval 的别名调用
 

From 68c05037ee746077afbd43fbec1a21d21c8bb559 Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Wed, 19 May 2021 02:54:06 +0800
Subject: [PATCH 052/112] docs(basic/grammar): fix typo

---
 docs/basic/grammar.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/basic/grammar.md b/docs/basic/grammar.md
index a449c41..1611427 100644
--- a/docs/basic/grammar.md
+++ b/docs/basic/grammar.md
@@ -238,7 +238,7 @@ JavaScript 提供`if`结构和`switch`结构,完成条件判断,即只有满
 
 ### if 结构
 
-`if`结构先判断一个表达式的布尔值,然后根据布尔值的真伪,执行不同的语句。所谓布尔值,指的是 JavaScript 的两个特殊值,`true`表示`真`,`false`表示`伪`。
+`if`结构先判断一个表达式的布尔值,然后根据布尔值的真伪,执行不同的语句。所谓布尔值,指的是 JavaScript 的两个特殊值,`true`表示“真”,`false`表示“伪”。
 
 ```javascript
 if (布尔值)

From 9ca16cd97353659ee2528a49fd95ffa1db77bc9d Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Tue, 25 May 2021 13:31:18 +0800
Subject: [PATCH 053/112] docs(stdlib/array): edit text

---
 docs/stdlib/array.md | 42 +++++++++++++++++++++---------------------
 1 file changed, 21 insertions(+), 21 deletions(-)

diff --git a/docs/stdlib/array.md b/docs/stdlib/array.md
index caacce2..cd6cb45 100644
--- a/docs/stdlib/array.md
+++ b/docs/stdlib/array.md
@@ -446,7 +446,7 @@ a // [1, 2]
 
 ### map()
 
-`map`方法将数组的所有成员依次传入参数函数,然后把每一次的执行结果组成一个新数组返回。
+`map()`方法将数组的所有成员依次传入参数函数,然后把每一次的执行结果组成一个新数组返回。
 
 ```javascript
 var numbers = [1, 2, 3];
@@ -462,7 +462,7 @@ numbers
 
 上面代码中,`numbers`数组的所有成员依次执行参数函数,运行结果组成一个新数组返回,原数组没有变化。
 
-`map`方法接受一个函数作为参数。该函数调用时,`map`方法向它传入三个参数:当前成员、当前位置和数组本身。
+`map()`方法接受一个函数作为参数。该函数调用时,`map()`方法向它传入三个参数:当前成员、当前位置和数组本身。
 
 ```javascript
 [1, 2, 3].map(function(elem, index, arr) {
@@ -471,9 +471,9 @@ numbers
 // [0, 2, 6]
 ```
 
-上面代码中,`map`方法的回调函数有三个参数,`elem`为当前成员的值,`index`为当前成员的位置,`arr`为原数组(`[1, 2, 3]`)。
+上面代码中,`map()`方法的回调函数有三个参数,`elem`为当前成员的值,`index`为当前成员的位置,`arr`为原数组(`[1, 2, 3]`)。
 
-`map`方法还可以接受第二个参数,用来绑定回调函数内部的`this`变量(详见《this 变量》一章)。
+`map()`方法还可以接受第二个参数,用来绑定回调函数内部的`this`变量(详见《this 变量》一章)。
 
 ```javascript
 var arr = ['a', 'b', 'c'];
@@ -484,9 +484,9 @@ var arr = ['a', 'b', 'c'];
 // ['b', 'c']
 ```
 
-上面代码通过`map`方法的第二个参数,将回调函数内部的`this`对象,指向`arr`数组。
+上面代码通过`map()`方法的第二个参数,将回调函数内部的`this`对象,指向`arr`数组。
 
-如果数组有空位,`map`方法的回调函数在这个位置不会执行,会跳过数组的空位。
+如果数组有空位,`map()`方法的回调函数在这个位置不会执行,会跳过数组的空位。
 
 ```javascript
 var f = function (n) { return 'a' };
@@ -496,13 +496,13 @@ var f = function (n) { return 'a' };
 [1, , 2].map(f) // ["a", , "a"]
 ```
 
-上面代码中,`map`方法不会跳过`undefined`和`null`,但是会跳过空位。
+上面代码中,`map()`方法不会跳过`undefined`和`null`,但是会跳过空位。
 
 ### forEach()
 
-`forEach`方法与`map`方法很相似,也是对数组的所有成员依次执行参数函数。但是,`forEach`方法不返回值,只用来操作数据。这就是说,如果数组遍历的目的是为了得到返回值,那么使用`map`方法,否则使用`forEach`方法。
+`forEach()`方法与`map()`方法很相似,也是对数组的所有成员依次执行参数函数。但是,`forEach()`方法不返回值,只用来操作数据。这就是说,如果数组遍历的目的是为了得到返回值,那么使用`map()`方法,否则使用`forEach()`方法。
 
-`forEach`的用法与`map`方法一致,参数是一个函数,该函数同样接受三个参数:当前值、当前位置、整个数组。
+`forEach()`的用法与`map()`方法一致,参数是一个函数,该函数同样接受三个参数:当前值、当前位置、整个数组。
 
 ```javascript
 function log(element, index, array) {
@@ -515,9 +515,9 @@ function log(element, index, array) {
 // [2] = 9
 ```
 
-上面代码中,`forEach`遍历数组不是为了得到返回值,而是为了在屏幕输出内容,所以不必使用`map`方法。
+上面代码中,`forEach()`遍历数组不是为了得到返回值,而是为了在屏幕输出内容,所以不必使用`map()`方法。
 
-`forEach`方法也可以接受第二个参数,绑定参数函数的`this`变量。
+`forEach()`方法也可以接受第二个参数,绑定参数函数的`this`变量。
 
 ```javascript
 var out = [];
@@ -529,9 +529,9 @@ var out = [];
 out // [1, 4, 9]
 ```
 
-上面代码中,空数组`out`是`forEach`方法的第二个参数,结果,回调函数内部的`this`关键字就指向`out`。
+上面代码中,空数组`out`是`forEach()`方法的第二个参数,结果,回调函数内部的`this`关键字就指向`out`。
 
-注意,`forEach`方法无法中断执行,总是会将所有成员遍历完。如果希望符合某种条件时,就中断遍历,要使用`for`循环。
+注意,`forEach()`方法无法中断执行,总是会将所有成员遍历完。如果希望符合某种条件时,就中断遍历,要使用`for`循环。
 
 ```javascript
 var arr = [1, 2, 3];
@@ -543,9 +543,9 @@ for (var i = 0; i < arr.length; i++) {
 // 1
 ```
 
-上面代码中,执行到数组的第二个成员时,就会中断执行。`forEach`方法做不到这一点。
+上面代码中,执行到数组的第二个成员时,就会中断执行。`forEach()`方法做不到这一点。
 
-`forEach`方法也会跳过数组的空位。
+`forEach()`方法也会跳过数组的空位。
 
 ```javascript
 var log = function (n) {
@@ -567,11 +567,11 @@ var log = function (n) {
 // 3
 ```
 
-上面代码中,`forEach`方法不会跳过`undefined`和`null`,但会跳过空位。
+上面代码中,`forEach()`方法不会跳过`undefined`和`null`,但会跳过空位。
 
 ### filter()
 
-`filter`方法用于过滤数组成员,满足条件的成员组成一个新数组返回。
+`filter()`方法用于过滤数组成员,满足条件的成员组成一个新数组返回。
 
 它的参数是一个函数,所有数组成员依次执行该函数,返回结果为`true`的成员组成一个新数组返回。该方法不会改变原数组。
 
@@ -591,9 +591,9 @@ arr.filter(Boolean)
 // [1, "a"]
 ```
 
-上面代码中,`filter`方法返回数组`arr`里面所有布尔值为`true`的成员。
+上面代码中,`filter()`方法返回数组`arr`里面所有布尔值为`true`的成员。
 
-`filter`方法的参数函数可以接受三个参数:当前成员,当前位置和整个数组。
+`filter()`方法的参数函数可以接受三个参数:当前成员,当前位置和整个数组。
 
 ```javascript
 [1, 2, 3, 4, 5].filter(function (elem, index, arr) {
@@ -604,7 +604,7 @@ arr.filter(Boolean)
 
 上面代码返回偶数位置的成员组成的新数组。
 
-`filter`方法还可以接受第二个参数,用来绑定参数函数内部的`this`变量。
+`filter()`方法还可以接受第二个参数,用来绑定参数函数内部的`this`变量。
 
 ```javascript
 var obj = { MAX: 3 };
@@ -616,7 +616,7 @@ var arr = [2, 8, 3, 4, 1, 3, 2, 9];
 arr.filter(myFilter, obj) // [8, 4, 9]
 ```
 
-上面代码中,过滤器`myFilter`内部有`this`变量,它可以被`filter`方法的第二个参数`obj`绑定,返回大于`3`的成员。
+上面代码中,过滤器`myFilter()`内部有`this`变量,它可以被`filter()`方法的第二个参数`obj`绑定,返回大于`3`的成员。
 
 ### some(),every()
 

From bae4e98c83d2ac41f1b447f32fa251ff6bc10749 Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Wed, 14 Jul 2021 16:26:05 +0800
Subject: [PATCH 054/112] docs(stdlib/attribute): fixed #226 edit configurable

---
 docs/stdlib/attributes.md | 18 +++++++++---------
 package-lock.json         | 12 ++++++------
 package.json              |  2 +-
 3 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/docs/stdlib/attributes.md b/docs/stdlib/attributes.md
index f1f3af6..cad729f 100644
--- a/docs/stdlib/attributes.md
+++ b/docs/stdlib/attributes.md
@@ -33,7 +33,7 @@ JavaScript 提供了一个内部数据结构,用来描述对象的属性,控
 
 (4)`configurable`
 
-`configurable`是一个布尔值,表示可配置性,默认为`true`。如果设为`false`,将阻止某些操作改写该属性,比如无法删除该属性,也不得改变该属性的属性描述对象(`value`属性除外)。也就是说,`configurable`属性控制了属性描述对象的可写性。
+`configurable`是一个布尔值,表示属性的可配置性,默认为`true`。如果设为`false`,将阻止某些操作改写属性描述对象,比如无法删除该属性,也不得改变各种元属性(`value`属性除外)。也就是说,`configurable`属性控制了属性描述对象的可写性。
 
 (5)`get`
 
@@ -350,7 +350,7 @@ JSON.stringify(obj) // "{}"
 
 ### configurable
 
-`configurable`(可配置性)返回一个布尔值,决定了是否可以修改属性描述对象。也就是说,`configurable`为`false`时,`value`、`writable`、`enumerable`和`configurable`都不能被修改了。
+`configurable`(可配置性)返回一个布尔值,决定了是否可以修改属性描述对象。也就是说,`configurable`为`false`时,`writable`、`enumerable`和`configurable`都不能被修改了。
 
 ```javascript
 var obj = Object.defineProperty({}, 'p', {
@@ -360,9 +360,6 @@ var obj = Object.defineProperty({}, 'p', {
   configurable: false
 });
 
-Object.defineProperty(obj, 'p', {value: 2})
-// TypeError: Cannot redefine property: p
-
 Object.defineProperty(obj, 'p', {writable: true})
 // TypeError: Cannot redefine property: p
 
@@ -371,11 +368,14 @@ Object.defineProperty(obj, 'p', {enumerable: true})
 
 Object.defineProperty(obj, 'p', {configurable: true})
 // TypeError: Cannot redefine property: p
+
+Object.defineProperty(obj, 'p', {value: 2})
+// TypeError: Cannot redefine property: p
 ```
 
-上面代码中,`obj.p`的`configurable`为`false`。然后,改动`value`、`writable`、`enumerable`、`configurable`,结果都报错。
+上面代码中,`obj.p`的`configurable`属性为`false`。然后,改动`writable`、`enumerable`、`configurable`,结果都报错。
 
-注意,`writable`只有在`false`改为`true`会报错,`true`改为`false`是允许的。
+注意,`writable`属性只有在`false`改为`true`时会报错,`true`改为`false`是允许的。
 
 ```javascript
 var obj = Object.defineProperty({}, 'p', {
@@ -387,7 +387,7 @@ Object.defineProperty(obj, 'p', {writable: false})
 // 修改成功
 ```
 
-至于`value`,只要`writable`和`configurable`有一个为`true`,就允许改动。
+`value`属性的情况比较特殊。只要`writable`和`configurable`有一个为`true`,就允许改动`value`。
 
 ```javascript
 var o1 = Object.defineProperty({}, 'p', {
@@ -409,7 +409,7 @@ Object.defineProperty(o2, 'p', {value: 2})
 // 修改成功
 ```
 
-另外,`writable`为`false`时,直接目标属性赋值,不报错,但不会成功。
+另外,`writable`为`false`时,直接对目标属性赋值,不报错,但不会成功。
 
 ```javascript
 var obj = Object.defineProperty({}, 'p', {
diff --git a/package-lock.json b/package-lock.json
index f76e307..b435362 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -526,9 +526,9 @@
       "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
     },
     "gh-pages": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-3.1.0.tgz",
-      "integrity": "sha512-3b1rly9kuf3/dXsT8+ZxP0UhNLOo1CItj+3e31yUVcaph/yDsJ9RzD7JOw5o5zpBTJVQLlJAASNkUfepi9fe2w==",
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-3.2.0.tgz",
+      "integrity": "sha512-VQTwyRtxoaId0YmDXdC/G854dojpwTuOdpZUL3PGG6WQZvSoGVD8ggedKARZltixIREMezoDywE+g3g2paLxPw==",
       "requires": {
         "async": "^2.6.1",
         "commander": "^2.18.0",
@@ -548,9 +548,9 @@
       }
     },
     "glob": {
-      "version": "7.1.6",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
-      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+      "version": "7.1.7",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+      "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
       "requires": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
diff --git a/package.json b/package.json
index 0713b02..fbb7e46 100644
--- a/package.json
+++ b/package.json
@@ -35,7 +35,7 @@
   },
   "homepage": "https://github.com/wangdoc/javascript-tutorial",
   "dependencies": {
-    "gh-pages": "^3.1.0",
+    "gh-pages": "^3.2.0",
     "husky": "^4.3.8",
     "loppo": "^0.6.23",
     "loppo-theme-wangdoc": "^0.5.2"

From e90b8a13fcac3adde61252f46b91df43f851979c Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Wed, 21 Jul 2021 12:41:30 +0800
Subject: [PATCH 055/112] docs(stdlib/array): fixed #228 reduce()

---
 docs/stdlib/array.md | 47 +++++++++++++++--------
 package-lock.json    | 90 ++++++--------------------------------------
 package.json         |  2 +-
 3 files changed, 44 insertions(+), 95 deletions(-)

diff --git a/docs/stdlib/array.md b/docs/stdlib/array.md
index cd6cb45..e7b4359 100644
--- a/docs/stdlib/array.md
+++ b/docs/stdlib/array.md
@@ -1,4 +1,4 @@
- Array 对象
+# Array 对象
 
 ## 构造函数
 
@@ -661,7 +661,7 @@ function isEven(x) { return x % 2 === 0 }
 
 ### reduce(),reduceRight()
 
-`reduce`方法和`reduceRight`方法依次处理数组的每个成员,最终累计为一个值。它们的差别是,`reduce`是从左到右处理(从第一个成员到最后一个成员),`reduceRight`则是从右到左(从最后一个成员到第一个成员),其他完全一样。
+`reduce()`方法和`reduceRight()`方法依次处理数组的每个成员,最终累计为一个值。它们的差别是,`reduce()`是从左到右处理(从第一个成员到最后一个成员),`reduceRight()`则是从右到左(从最后一个成员到第一个成员),其他完全一样。
 
 ```javascript
 [1, 2, 3, 4, 5].reduce(function (a, b) {
@@ -675,18 +675,33 @@ function isEven(x) { return x % 2 === 0 }
 //最后结果:15
 ```
 
-上面代码中,`reduce`方法求出数组所有成员的和。第一次执行,`a`是数组的第一个成员`1`,`b`是数组的第二个成员`2`。第二次执行,`a`为上一轮的返回值`3`,`b`为第三个成员`3`。第三次执行,`a`为上一轮的返回值`6`,`b`为第四个成员`4`。第四次执行,`a`为上一轮返回值`10`,`b`为第五个成员`5`。至此所有成员遍历完成,整个方法的返回值就是最后一轮的返回值`15`。
+上面代码中,`reduce()`方法用来求出数组所有成员的和。`reduce()`的参数是一个函数,数组每个成员都会依次执行这个函数。如果数组有 n 个成员,这个参数函数就会执行 n - 1 次。
 
-`reduce`方法和`reduceRight`方法的第一个参数都是一个函数。该函数接受以下四个参数。
+- 第一次执行:`a`是数组的第一个成员`1`,`b`是数组的第二个成员`2`。
+- 第二次执行:`a`为上一轮的返回值`3`,`b`为第三个成员`3`。
+- 第三次执行:`a`为上一轮的返回值`6`,`b`为第四个成员`4`。
+- 第四次执行:`a`为上一轮返回值`10`,`b`为第五个成员`5`。至此所有成员遍历完成,整个方法的返回值就是最后一轮的返回值`15`。
 
-1. 累积变量,默认为数组的第一个成员
-2. 当前变量,默认为数组的第二个成员
-3. 当前位置(从0开始)
-4. 原数组
+`reduce()`方法和`reduceRight()`方法的第一个参数都是一个函数。该函数接受以下四个参数。
+
+1. 累积变量。第一次执行时,默认为数组的第一个成员;以后每次执行时,都是上一轮的返回值。
+2. 当前变量。第一次执行时,默认为数组的第二个成员;以后每次执行时,都是下一个成员。
+3. 当前位置。一个整数,表示第二个参数(当前变量)的位置,默认为`1`。
+4. 原数组。
 
 这四个参数之中,只有前两个是必须的,后两个则是可选的。
 
-如果要对累积变量指定初值,可以把它放在`reduce`方法和`reduceRight`方法的第二个参数。
+```javascript
+[1, 2, 3, 4, 5].reduce(function (
+  a,   // 累积变量,必须
+  b,   // 当前变量,必须
+  i,   // 当前位置,可选
+  arr  // 原数组,可选
+) {
+  // ... ...
+```
+
+如果要对累积变量指定初值,可以把它放在`reduce()`方法和`reduceRight()`方法的第二个参数。
 
 ```javascript
 [1, 2, 3, 4, 5].reduce(function (a, b) {
@@ -695,9 +710,9 @@ function isEven(x) { return x % 2 === 0 }
 // 25
 ```
 
-上面代码指定参数`a`的初值为10,所以数组从10开始累加,最终结果为25。注意,这时`b`是从数组的第一个成员开始遍历。
+上面代码指定参数`a`的初值为10,所以数组从10开始累加,最终结果为25。注意,这时`b`是从数组的第一个成员开始遍历,参数函数会执行5次。
 
-上面的第二个参数相当于设定了默认值,处理空数组时尤其有用。
+建议总是加上第二个参数,这样比较符合直觉,每个数组成员都会依次执行`reduce()`方法的参数函数。另外,第二个参数可以防止空数组报错。
 
 ```javascript
 function add(prev, cur) {
@@ -710,9 +725,9 @@ function add(prev, cur) {
 // 1
 ```
 
-上面代码中,由于空数组取不到初始值,`reduce`方法会报错。这时,加上第二个参数,就能保证总是会返回一个值。
+上面代码中,由于空数组取不到累积变量的初始值,`reduce()`方法会报错。这时,加上第二个参数,就能保证总是会返回一个值。
 
-下面是一个`reduceRight`方法的例子。
+下面是一个`reduceRight()`方法的例子。
 
 ```javascript
 function subtract(prev, cur) {
@@ -723,9 +738,9 @@ function subtract(prev, cur) {
 [3, 2, 1].reduceRight(subtract) // -4
 ```
 
-上面代码中,`reduce`方法相当于`3`减去`2`再减去`1`,`reduceRight`方法相当于`1`减去`2`再减去`3`。
+上面代码中,`reduce()`方法相当于`3`减去`2`再减去`1`,`reduceRight`方法相当于`1`减去`2`再减去`3`。
 
-由于这两个方法会遍历数组,所以实际上还可以用来做一些遍历相关的操作。比如,找出字符长度最长的数组成员。
+由于这两个方法会遍历数组,所以实际上可以用来做一些遍历相关的操作。比如,找出字符长度最长的数组成员。
 
 ```javascript
 function findLongest(entries) {
@@ -737,7 +752,7 @@ function findLongest(entries) {
 findLongest(['aaa', 'bb', 'c']) // "aaa"
 ```
 
-上面代码中,`reduce`的参数函数会将字符长度较长的那个数组成员,作为累积值。这导致遍历所有成员之后,累积值就是字符长度最长的那个成员。
+上面代码中,`reduce()`的参数函数会将字符长度较长的那个数组成员,作为累积值。这导致遍历所有成员之后,累积值就是字符长度最长的那个成员。
 
 ### indexOf(),lastIndexOf()
 
diff --git a/package-lock.json b/package-lock.json
index b435362..5c9e66e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -421,29 +421,20 @@
       "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
     },
     "filename-reserved-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz",
-      "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q="
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
+      "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik="
     },
     "filenamify": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz",
-      "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=",
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz",
+      "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==",
       "requires": {
-        "filename-reserved-regex": "^1.0.0",
-        "strip-outer": "^1.0.0",
+        "filename-reserved-regex": "^2.0.0",
+        "strip-outer": "^1.0.1",
         "trim-repeated": "^1.0.0"
       }
     },
-    "filenamify-url": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/filenamify-url/-/filenamify-url-1.0.0.tgz",
-      "integrity": "sha1-syvYExnvWGO3MHi+1Q9GpPeXX1A=",
-      "requires": {
-        "filenamify": "^1.0.0",
-        "humanize-url": "^1.0.0"
-      }
-    },
     "finalhandler": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
@@ -526,14 +517,14 @@
       "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
     },
     "gh-pages": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-3.2.0.tgz",
-      "integrity": "sha512-VQTwyRtxoaId0YmDXdC/G854dojpwTuOdpZUL3PGG6WQZvSoGVD8ggedKARZltixIREMezoDywE+g3g2paLxPw==",
+      "version": "3.2.3",
+      "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-3.2.3.tgz",
+      "integrity": "sha512-jA1PbapQ1jqzacECfjUaO9gV8uBgU6XNMV0oXLtfCX3haGLe5Atq8BxlrADhbD6/UdG9j6tZLWAkAybndOXTJg==",
       "requires": {
         "async": "^2.6.1",
         "commander": "^2.18.0",
         "email-addresses": "^3.0.1",
-        "filenamify-url": "^1.0.0",
+        "filenamify": "^4.3.0",
         "find-cache-dir": "^3.3.1",
         "fs-extra": "^8.1.0",
         "globby": "^6.1.0"
@@ -641,15 +632,6 @@
         "toidentifier": "1.0.0"
       }
     },
-    "humanize-url": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/humanize-url/-/humanize-url-1.0.1.tgz",
-      "integrity": "sha1-9KuZ4NKIF0yk4eUEB8VfuuRk7/8=",
-      "requires": {
-        "normalize-url": "^1.0.0",
-        "strip-url-auth": "^1.0.0"
-      }
-    },
     "husky": {
       "version": "4.3.8",
       "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.8.tgz",
@@ -743,11 +725,6 @@
       "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
       "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
     },
-    "is-plain-obj": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
-      "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
-    },
     "js-tokens": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -1047,17 +1024,6 @@
         "lower-case": "^1.1.1"
       }
     },
-    "normalize-url": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
-      "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
-      "requires": {
-        "object-assign": "^4.0.1",
-        "prepend-http": "^1.0.0",
-        "query-string": "^4.1.0",
-        "sort-keys": "^1.0.0"
-      }
-    },
     "object-assign": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -1186,11 +1152,6 @@
         "semver-compare": "^1.0.0"
       }
     },
-    "prepend-http": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
-      "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
-    },
     "promptly": {
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/promptly/-/promptly-3.2.0.tgz",
@@ -1199,15 +1160,6 @@
         "read": "^1.0.4"
       }
     },
-    "query-string": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
-      "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
-      "requires": {
-        "object-assign": "^4.1.0",
-        "strict-uri-encode": "^1.0.0"
-      }
-    },
     "range-parser": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
@@ -1319,14 +1271,6 @@
       "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
       "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
     },
-    "sort-keys": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
-      "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
-      "requires": {
-        "is-plain-obj": "^1.0.0"
-      }
-    },
     "source-map": {
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -1359,11 +1303,6 @@
         }
       }
     },
-    "strict-uri-encode": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
-      "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
-    },
     "string-width": {
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
@@ -1397,11 +1336,6 @@
         "escape-string-regexp": "^1.0.2"
       }
     },
-    "strip-url-auth": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/strip-url-auth/-/strip-url-auth-1.0.1.tgz",
-      "integrity": "sha1-IrD6OkE4WzO+PzMVUbu4N/oM164="
-    },
     "supports-color": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
diff --git a/package.json b/package.json
index fbb7e46..acd23bc 100644
--- a/package.json
+++ b/package.json
@@ -35,7 +35,7 @@
   },
   "homepage": "https://github.com/wangdoc/javascript-tutorial",
   "dependencies": {
-    "gh-pages": "^3.2.0",
+    "gh-pages": "^3.2.3",
     "husky": "^4.3.8",
     "loppo": "^0.6.23",
     "loppo-theme-wangdoc": "^0.5.2"

From 95e72ae23c518f5f756e987646ce9dd7758733dc Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Thu, 5 Aug 2021 19:40:59 +0800
Subject: [PATCH 056/112] docs(dom/document): edit document.stylesheets

---
 docs/dom/document.md | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/docs/dom/document.md b/docs/dom/document.md
index 46da3e9..3eb1d02 100644
--- a/docs/dom/document.md
+++ b/docs/dom/document.md
@@ -145,11 +145,11 @@ if (scripts.length !== 0 ) {
 
 **(6)document.styleSheets**
 
-`document.styleSheets`属性返回文档内嵌或引入的样式表集合,详细介绍请看《CSS 对象模型》一章。
+`document.styleSheets`属性返回网页内嵌或引入的 CSS 样式表集合,详细介绍请看《CSS 操作》一章。
 
 **(7)小结**
 
-除了`document.styleSheets`,以上的集合属性返回的都是`HTMLCollection`实例。
+除了`document.styleSheets`属性,以上的其他集合属性返回的都是`HTMLCollection`实例。`document.styleSheets`属性返回的是`StyleSheetList`实例。
 
 ```javascript
 document.links instanceof HTMLCollection // true
@@ -159,7 +159,7 @@ document.embeds instanceof HTMLCollection // true
 document.scripts instanceof HTMLCollection // true
 ```
 
-`HTMLCollection`实例是类似数组的对象,所以这些属性都有`length`属性,都可以使用方括号运算符引用成员。如果成员有`id`或`name`属性,还可以用这两个属性的值,在`HTMLCollection`实例上引用到这个成员。
+`HTMLCollection`实例是类似数组的对象,所以上面这些属性都有`length`属性,都可以使用方括号运算符引用成员。如果成员有`id`或`name`属性,还可以用这两个属性的值,在`HTMLCollection`实例上引用到这个成员。
 
 ```javascript
 // HTML 代码如下

From 3d8337c0f57f5119254f52c7074b21620cced061 Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Tue, 10 Aug 2021 00:56:10 +0800
Subject: [PATCH 057/112] docs(dom/mutationobserver): fix typo

---
 docs/dom/mutationobserver.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/dom/mutationobserver.md b/docs/dom/mutationobserver.md
index 12651c2..ace5853 100644
--- a/docs/dom/mutationobserver.md
+++ b/docs/dom/mutationobserver.md
@@ -98,7 +98,7 @@ var observer = new MutationObserver(function(mutations) {
 observer.observe(document, { childList: true, subtree: true });
 ```
 
-### disconnect(),takeRecords()
+### disconnect(),takeRecords()
 
 `disconnect()`方法用来停止观察。调用该方法后,DOM 再发生变动,也不会触发观察器。
 

From 5d7484cdadfe9a7e47d0ff579d8bed5eda30f170 Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Tue, 10 Aug 2021 01:38:06 +0800
Subject: [PATCH 058/112] docs(event/eventTarget): fixed #231

---
 docs/events/eventtarget.md | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/docs/events/eventtarget.md b/docs/events/eventtarget.md
index 40de255..da89d9a 100644
--- a/docs/events/eventtarget.md
+++ b/docs/events/eventtarget.md
@@ -8,25 +8,33 @@ DOM 的事件操作(监听和触发),都定义在`EventTarget`接口。所
 
 该接口主要提供三个实例方法。
 
-- `addEventListener`:绑定事件的监听函数
-- `removeEventListener`:移除事件的监听函数
-- `dispatchEvent`:触发事件
+- `addEventListener()`:绑定事件的监听函数
+- `removeEventListener()`:移除事件的监听函数
+- `dispatchEvent()`:触发事件
 
 ## EventTarget.addEventListener()
 
-`EventTarget.addEventListener()`用于在当前节点或对象上,定义一个特定事件的监听函数。一旦这个事件发生,就会执行监听函数。该方法没有返回值。
+`EventTarget.addEventListener()`用于在当前节点或对象上(即部署了 EventTarget 接口的对象),定义一个特定事件的监听函数。一旦这个事件发生,就会执行监听函数。该方法没有返回值。
 
 ```javascript
+targent.addEventListener(type, listener[, options]);
+// 或者
 target.addEventListener(type, listener[, useCapture]);
 ```
 
-该方法接受三个参数。
+该方法接受三个参数,前两个参数的含义如下。
 
 - `type`:事件名称,大小写敏感。
 - `listener`:监听函数。事件发生时,会调用该监听函数。
-- `useCapture`:布尔值,表示监听函数是否在捕获阶段(capture)触发(参见后文《事件的传播》部分),默认为`false`(监听函数只在冒泡阶段被触发)。该参数可选。
 
-下面是一个例子。
+第三个参数有两种形式。如果是一个对象`options`,表示监听器的配置对象,用来对监听行为进行配置,有以下属性。
+
+- `capture`:布尔值,如果设为`true`,表示监听函数在捕获阶段触发,默认为`false`,在冒泡阶段触发。
+- `once`:布尔值,如果设为`true`,表示监听函数触发后,只执行一次就会被移除。同样事件再次发生时,该监听函数将不存在。该属性默认值为`false`。
+- `passive`:布尔值,设为`true`时,表示监听函数不会调用`preventDefault()`阻止浏览器的默认行为,如果调用这个函数,将没有任何效果,并且控制台会打印一条报错信息。这个属性默认值为`false`。
+- `signal`:该属性的值为一个 AbortSignal 对象,为监听器设置了一个信号通道,用来在需要时发出信号,移除监听函数。
+
+第三个参数如果是一个布尔值`useCapture`,则表示监听函数是否在捕获阶段(capture)触发(参见后文《事件的传播》部分)。该参数可选,默认值为`false`(监听函数只在冒泡阶段被触发)。下面是一个例子。
 
 ```javascript
 function hello() {

From 3e1a5b67650be107635f8ae3146cf4e5cbd97315 Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Tue, 10 Aug 2021 08:46:14 +0800
Subject: [PATCH 059/112] docs(event/eventtarget): edit text

---
 docs/events/eventtarget.md | 56 ++++++++++++++++++--------------------
 1 file changed, 26 insertions(+), 30 deletions(-)

diff --git a/docs/events/eventtarget.md b/docs/events/eventtarget.md
index da89d9a..ca69057 100644
--- a/docs/events/eventtarget.md
+++ b/docs/events/eventtarget.md
@@ -2,9 +2,11 @@
 
 事件的本质是程序各个组成部分之间的一种通信方式,也是异步编程的一种实现。DOM 支持大量的事件,本章开始介绍 DOM 的事件编程。
 
+介绍具体的事件之前,先来看看如何让 DOM 节点监听事件。
+
 ## 概述
 
-DOM 的事件操作(监听和触发),都定义在`EventTarget`接口。所有节点对象都部署了这个接口,其他一些需要事件通信的浏览器内置对象(比如,`XMLHttpRequest`、`AudioNode`、`AudioContext`)也部署了这个接口。
+DOM 节点的事件操作(监听和触发),都定义在`EventTarget`接口。所有节点对象都部署了这个接口,其他一些需要事件通信的浏览器内置对象(比如,`XMLHttpRequest`、`AudioNode`、`AudioContext`)也部署了这个接口。
 
 该接口主要提供三个实例方法。
 
@@ -17,24 +19,16 @@ DOM 的事件操作(监听和触发),都定义在`EventTarget`接口。所
 `EventTarget.addEventListener()`用于在当前节点或对象上(即部署了 EventTarget 接口的对象),定义一个特定事件的监听函数。一旦这个事件发生,就会执行监听函数。该方法没有返回值。
 
 ```javascript
-targent.addEventListener(type, listener[, options]);
-// 或者
 target.addEventListener(type, listener[, useCapture]);
 ```
 
-该方法接受三个参数,前两个参数的含义如下。
+该方法接受三个参数。
 
 - `type`:事件名称,大小写敏感。
 - `listener`:监听函数。事件发生时,会调用该监听函数。
+- `useCapture`:布尔值,如果设为`true`,表示监听函数将在捕获阶段(capture)触发(参见后文《事件的传播》部分)。该参数可选,默认值为`false`(监听函数只在冒泡阶段被触发)。
 
-第三个参数有两种形式。如果是一个对象`options`,表示监听器的配置对象,用来对监听行为进行配置,有以下属性。
-
-- `capture`:布尔值,如果设为`true`,表示监听函数在捕获阶段触发,默认为`false`,在冒泡阶段触发。
-- `once`:布尔值,如果设为`true`,表示监听函数触发后,只执行一次就会被移除。同样事件再次发生时,该监听函数将不存在。该属性默认值为`false`。
-- `passive`:布尔值,设为`true`时,表示监听函数不会调用`preventDefault()`阻止浏览器的默认行为,如果调用这个函数,将没有任何效果,并且控制台会打印一条报错信息。这个属性默认值为`false`。
-- `signal`:该属性的值为一个 AbortSignal 对象,为监听器设置了一个信号通道,用来在需要时发出信号,移除监听函数。
-
-第三个参数如果是一个布尔值`useCapture`,则表示监听函数是否在捕获阶段(capture)触发(参见后文《事件的传播》部分)。该参数可选,默认值为`false`(监听函数只在冒泡阶段被触发)。下面是一个例子。
+下面是一个例子。
 
 ```javascript
 function hello() {
@@ -45,11 +39,11 @@ var button = document.getElementById('btn');
 button.addEventListener('click', hello, false);
 ```
 
-上面代码中,`button`节点的`addEventListener`方法绑定`click`事件的监听函数`hello`,该函数只在冒泡阶段触发。
+上面代码中,`button`节点的`addEventListener()`方法绑定`click`事件的监听函数`hello()`,该函数只在冒泡阶段触发。
 
 关于参数,有两个地方需要注意。
 
-首先,第二个参数除了监听函数,还可以是一个具有`handleEvent`方法的对象。
+首先,第二个参数除了监听函数,还可以是一个具有`handleEvent`方法的对象,效果与监听函数一样。
 
 ```javascript
 buttonElement.addEventListener('click', {
@@ -59,15 +53,16 @@ buttonElement.addEventListener('click', {
 });
 ```
 
-上面代码中,`addEventListener`方法的第二个参数,就是一个具有`handleEvent`方法的对象。
+上面代码中,`addEventListener()`方法的第二个参数,就是一个具有`handleEvent()`方法的对象。
 
-其次,第三个参数除了布尔值`useCapture`,还可以是一个属性配置对象。该对象有以下属性。
+其次,第三个参数除了布尔值`useCapture`,还可以是一个监听器配置对象,定制事件监听行为。该对象有以下属性。
 
-> - `capture`:布尔值,表示该事件是否在`捕获阶段`触发监听函数。
-> - `once`:布尔值,表示监听函数是否只触发一次,然后就自动移除。
-> - `passive`:布尔值,表示监听函数不会调用事件的`preventDefault`方法。如果监听函数调用了,浏览器将忽略这个要求,并在监控台输出一行警告。
+> - `capture`:布尔值,如果设为`true`,表示监听函数在捕获阶段触发,默认为`false`,在冒泡阶段触发。
+> - `once`:布尔值,如果设为`true`,表示监听函数执行一次就会自动移除,后面将不再监听该事件。该属性默认值为`false`。
+> - `passive`:布尔值,设为`true`时,表示禁止监听函数调用`preventDefault()`方法。如果调用了,浏览器将忽略这个要求,并在控制台输出一条警告。该属性默认值为`false`。
+> - `signal`:该属性的值为一个 AbortSignal 对象,为监听器设置了一个信号通道,用来在需要时发出信号,移除监听函数。
 
-如果希望事件监听函数只执行一次,可以打开属性配置对象的`once`属性。
+下面是`once`属性的例子,让监听函数只执行一次。
 
 ```javascript
 element.addEventListener('click', function (event) {
@@ -75,7 +70,7 @@ element.addEventListener('click', function (event) {
 }, {once: true});
 ```
 
-`addEventListener`方法可以为针对当前对象的同一个事件,添加多个不同的监听函数。这些函数按照添加顺序触发,即先添加先触发。如果为同一个事件多次添加同一个监听函数,该函数只会执行一次,多余的添加将自动被去除(不必使用`removeEventListener`方法手动去除)。
+`addEventListener()`方法可以为针对当前对象的同一个事件,添加多个不同的监听函数。这些函数按照添加顺序触发,即先添加先触发。如果为同一个事件多次添加同一个监听函数,该函数只会执行一次,多余的添加将自动被去除(不必使用`removeEventListener()`方法手动去除)。
 
 ```javascript
 function hello() {
@@ -116,40 +111,40 @@ para.addEventListener('click', function (e) {
 
 ## EventTarget.removeEventListener()
 
-`EventTarget.removeEventListener`方法用来移除`addEventListener`方法添加的事件监听函数。该方法没有返回值。
+`EventTarget.removeEventListener()`方法用来移除`addEventListener()`方法添加的事件监听函数。该方法没有返回值。
 
 ```javascript
 div.addEventListener('click', listener, false);
 div.removeEventListener('click', listener, false);
 ```
 
-`removeEventListener`方法的参数,与`addEventListener`方法完全一致。它的第一个参数“事件类型”,大小写敏感。
+`removeEventListener()`方法的参数,与`addEventListener()`方法完全一致。它的第一个参数“事件类型”,大小写敏感。
 
-注意,`removeEventListener`方法移除的监听函数,必须是`addEventListener`方法添加的那个监听函数,而且必须在同一个元素节点,否则无效。
+注意,`removeEventListener()`方法移除的监听函数,必须是`addEventListener()`方法添加的那个监听函数,而且必须在同一个元素节点,否则无效。
 
 ```javascript
 div.addEventListener('click', function (e) {}, false);
 div.removeEventListener('click', function (e) {}, false);
 ```
 
-上面代码中,`removeEventListener`方法无效,因为监听函数不是同一个匿名函数。
+上面代码中,`removeEventListener()`方法无效,因为监听函数不是同一个匿名函数。
 
 ```javascript
 element.addEventListener('mousedown', handleMouseDown, true);
 element.removeEventListener("mousedown", handleMouseDown, false);
 ```
 
-上面代码中,`removeEventListener`方法也是无效的,因为第三个参数不一样。
+上面代码中,`removeEventListener()`方法也是无效的,因为第三个参数不一样。
 
 ## EventTarget.dispatchEvent()
 
-`EventTarget.dispatchEvent`方法在当前节点上触发指定事件,从而触发监听函数的执行。该方法返回一个布尔值,只要有一个监听函数调用了`Event.preventDefault()`,则返回值为`false`,否则为`true`。
+`EventTarget.dispatchEvent()`方法在当前节点上触发指定事件,从而触发监听函数的执行。该方法返回一个布尔值,只要有一个监听函数调用了`Event.preventDefault()`,则返回值为`false`,否则为`true`。
 
 ```javascript
 target.dispatchEvent(event)
 ```
 
-`dispatchEvent`方法的参数是一个`Event`对象的实例(详见《Event 对象》章节)。
+`dispatchEvent()`方法的参数是一个`Event`对象的实例(详见《Event 对象》章节)。
 
 ```javascript
 para.addEventListener('click', hello, false);
@@ -159,9 +154,9 @@ para.dispatchEvent(event);
 
 上面代码在当前节点触发了`click`事件。
 
-如果`dispatchEvent`方法的参数为空,或者不是一个有效的事件对象,将报错。
+如果`dispatchEvent()`方法的参数为空,或者不是一个有效的事件对象,将报错。
 
-下面代码根据`dispatchEvent`方法的返回值,判断事件是否被取消了。
+下面代码根据`dispatchEvent()`方法的返回值,判断事件是否被取消了。
 
 ```javascript
 var canceled = !cb.dispatchEvent(event);
@@ -171,3 +166,4 @@ if (canceled) {
   console.log('事件未取消');
 }
 ```
+

From c506408445cbe0426f74e8988a1f3c921589501d Mon Sep 17 00:00:00 2001
From: ruanyf 
Date: Tue, 17 Aug 2021 17:41:01 +0800
Subject: [PATCH 060/112] docs(event/mouse): edit text

---
 docs/events/mouse.md | 39 ++++++++++++++++++++++++++-------------
 1 file changed, 26 insertions(+), 13 deletions(-)

diff --git a/docs/events/mouse.md b/docs/events/mouse.md
index 177217d..31aeb34 100644
--- a/docs/events/mouse.md
+++ b/docs/events/mouse.md
@@ -2,23 +2,30 @@
 
 ## 鼠标事件的种类
 
-鼠标事件指与鼠标相关的事件,继承了`MouseEvent`接口。具体的事件主要有以下一些。
+鼠标事件主要有下面这些,所有事件都继承了`MouseEvent`接口(详见后文)。
+
+(1)点击事件
+
+鼠标点击相关的有四个事件。
 
 - `click`:按下鼠标(通常是按下主按钮)时触发。
 - `dblclick`:在同一个元素上双击鼠标时触发。
 - `mousedown`:按下鼠标键时触发。
 - `mouseup`:释放按下的鼠标键时触发。
+
+`click`事件可以看成是两个事件组成的:用户在同一个位置先触发`mousedown`,再触发`mouseup`。因此,触发顺序是,`mousedown`首先触发,`mouseup`接着触发,`click`最后触发。
+
+双击时,`dblclick`事件则会在`mousedown`、`mouseup`、`click`之后触发。
+
+(2)移动事件
+
+鼠标移动相关的有五个事件。
+
 - `mousemove`:当鼠标在一个节点内部移动时触发。当鼠标持续移动时,该事件会连续触发。为了避免性能问题,建议对该事件的监听函数做一些限定,比如限定一段时间内只能运行一次。
 - `mouseenter`:鼠标进入一个节点时触发,进入子节点不会触发这个事件(详见后文)。
 - `mouseover`:鼠标进入一个节点时触发,进入子节点会再一次触发这个事件(详见后文)。
 - `mouseout`:鼠标离开一个节点时触发,离开父节点也会触发这个事件(详见后文)。
 - `mouseleave`:鼠标离开一个节点时触发,离开父节点不会触发这个事件(详见后文)。
-- `contextmenu`:按下鼠标右键时(上下文菜单出现前)触发,或者按下“上下文菜单键”时触发。
-- `wheel`:滚动鼠标的滚轮时触发,该事件继承的是`WheelEvent`接口。
-
-`click`事件指的是,用户在同一个位置先完成`mousedown`动作,再完成`mouseup`动作。因此,触发顺序是,`mousedown`首先触发,`mouseup`接着触发,`click`最后触发。
-
-`dblclick`事件则会在`mousedown`、`mouseup`、`click`之后触发。
 
 `mouseover`事件和`mouseenter`事件,都是鼠标进入一个节点时触发。两者的区别是,`mouseenter`事件只触发一次,而只要鼠标在节点内部移动,`mouseover`事件会在子节点上触发多次。
 
@@ -27,7 +34,7 @@
  
  • item 1
  • item 2
  • -
  • item 3
  • +
  • item 3
*/ @@ -62,7 +69,7 @@ ul.addEventListener('mouseover', function (event) {
  • item 1
  • item 2
  • -
  • item 3
  • +
  • item 3
*/ @@ -90,19 +97,24 @@ ul.addEventListener('mouseout', function (event) { 上面代码中,在父节点内部离开子节点,不会触发`mouseleave`事件,但是会触发`mouseout`事件。 -## MouseEvent 接口概述 +(3)其他事件 + +- `contextmenu`:按下鼠标右键时(上下文菜单出现前)触发,或者按下“上下文”菜单键时触发。 +- `wheel`:滚动鼠标的滚轮时触发,该事件继承的是`WheelEvent`接口。 + +## MouseEvent 接口 `MouseEvent`接口代表了鼠标相关的事件,单击(click)、双击(dblclick)、松开鼠标键(mouseup)、按下鼠标键(mousedown)等动作,所产生的事件对象都是`MouseEvent`实例。此外,滚轮事件和拖拉事件也是`MouseEvent`实例。 -`MouseEvent`接口继承了`Event`接口,所以拥有`Event`的所有属性和方法。它还有自己的属性和方法。 +`MouseEvent`接口继承了`Event`接口,所以拥有`Event`的所有属性和方法,并且还提供鼠标独有的属性和方法。 -浏览器原生提供一个`MouseEvent`构造函数,用于新建一个`MouseEvent`实例。 +浏览器原生提供一个`MouseEvent()`构造函数,用于新建一个`MouseEvent`实例。 ```javascript var event = new MouseEvent(type, options); ``` -`MouseEvent`构造函数接受两个参数。第一个参数是字符串,表示事件名称;第二个参数是一个事件配置对象,该参数可选。除了`Event`接口的实例配置属性,该对象可以配置以下属性,所有属性都是可选的。 +`MouseEvent()`构造函数接受两个参数。第一个参数是字符串,表示事件名称;第二个参数是一个事件配置对象,该参数可选。除了`Event`接口的实例配置属性,该对象可以配置以下属性,所有属性都是可选的。 - `screenX`:数值,鼠标相对于屏幕的水平位置(单位像素),默认值为0,设置该属性不会移动鼠标。 - `screenY`:数值,鼠标相对于屏幕的垂直位置(单位像素),其他与`screenX`相同。 @@ -384,3 +396,4 @@ var wheelEvent = new WheelEvent(type, options); - `WheelEvent.deltaY`:数值,表示滚轮的垂直滚动量。 - `WheelEvent.deltaZ`:数值,表示滚轮的 Z 轴滚动量。 - `WheelEvent.deltaMode`:数值,表示上面三个属性的单位,`0`是像素,`1`是行,`2`是页。 + From e0f60d423f773ac8cd1fd692e98552a96e6a8708 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Tue, 17 Aug 2021 17:50:00 +0800 Subject: [PATCH 061/112] docs(event/mouse): edit text --- docs/events/mouse.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/events/mouse.md b/docs/events/mouse.md index 31aeb34..cd1d463 100644 --- a/docs/events/mouse.md +++ b/docs/events/mouse.md @@ -337,10 +337,10 @@ inner.addEventListener('mouseover', function (event) { inner.addEventListener('mouseenter', function (event) { console.log('进入' + event.target.id + ' 离开' + event.relatedTarget.id); }); -inner.addEventListener('mouseout', function () { +inner.addEventListener('mouseout', function (event) { console.log('离开' + event.target.id + ' 进入' + event.relatedTarget.id); }); -inner.addEventListener("mouseleave", function (){ +inner.addEventListener("mouseleave", function (event){ console.log('离开' + event.target.id + ' 进入' + event.relatedTarget.id); }); From 24b53538310a2eaca5e623f7549408610f067bbc Mon Sep 17 00:00:00 2001 From: Ruan YiFeng Date: Wed, 25 Aug 2021 00:22:23 +0800 Subject: [PATCH 062/112] docs: fix typo --- docs/async/general.md | 2 +- docs/bom/history.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/async/general.md b/docs/async/general.md index d025df7..a4c9747 100644 --- a/docs/async/general.md +++ b/docs/async/general.md @@ -12,7 +12,7 @@ JavaScript 之所以采用单线程,而不是多线程,跟历史有关系。 如果排队是因为计算量大,CPU 忙不过来,倒也算了,但是很多时候 CPU 是闲着的,因为 IO 操作(输入输出)很慢(比如 Ajax 操作从网络读取数据),不得不等着结果出来,再往下执行。JavaScript 语言的设计者意识到,这时 CPU 完全可以不管 IO 操作,挂起处于等待中的任务,先运行排在后面的任务。等到 IO 操作返回了结果,再回过头,把挂起的任务继续执行下去。这种机制就是 JavaScript 内部采用的“事件循环”机制(Event Loop)。 -单线程模型虽然对 JavaScript 构成了很大的限制,但也因此使它具备了其他语言不具备的优势。如果用得好,JavaScript 程序是不会出现堵塞的,这就是为什么 Node 可以用很少的资源,应付大流量访问的原因。 +单线程模型虽然对 JavaScript 构成了很大的限制,但也因此使它具备了其他语言不具备的优势。如果用得好,JavaScript 程序是不会出现堵塞的,这就是 Node.js 可以用很少的资源,应付大流量访问的原因。 为了利用多核 CPU 的计算能力,HTML5 提出 Web Worker 标准,允许 JavaScript 脚本创建多个线程,但是子线程完全受主线程控制,且不得操作 DOM。所以,这个新标准并没有改变 JavaScript 单线程的本质。 diff --git a/docs/bom/history.md b/docs/bom/history.md index 764b4bd..174f268 100644 --- a/docs/bom/history.md +++ b/docs/bom/history.md @@ -62,7 +62,7 @@ history.go(0); // 刷新当前页面 注意,移动到以前访问过的页面时,页面通常是从浏览器缓存之中加载,而不是重新要求服务器发送新的网页。 -### History.pushState(), +### History.pushState() `History.pushState()`方法用于在历史中添加一条记录。 From 76f46763d8d7f3974eaa59944a177b85797e42cb Mon Sep 17 00:00:00 2001 From: ruanyf Date: Wed, 1 Sep 2021 14:43:33 +0800 Subject: [PATCH 063/112] docs(bom/indexedDB): edit IDBCursor --- docs/bom/indexeddb.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/docs/bom/indexeddb.md b/docs/bom/indexeddb.md index 83b5a86..7472264 100644 --- a/docs/bom/indexeddb.md +++ b/docs/bom/indexeddb.md @@ -932,15 +932,14 @@ objectStore.openCursor(null, 'next').onsuccess = function(event) { var cursor = event.target.result; if (cursor) { var listItem = document.createElement('li'); - listItem.innerHTML = cursor.value.albumTitle + ', ' + cursor.value.year; - list.appendChild(listItem); + listItem.innerHTML = cursor.value.albumTitle + ', ' + cursor.value.year; + list.appendChild(listItem); - console.log(cursor.source); - cursor.continue(); - } else { - console.log('Entries all displayed.'); - } - }; + console.log(cursor.source); + cursor.continue(); + } else { + console.log('Entries all displayed.'); + } }; ``` From 9d3c01a61c3e9331d1c140c2a092d5b52f897a39 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Wed, 1 Sep 2021 15:28:25 +0800 Subject: [PATCH 064/112] docs(elements/video): edit HTMLMediaElement.src --- docs/elements/video.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/elements/video.md b/docs/elements/video.md index 1625b70..73be5d6 100644 --- a/docs/elements/video.md +++ b/docs/elements/video.md @@ -56,7 +56,7 @@ - HTMLMediaElement.readyState:整数,表示媒体文件的准备状态,可能的值为0(没有任何数据)、1(已获取元数据)、2(可播放当前帧,但不足以播放多个帧)、3(可以播放多帧,至少为两帧)、4(可以流畅播放)。该属性只读。 - HTMLMediaElement.seekable:返回一个 TimeRanges 对象,表示一个用户可以搜索的媒体内容范围。该属性只读。 - HTMLMediaElement.seeking:布尔值,表示媒体文件是否正在寻找新位置。该属性只读。 -- HTMLMediaElement.src:布尔值,表示媒体文件的 URL,对应 HTML 属性`src`。 +- HTMLMediaElement.src:字符串,表示媒体文件所在的 URL,对应 HTML 属性`src`。 - HTMLMediaElement.srcObject:返回`src`属性对应的媒体文件资源,可能是`MediaStream`、`MediaSource`、`Blob`或`File`对象。直接指定这个属性,就可以播放媒体文件。 - HTMLMediaElement.textTracks:返回一个类似数组的对象,包含所有文本轨道。该属性只读。 - HTMLMediaElement.videoTracks:返回一个类似数组的对象,包含多有视频轨道。该属性只读。 From 4ba7e4048ad15c0a9cb0394d188ec897790dd128 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sun, 5 Sep 2021 10:54:24 +0800 Subject: [PATCH 065/112] refactor: edit theme --- .gitignore | 1 + package-lock.json | 246 +++++++++++++++++++++++++--------------------- package.json | 4 +- 3 files changed, 136 insertions(+), 115 deletions(-) diff --git a/.gitignore b/.gitignore index c5ea0d4..01a7204 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules/ dist/ npm-debug.log +package-lock.json diff --git a/package-lock.json b/package-lock.json index 5c9e66e..9afdca7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -82,9 +82,9 @@ } }, "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" }, "@types/parse-json": { "version": "4.0.0", @@ -275,9 +275,9 @@ "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==" }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "requires": { "ms": "2.1.2" }, @@ -305,29 +305,29 @@ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, "dom-serializer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.2.0.tgz", - "integrity": "sha512-n6kZFH/KlCrqs/1GHMOd5i2fd/beQHuehKdWvNNffbGHTr/almdhuVvTVFb3V7fglz+nC50fFusu3lY33h12pA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "requires": { "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", + "domhandler": "^4.2.0", "entities": "^2.0.0" }, "dependencies": { "domhandler": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.0.0.tgz", - "integrity": "sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", + "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", "requires": { - "domelementtype": "^2.1.0" + "domelementtype": "^2.2.0" } } } }, "domelementtype": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", - "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" }, "domhandler": { "version": "3.3.0", @@ -338,21 +338,21 @@ } }, "domutils": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.4.4.tgz", - "integrity": "sha512-jBC0vOsECI4OMdD0GC9mGn7NXPLb+Qt6KW1YDQzeQYRUFKmNG8lh7mO5HiELfr+lLQE7loDVI4QcAxV80HS+RA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "requires": { "dom-serializer": "^1.0.1", - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0" + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" }, "dependencies": { "domhandler": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.0.0.tgz", - "integrity": "sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", + "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", "requires": { - "domelementtype": "^2.1.0" + "domelementtype": "^2.2.0" } } } @@ -368,9 +368,9 @@ "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==" }, "emoji-regex": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.1.1.tgz", - "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4=" + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "encodeurl": { "version": "1.0.2", @@ -383,9 +383,9 @@ "integrity": "sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw==" }, "entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" }, "error-ex": { "version": "1.3.2", @@ -531,12 +531,9 @@ } }, "github-slugger": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.3.0.tgz", - "integrity": "sha512-gwJScWVNhFYSRDvURk/8yhcFBee6aFjye2a7Lhb2bUyRulpIoek9p0I9Kt7PT67d/nUlZbFu8L9RLiA0woQN8Q==", - "requires": { - "emoji-regex": ">=6.0.0 <=6.1.1" - } + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", + "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==" }, "glob": { "version": "7.1.7", @@ -579,9 +576,9 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, "highlight.js": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.5.0.tgz", - "integrity": "sha512-xTmvd9HiIHR6L53TMC7TKolEj65zG1XU+Onr8oi86mYa+nLcIbxTTWkpW7CsEwv/vK7u1zb8alZIMLDqqN6KTw==" + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" }, "html-minifier": { "version": "4.0.0", @@ -725,6 +722,11 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -787,11 +789,12 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "requires": { - "chalk": "^4.0.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" } }, "log4js": { @@ -807,38 +810,38 @@ } }, "loppo": { - "version": "0.6.23", - "resolved": "https://registry.npmjs.org/loppo/-/loppo-0.6.23.tgz", - "integrity": "sha512-PVlL8OH3Vwu8Rjm+S6DAPtFCgFW8SwfSlr+MAkTCL6iBrilQpcnFOp1t5pkwxPF6cLE5Z1Fm9IyzG2G/MeS0rQ==", + "version": "0.6.24", + "resolved": "https://registry.npmjs.org/loppo/-/loppo-0.6.24.tgz", + "integrity": "sha512-o3AH9yD+hiRyj/NZQBeeSYWotLTLcNMvv19OQCPc+Qay6LlGFOF1VhXfqTV0MfJoyWFnA2S3AqLYmc5toChPBQ==", "requires": { "connect": "^3.7.0", - "debug": "^4.3.1", - "fs-extra": "^9.0.1", + "debug": "^4.3.2", + "fs-extra": "^9.1.0", "html-minifier": "4.x", "html-to-text": "6.x", "js-yaml": "^3.14.1", - "lodash": "^4.17.20", - "log-symbols": "4.x", + "lodash": "^4.17.21", + "log-symbols": "^4.1.0", "log4js": "^6.3.0", "loppo-theme-oceandeep": "2.x", "promptly": "^3.2.0", "serve-static": "^1.14.1", - "tarim": "^0.1.2", - "turpan": "^0.3.1", + "tarim": "^0.1.4", + "turpan": "^0.3.2", "walk-sync": "^2.2.0", "wordcount": "^1.1.1", "yargs": "^16.2.0" }, "dependencies": { "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", - "universalify": "^1.0.0" + "universalify": "^2.0.0" } }, "jsonfile": { @@ -848,19 +851,12 @@ "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" - }, - "dependencies": { - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - } } }, "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" } } }, @@ -870,9 +866,9 @@ "integrity": "sha1-Mswjj72pUEpmZVTkbZdlh8LA9Ww=" }, "loppo-theme-wangdoc": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/loppo-theme-wangdoc/-/loppo-theme-wangdoc-0.5.2.tgz", - "integrity": "sha512-IkRaTMb5rg4AUHIoLCOkv3zYtJtn7NnUui70c3uR0LHKJGRy2vNru+NjOOxsIAns1I8FnEew3F4Hktex+RiFxw==" + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/loppo-theme-wangdoc/-/loppo-theme-wangdoc-0.6.1.tgz", + "integrity": "sha512-68pQdYI3eqWdypLQU8hMCDqw0btJmtTOd/3pBhec8q33Cr0/CyCLOXeRLnnIowMJV++MMnarS02zD2liX4k38w==" }, "lower-case": { "version": "1.1.4", @@ -888,9 +884,9 @@ } }, "markdown-it": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.0.4.tgz", - "integrity": "sha512-34RwOXZT8kyuOJy25oJNJoulO8L0bTHYWXcdZBYZqFnjIy3NgjeoM3FmPXIOFQ26/lSHYMr8oc62B6adxXcb3Q==", + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.2.0.tgz", + "integrity": "sha512-Wjws+uCrVQRqOoJvze4HCqkKl1AsSh95iFAeQDwnyfxM09divCBSXlDR1uTvyUP3Grzpn4Ru8GeCxYPM8vkCQg==", "requires": { "argparse": "^2.0.1", "entities": "~2.1.0", @@ -903,6 +899,11 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" } } }, @@ -927,9 +928,9 @@ "integrity": "sha512-39j7/9vP/CPCKbEI44oV8yoPJTpvfeReTn/COgRhSpNrjWF3PfP/JUxxB0hxV6ynOY8KH8Y8aX9NMDdo6z+6YQ==" }, "markdown-it-footnote": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-3.0.2.tgz", - "integrity": "sha512-JVW6fCmZWjvMdDQSbOT3nnOQtd9iAXmw7hTSh26+v42BnvXeVyGMDBm5b/EZocMed2MbCAHiTX632vY0FyGB8A==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-3.0.3.tgz", + "integrity": "sha512-YZMSuCGVZAjzKMn+xqIco9d1cLGxbELHZ9do/TSYVzraooV8ypsppKNmUJ0fVH5ljkCInQAtFpm8Rb3eXSrt5w==" }, "markdown-it-implicit-figures": { "version": "0.10.0", @@ -1189,9 +1190,9 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, "rfdc": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", - "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" }, "semver": { "version": "6.3.0", @@ -1304,20 +1305,13 @@ } }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - } } }, "strip-ansi": { @@ -1345,12 +1339,38 @@ } }, "tarim": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/tarim/-/tarim-0.1.3.tgz", - "integrity": "sha512-VPB0U1YV1fBAmADwuTDVKCqEeSJmzuZvl53CyWOOJCWxp2BsHNnGLX5VuginSTUjBuD3LC2Tkv5JJDYi4iv8fA==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/tarim/-/tarim-0.1.4.tgz", + "integrity": "sha512-bDkkMrALJ3L99MSInkjeyIb2BxeVUksA8Ps2ogVhaloo+6CGtVwMYinMfnju2Us2kNrEL+UY9BJS82dM+JXbdA==", "requires": { - "fs-extra": "8.x", + "fs-extra": "10.x", "lodash": "^4.17.14" + }, + "dependencies": { + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + } } }, "toidentifier": { @@ -1367,28 +1387,28 @@ } }, "turpan": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/turpan/-/turpan-0.3.1.tgz", - "integrity": "sha512-jL6AMHTA2yExzbSoZTRinbWPzf9nvQfVFk0V6JlBTIbPCKMbAfgXRFHZuOFe6ZXm6+LE6s3jypNRNXkAY2yKaw==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/turpan/-/turpan-0.3.2.tgz", + "integrity": "sha512-NbjUvtMTvt1jqDdTZLpCZA6c3R0Zcd59cwKIohd4+XhEr+s/Nui/KOfytKA+ba/IVw3puAwzawkgrJtL5o29Gw==", "requires": { "@iktakahiro/markdown-it-katex": "^4.0.1", "clone": "^2.1.1", - "github-slugger": "^1.1.1", - "highlight.js": "^10.4.1", - "markdown-it": "^12.0.1", + "github-slugger": "^1.4.0", + "highlight.js": "^10.7.3", + "markdown-it": "^12.2.0", "markdown-it-abbr": "^1.0.4", "markdown-it-container": "^3.0.0", "markdown-it-deflist": "^2.0.1", "markdown-it-emoji": "^2.0.0", - "markdown-it-footnote": "^3.0.1", + "markdown-it-footnote": "^3.0.3", "markdown-it-implicit-figures": "^0.10.0", "markdown-it-imsize": "^2.0.1", - "markdown-it-ins": "^3.0.0", - "markdown-it-mark": "^3.0.0", + "markdown-it-ins": "^3.0.1", + "markdown-it-mark": "^3.0.1", "markdown-it-sub": "^1.0.0", "markdown-it-sup": "^1.0.0", "markdown-it-task-lists": "^2.1.1", - "yargs": "^16.1.1" + "yargs": "^16.2.0" } }, "uc.micro": { @@ -1397,9 +1417,9 @@ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, "uglify-js": { - "version": "3.12.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.4.tgz", - "integrity": "sha512-L5i5jg/SHkEqzN18gQMTWsZk3KelRsfD1wUVNqtq0kzqWQqcJjyL8yc1o8hJgRrWqrAl2mUFbhfznEIoi7zi2A==" + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.1.tgz", + "integrity": "sha512-JhS3hmcVaXlp/xSo3PKY5R0JqKs5M3IV+exdLHW99qKvKivPO4Z8qbej6mte17SOPqAOVMjt/XGgWacnFSzM3g==" }, "universalify": { "version": "0.1.2", @@ -1466,9 +1486,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "y18n": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", - "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==" + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yaml": { "version": "1.10.0", @@ -1490,9 +1510,9 @@ } }, "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" }, "yocto-queue": { "version": "0.1.0", diff --git a/package.json b/package.json index acd23bc..b67124a 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "dependencies": { "gh-pages": "^3.2.3", "husky": "^4.3.8", - "loppo": "^0.6.23", - "loppo-theme-wangdoc": "^0.5.2" + "loppo": "^0.6.24", + "loppo-theme-wangdoc": "^0.6.1" } } From 53ae0a3d6b72d534ac54b7d1fe17ac5aff96ae1a Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sat, 11 Sep 2021 19:43:39 +0800 Subject: [PATCH 066/112] docs(types/array): edit array hole --- docs/types/array.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/types/array.md b/docs/types/array.md index 6f9d054..94944bf 100644 --- a/docs/types/array.md +++ b/docs/types/array.md @@ -303,7 +303,7 @@ var a = [1, , 1]; a.length // 3 ``` -上面代码表明,数组的空位不影响`length`属性。 +上面代码表明,数组的空位不影响`length`属性。虽然这个位置没有值,引擎依然认为这个位置是有效的。 需要注意的是,如果最后一个元素后面有逗号,并不会产生空位。也就是说,有没有这个逗号,结果都是一样的。 From b924c7d95cd4888eee18e5d527b30edad034660d Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sun, 19 Sep 2021 19:42:50 +0800 Subject: [PATCH 067/112] docs(bom/cookie): edit cookie --- docs/bom/cookie.md | 28 ++++++++++++++++++++-------- docs/bom/same-origin.md | 4 ++-- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/docs/bom/cookie.md b/docs/bom/cookie.md index 9c7f53b..a9ba47b 100644 --- a/docs/bom/cookie.md +++ b/docs/bom/cookie.md @@ -4,13 +4,15 @@ Cookie 是服务器保存在浏览器的一小段文本信息,一般大小不能超过4KB。浏览器每次向服务器发出请求,就会自动附上这段信息。 -Cookie 主要保存状态信息,以下是一些主要用途。 +HTTP 协议不带有状态,有些请求需要区分状态,就通过 Cookie 附带字符串,让服务器返回不一样的回应。举例来说,用户登录以后,服务器往往会在网站上留下一个 Cookie,记录用户编号(比如`id=1234`),以后每次浏览器向服务器请求数据,就会带上这个字符串,服务器从而知道是谁在请求,应该回应什么内容。 -- 对话(session)管理:保存登录、购物车等需要记录的信息。 +Cookie 的目的就是区分用户,以及放置状态信息,它的使用场景主要如下。 + +- 对话(session)管理:保存登录状态、购物车等需要记录的信息。 - 个性化信息:保存用户的偏好,比如网页的字体大小、背景色等等。 - 追踪用户:记录和分析用户行为。 -Cookie 不是一种理想的客户端储存机制。它的容量很小(4KB),缺乏数据操作接口,而且会影响性能。客户端储存应该使用 Web storage API 和 IndexedDB。只有那些每次请求都需要让服务器知道的信息,才应该放在 Cookie 里面。 +Cookie 不是一种理想的客户端存储机制。它的容量很小(4KB),缺乏数据操作接口,而且会影响性能。客户端存储建议使用 Web storage API 和 IndexedDB。只有那些每次请求都需要让服务器知道的信息,才应该放在 Cookie 里面。 每个 Cookie 都有以下几方面的元数据。 @@ -20,7 +22,9 @@ Cookie 不是一种理想的客户端储存机制。它的容量很小(4KB) - 所属域名(默认为当前域名) - 生效的路径(默认为当前网址) -举例来说,用户访问网址`www.example.com`,服务器在浏览器写入一个 Cookie。这个 Cookie 的所属域名为`www.example.com`,生效路径为根路径`/`。如果 Cookie 的生效路径设为`/forums`,那么这个 Cookie 只有在访问`www.example.com/forums`及其子路径时才有效。以后,浏览器访问某个路径之前,就会找出对该域名和路径有效,并且还没有到期的 Cookie,一起发送给服务器。 +举例来说,用户访问网址`www.example.com`,服务器在浏览器写入一个 Cookie。这个 Cookie 的所属域名为`www.example.com`,生效路径为根路径`/`。 + +如果 Cookie 的生效路径设为`/forums`,那么这个 Cookie 只有在访问`www.example.com/forums`及其子路径时才有效。以后,浏览器访问某个路径之前,就会找出对该域名和路径有效,并且还没有到期的 Cookie,一起发送给服务器。 用户可以设置浏览器不接受 Cookie,也可以设置不向服务器发送 Cookie。`window.navigator.cookieEnabled`属性返回一个布尔值,表示浏览器是否打开 Cookie 功能。 @@ -34,9 +38,17 @@ window.navigator.cookieEnabled // true document.cookie // "id=foo;key=bar" ``` -不同浏览器对 Cookie 数量和大小的限制,是不一样的。一般来说,单个域名设置的 Cookie 不应超过30个,每个 Cookie 的大小不能超过4KB。超过限制以后,Cookie 将被忽略,不会被设置。 +不同浏览器对 Cookie 数量和大小的限制,是不一样的。一般来说,单个域名设置的 Cookie 不应超过30个,每个 Cookie 的大小不能超过 4KB。超过限制以后,Cookie 将被忽略,不会被设置。 + +Cookie 是按照域名区分的,`foo.com`只能读取自己放置的 Cookie,无法读取其他网站(比如`bar.com`)放置的 Cookie。一般情况下,一级域名也不能读取二级域名留下的 Cookie,比如`mydomain.com`不能读取`subdomain.mydomain.com`设置的 Cookie。但是有一个例外,设置 Cookie 的时候(不管是一级域名设置的,还是二级域名设置的),明确将`domain`属性设为一级域名,则这个域名下面的各级域名可以共享这个 Cookie。 + +```http +Set-Cookie: name=value; domain=mydomain.com +``` + +上面示例中,设置 Cookie 时,`domain`属性设为`mydomain.com`,那么各级的子域名和一级域名都可以读取这个 Cookie。 -浏览器的同源政策规定,两个网址只要域名相同,就可以共享 Cookie(参见《同源政策》一章)。注意,这里不要求协议相同。也就是说,`http://example.com`设置的 Cookie,可以被`https://example.com`读取。 +注意,区分 Cookie 时不考虑协议和端口。也就是说,`http://example.com`设置的 Cookie,可以被`https://example.com`或`http://example.com:8080`读取。 ## Cookie 与 HTTP 协议 @@ -197,7 +209,7 @@ Set-Cookie:id=a3fWa; ``` -用户一旦被诱骗发送这个表单,银行网站就会收到带有正确 Cookie 的请求。为了防止这种攻击,表单一般都带有一个随机 token,告诉服务器这是真实请求。 +用户一旦被诱骗发送这个表单,银行网站就会收到带有正确 Cookie 的请求。为了防止这种攻击,官网的表单一般都带有一个随机 token,官网服务器通过验证这个随机 token,确认是否为真实请求。 ```html
@@ -206,7 +218,7 @@ Set-Cookie:id=a3fWa;
``` -这种第三方网站引导发出的 Cookie,就称为第三方 Cookie。它除了用于 CSRF 攻击,还可以用于用户追踪。比如,Facebook 在第三方网站插入一张看不见的图片。 +这种第三方网站引导而附带发送的 Cookie,就称为第三方 Cookie。它除了用于 CSRF 攻击,还可以用于用户追踪。比如,Facebook 在第三方网站插入一张看不见的图片。 ```html diff --git a/docs/bom/same-origin.md b/docs/bom/same-origin.md index 553dc39..50577ce 100644 --- a/docs/bom/same-origin.md +++ b/docs/bom/same-origin.md @@ -89,10 +89,10 @@ var allCookie = document.cookie; 注意,这种方法只适用于 Cookie 和 iframe 窗口,LocalStorage 和 IndexedDB 无法通过这种方法,规避同源政策,而要使用下文介绍 PostMessage API。 -另外,服务器也可以在设置 Cookie 的时候,指定 Cookie 的所属域名为一级域名,比如`.example.com`。 +另外,服务器也可以在设置 Cookie 的时候,指定 Cookie 的所属域名为一级域名,比如`example.com`。 ```http -Set-Cookie: key=value; domain=.example.com; path=/ +Set-Cookie: key=value; domain=example.com; path=/ ``` 这样的话,二级域名和三级域名不用做任何设置,都可以读取这个 Cookie。 From cca8027372b16df27213976106d23e74a3ea3387 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Mon, 27 Sep 2021 13:00:21 +0800 Subject: [PATCH 068/112] docs(bom/navigator): edit text --- docs/bom/navigator.md | 6 +++--- docs/dom/css.md | 2 +- package-lock.json | 30 +++++++++++++++--------------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/bom/navigator.md b/docs/bom/navigator.md index 0a92794..18476a7 100644 --- a/docs/bom/navigator.md +++ b/docs/bom/navigator.md @@ -6,7 +6,7 @@ ### Navigator.userAgent -`navigator.userAgent`属性返回浏览器的 User Agent 字符串,表示浏览器的厂商和版本信息。 +`navigator.userAgent`属性返回浏览器的 User Agent 字符串,表示用户设备信息,包含了浏览器的厂商、版本、操作系统等信息。 下面是 Chrome 浏览器的`userAgent`。 @@ -22,7 +22,7 @@ navigator.userAgent ```javascript var ua = navigator.userAgent.toLowerCase(); -if (/mobi/i.test(ua)) { +if (/mobi/.test(ua)) { // 手机浏览器 } else { // 非手机浏览器 @@ -32,7 +32,7 @@ if (/mobi/i.test(ua)) { 如果想要识别所有移动设备的浏览器,可以测试更多的特征字符串。 ```javascript -/mobi|android|touch|mini/i.test(ua) +/mobi|android|touch|mini/.test(ua) ``` ### Navigator.plugins diff --git a/docs/dom/css.md b/docs/dom/css.md index a29de76..5a1d39a 100644 --- a/docs/dom/css.md +++ b/docs/dom/css.md @@ -749,7 +749,7 @@ styleSheet.cssRules[0].conditionText ### 基本用法 -`window.matchMedia`方法用来将 CSS 的[`MediaQuery`](https://developer.mozilla.org/en-US/docs/DOM/Using_media_queries_from_code)条件语句,转换成一个 MediaQueryList 实例。 +`window.matchMedia()`方法用来将 CSS 的[`Media Query`](https://developer.mozilla.org/en-US/docs/DOM/Using_media_queries_from_code)条件语句,转换成一个 MediaQueryList 实例。 ```javascript var mdl = window.matchMedia('(min-width: 400px)'); diff --git a/package-lock.json b/package-lock.json index 9afdca7..8a03e78 100644 --- a/package-lock.json +++ b/package-lock.json @@ -92,9 +92,9 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", @@ -139,9 +139,9 @@ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "brace-expansion": { "version": "1.1.11", @@ -460,9 +460,9 @@ } }, "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "requires": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -561,9 +561,9 @@ } }, "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, "has-flag": { "version": "4.0.0", @@ -1417,9 +1417,9 @@ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, "uglify-js": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.1.tgz", - "integrity": "sha512-JhS3hmcVaXlp/xSo3PKY5R0JqKs5M3IV+exdLHW99qKvKivPO4Z8qbej6mte17SOPqAOVMjt/XGgWacnFSzM3g==" + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.2.tgz", + "integrity": "sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A==" }, "universalify": { "version": "0.1.2", From 5fd3d345454d69762958a934369e906a0ebd3dbd Mon Sep 17 00:00:00 2001 From: ruanyf Date: Mon, 4 Oct 2021 23:43:13 +0800 Subject: [PATCH 069/112] docs(bom/cookie): edit domain property --- docs/bom/cookie.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/bom/cookie.md b/docs/bom/cookie.md index a9ba47b..80c542c 100644 --- a/docs/bom/cookie.md +++ b/docs/bom/cookie.md @@ -175,9 +175,19 @@ Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; ### Domain,Path -`Domain`属性指定浏览器发出 HTTP 请求时,哪些域名要附带这个 Cookie。如果没有指定该属性,浏览器会默认将其设为当前域名,这时子域名将不会附带这个 Cookie。比如,`example.com`不设置 Cookie 的`domain`属性,那么`sub.example.com`将不会附带这个 Cookie。如果指定了`domain`属性,那么子域名也会附带这个 Cookie。如果服务器指定的域名不属于当前域名,浏览器会拒绝这个 Cookie。 +`Domain`属性指定 Cookie 属于哪个域名,以后浏览器向服务器发送 HTTP 请求时,通过这个属性判断是否要附带某个 Cookie。 -`Path`属性指定浏览器发出 HTTP 请求时,哪些路径要附带这个 Cookie。只要浏览器发现,`Path`属性是 HTTP 请求路径的开头一部分,就会在头信息里面带上这个 Cookie。比如,`PATH`属性是`/`,那么请求`/docs`路径也会包含该 Cookie。当然,前提是域名必须一致。 +服务器设定 Cookie 时,如果没有指定 Domain 属性,浏览器会默认将其设为浏览器的当前域名。如果当前域名是一个 IP 地址,则不得设置 Domain 属性。 + +如果指定 Domain 属性,需要遵守下面规则:Domain 属性只能是当前域名或者当前域名的上级域名,但设为上级域名时,不能设为顶级域名或公共域名。(顶级域名指的是 .com、.net 这样的域名,公共域名指的是开放给外部用户设置子域名的域名,比如 github.io。)如果不符合上面这条规则,浏览器会拒绝设置这个 Cookie。 + +举例来说,当前域名为`x.y.z.com`,那么 Domain 属性可以设为`x.y.z.com`,或者`y.z.com`,或者`z.com`,但不能设为`foo.x.y.z.com`,或者`another.domain.com`。 + +另一个例子是,当前域名为`wangdoc.github.io`,则 Domain 属性只能设为`wangdoc.github.io`,不能设为`github.io`,因为后者是一个公共域名。 + +浏览器发送 Cookie 时,Domain 属性必须与当前域名一致,或者是当前域名的上级域名(公共域名除外)。比如,Domain 属性是`y.z.com`,那么适用于`y.z.com`、`x.y.z.com`、`foo.x.y.z.com`等域名。再比如,Domain 属性是公共域名`github.io`,那么只适用于`github.io`这个域名本身,不适用于它的子域名`wangdoc.github.io`。 + +`Path`属性指定浏览器发出 HTTP 请求时,哪些路径要附带这个 Cookie。只要浏览器发现,`Path`属性是 HTTP 请求路径的开头一部分,就会在头信息里面带上这个 Cookie。比如,`Path`属性是`/`,那么请求`/docs`路径也会包含该 Cookie。当然,前提是 Domain 属性必须符合条件。 ### Secure,HttpOnly From 8ea87244214dcf50d3aec0b60920eaafabfb028d Mon Sep 17 00:00:00 2001 From: ruanyf Date: Thu, 28 Oct 2021 19:08:55 +0800 Subject: [PATCH 070/112] docs(dom/element): fixed #234 --- docs/dom/element.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/dom/element.md b/docs/dom/element.md index b569f31..2b5ea6d 100644 --- a/docs/dom/element.md +++ b/docs/dom/element.md @@ -89,7 +89,7 @@ document.documentElement.lang // "en" **(1)Element.hidden** -`Element.hidden`属性返回一个布尔值,表示当前元素的`hidden`属性,用来控制当前元素是否可见。该属性可读写。 +`Element.hidden`属性返回一个布尔值,表示当前 HTML 元素的`hidden`属性的值。该属性可读写,用来控制当前元素是否可见。 ```javascript var btn = document.getElementById('btn'); @@ -100,9 +100,9 @@ btn.addEventListener('click', function () { }, false); ``` -注意,该属性与 CSS 设置是互相独立的。CSS 对这个元素可见性的设置,`Element.hidden`并不能反映出来。也就是说,这个属性并不能用来判断当前元素的实际可见性。 +注意,该属性与 CSS 设置是互相独立的。CSS 对当前元素可见性的设置,`Element.hidden`并不能反映出来。也就是说,这个属性并不能用来判断当前元素的实际可见性。 -CSS 的设置高于`Element.hidden`。如果 CSS 指定了该元素不可见(`display: none`)或可见(`display: hidden`),那么`Element.hidden`并不能改变该元素实际的可见性。换言之,这个属性只在 CSS 没有明确设定当前元素的可见性时才有效。 +CSS 设置的优先级高于`Element.hidden`。如果 CSS 指定了该元素不可见(`display: none`)或可见(`visibility: visible`),那么`Element.hidden`并不能改变该元素实际的可见性。换言之,这个属性只在 CSS 没有明确设定当前元素的可见性时才有效。 **(2)Element.contentEditable,Element.isContentEditable** From c426ae28ced38a3e56fc18ec3215bfaf266ea1df Mon Sep 17 00:00:00 2001 From: ruanyf Date: Fri, 29 Oct 2021 08:05:50 +0800 Subject: [PATCH 071/112] docs(dom/nodelist): edit HTMLCollection.prototype.namedItem() --- docs/dom/nodelist.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/dom/nodelist.md b/docs/dom/nodelist.md index f5c9457..bda3939 100644 --- a/docs/dom/nodelist.md +++ b/docs/dom/nodelist.md @@ -179,7 +179,7 @@ var img0 = c.item(0); ### HTMLCollection.prototype.namedItem() -`namedItem`方法的参数是一个字符串,表示`id`属性或`name`属性的值,返回对应的元素节点。如果没有对应的节点,则返回`null`。 +`namedItem`方法的参数是一个字符串,表示`id`属性或`name`属性的值,返回当前集合中对应的元素节点。如果没有对应的节点,则返回`null`。 ```javascript // HTML 代码如下 @@ -188,3 +188,6 @@ var img0 = c.item(0); var pic = document.getElementById('pic'); document.images.namedItem('pic') === pic // true ``` + +`Collection.namedItem('value')`等同于`Collection['value']`。 + From 074e7f591a70b1110a22a120c9f8bf6a74788001 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sat, 5 Feb 2022 09:04:13 +0800 Subject: [PATCH 072/112] docs(stdlib/date): fix #237 --- docs/stdlib/date.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/stdlib/date.md b/docs/stdlib/date.md index 4edbaeb..af7ad94 100644 --- a/docs/stdlib/date.md +++ b/docs/stdlib/date.md @@ -361,7 +361,7 @@ d.toLocaleTimeString('zh-CN') // "上午12:00:00" - `weekday`:可能的值为`long`、`short`、`narrow`。 - `day`、`hour`、`minute`、`second`:可能的值为`numeric`、`2-digit`。 - `timeZone`:可能的值为 IANA 的时区数据库。 -- `timeZooneName`:可能的值为`long`、`short`。 +- `timeZoneName`:可能的值为`long`、`short`。 - `hour12`:24小时周期还是12小时周期,可能的值为`true`、`false`。 下面是用法实例。 From f901426d946ba4ced8f3b0ff70bc73d01e27c382 Mon Sep 17 00:00:00 2001 From: Jim Gao Date: Tue, 1 Mar 2022 13:14:29 +0800 Subject: [PATCH 073/112] docs: fix url (#239) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix url * fix url * docs(basic/grammar): update url Update 2013-06-22: “Basic JavaScript: an introduction to the language” is an improved longer version of this post * docs(types/number): fix url * docs(types/object): remove extra word * docs(types/function): fix url * docs(operators/bit): update url * docs(features/style): fix url * docs(stdlib/date): update url * docs(oop/prototype): update url * docs(async/promise): fix url * docs(bom/engine): update url --- docs/async/promise.md | 2 +- docs/basic/grammar.md | 2 +- docs/basic/history.md | 6 +++--- docs/bom/engine.md | 2 +- docs/features/style.md | 2 +- docs/oop/prototype.md | 2 +- docs/operators/bit.md | 2 +- docs/stdlib/date.md | 4 ++-- docs/types/function.md | 2 +- docs/types/number.md | 2 +- docs/types/object.md | 2 +- 11 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/async/promise.md b/docs/async/promise.md index 68b5c07..cb629d7 100644 --- a/docs/async/promise.md +++ b/docs/async/promise.md @@ -274,7 +274,7 @@ console.log(3); ## 参考链接 -- Sebastian Porto, [Asynchronous JS: Callbacks, Listeners, Control Flow Libs and Promises](http://sporto.github.com/blog/2012/12/09/callbacks-listeners-promises/) +- Sebastian Porto, [Asynchronous JS: Callbacks, Listeners, Control Flow Libs and Promises](https://sporto.github.io/blog/2012/12/09/callbacks-listeners-promises/) - Rhys Brett-Bowen, [Promises/A+ - understanding the spec through implementation](http://modernjavascript.blogspot.com/2013/08/promisesa-understanding-by-doing.html) - Matt Podwysocki, Amanda Silver, [Asynchronous Programming in JavaScript with “Promises”](http://blogs.msdn.com/b/ie/archive/2011/09/11/asynchronous-programming-in-javascript-with-promises.aspx) - Marc Harter, [Promise A+ Implementation](https://gist.github.com//wavded/5692344) diff --git a/docs/basic/grammar.md b/docs/basic/grammar.md index 1611427..b1ebde1 100644 --- a/docs/basic/grammar.md +++ b/docs/basic/grammar.md @@ -727,4 +727,4 @@ top: ## 参考链接 -- Axel Rauschmayer, [A quick overview of JavaScript](http://www.2ality.com/2011/10/javascript-overview.html) +- Axel Rauschmayer, [Basic JavaScript for the impatient programmer](https://2ality.com/2013/06/basic-javascript.html) diff --git a/docs/basic/history.md b/docs/basic/history.md index 0c03d6d..f5c266b 100644 --- a/docs/basic/history.md +++ b/docs/basic/history.md @@ -181,7 +181,7 @@ JavaScript 伴随着互联网的发展一起发展。互联网周边技术的快 ## 参考链接 -- Axel Rauschmayer, [The Past, Present, and Future of JavaScript](http://oreilly.com/javascript/radarreports/past-present-future-javascript.csp) +- Axel Rauschmayer, [The Past, Present, and Future of JavaScript](https://www.oreilly.com/library/view/the-past-present/9781449343545/) - John Dalziel, [The race for speed part 4: The future for JavaScript](http://creativejs.com/2013/06/the-race-for-speed-part-4-the-future-for-javascript/) -- Axel Rauschmayer, [Basic JavaScript for the impatient programmer](http://www.2ality.com/2013/06/basic-javascript.html) -- resin.io, [Happy 18th Birthday JavaScript! A look at an unlikely past and bright future](http://resin.io/happy-18th-birthday-javascript/) +- Axel Rauschmayer, [Basic JavaScript for the impatient programmer](https://www.2ality.com/2013/06/basic-javascript.html) +- balena.io, [Happy 18th Birthday JavaScript! A look at an unlikely past and bright future](https://www.balena.io/blog/happy-18th-birthday-javascript/) diff --git a/docs/bom/engine.md b/docs/bom/engine.md index 86e7f53..8c0761e 100644 --- a/docs/bom/engine.md +++ b/docs/bom/engine.md @@ -436,4 +436,4 @@ JavaScript 是一种解释型语言,也就是说,它不需要编译,由解 - Axel Rauschmayer, [ECMAScript 6 promises (1/2): foundations](http://www.2ality.com/2014/09/es6-promises-foundations.html) - Daniel Imms, [async vs defer attributes](http://www.growingwiththeweb.com/2014/02/async-vs-defer-attributes.html) - Craig Buckler, [Load Non-blocking JavaScript with HTML5 Async and Defer](http://www.sitepoint.com/non-blocking-async-defer/) -- Domenico De Felice, [How browsers work](http://domenicodefelice.blogspot.sg/2015/08/how-browsers-work.html?t=2) +- Domenico De Felice, [How browsers work](https://domenicodefelice.blogspot.com/2015/08/how-browsers-work.html) diff --git a/docs/features/style.md b/docs/features/style.md index 8947aca..0ea77e1 100644 --- a/docs/features/style.md +++ b/docs/features/style.md @@ -486,7 +486,7 @@ function doAction(action) { ## 参考链接 -- Eric Elliott, Programming JavaScript Applications, [Chapter 2. JavaScript Style Guide](http://chimera.labs.oreilly.com/books/1234000000262/ch02.html), O'Reilly, 2013 +- Eric Elliott, Programming JavaScript Applications, [Chapter 2. JavaScript Style Guide](https://www.oreilly.com/library/view/programming-javascript-applications/9781491950289/), O'Reilly, 2014 - Axel Rauschmayer, [A meta style guide for JavaScript](http://www.2ality.com/2013/07/meta-style-guide.html) - Axel Rauschmayer, [Automatic semicolon insertion in JavaScript](http://www.2ality.com/2011/05/semicolon-insertion.html) - Rod Vagg, [JavaScript and Semicolons](http://dailyjs.com/2012/04/19/semicolons/) diff --git a/docs/oop/prototype.md b/docs/oop/prototype.md index 76077e2..d1ae8df 100644 --- a/docs/oop/prototype.md +++ b/docs/oop/prototype.md @@ -637,4 +637,4 @@ var module1 = (function ($, YAHOO) { ## 参考链接 -- [JavaScript Modules: A Beginner’s Guide](https://medium.freecodecamp.com/javascript-modules-a-beginner-s-guide-783f7d7a5fcc), by Preethi Kasireddy +- [JavaScript Modules: A Beginner’s Guide](https://www.freecodecamp.org/news/javascript-modules-a-beginner-s-guide-783f7d7a5fcc), by Preethi Kasireddy diff --git a/docs/operators/bit.md b/docs/operators/bit.md index edbb8b4..3c86e3d 100644 --- a/docs/operators/bit.md +++ b/docs/operators/bit.md @@ -353,6 +353,6 @@ flags = ~flags; ## 参考链接 -- Michal Budzynski, [JavaScript: The less known parts. Bitwise Operators](http://michalbe.blogspot.co.uk/2013/03/javascript-less-known-parts-bitwise.html) +- Michal Budzynski, [JavaScript: The less known parts. Bitwise Operators](https://michalbe.blogspot.com/2013/03/javascript-less-known-parts-bitwise.html) - Axel Rauschmayer, [Basic JavaScript for the impatient programmer](http://www.2ality.com/2013/06/basic-javascript.html) - Mozilla Developer Network, [Bitwise Operators](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators) diff --git a/docs/stdlib/date.md b/docs/stdlib/date.md index af7ad94..2b0326e 100644 --- a/docs/stdlib/date.md +++ b/docs/stdlib/date.md @@ -545,5 +545,5 @@ d // Sun Jan 06 2013 06:00:00 GMT+0800 (CST) ## 参考链接 -- Rakhitha Nimesh,[Getting Started with the Date Object](http://jspro.com/raw-javascript/beginners-guide-to-javascript-date-and-time/) -- Ilya Kantor, [Date/Time functions](http://javascript.info/tutorial/datetime-functions) +- Rakhitha Nimesh,[Getting Started with the Date Object](https://www.sitepoint.com/beginners-guide-to-javascript-date-and-time/) +- Ilya Kantor, [Date/Time functions](https://javascript.info/date) diff --git a/docs/types/function.md b/docs/types/function.md index d8e649e..ef8625f 100644 --- a/docs/types/function.md +++ b/docs/types/function.md @@ -993,7 +993,7 @@ window.eval('...') - Ben Alman, [Immediately-Invoked Function Expression (IIFE)](http://benalman.com/news/2010/11/immediately-invoked-function-expression/) - Mark Daggett, [Functions Explained](http://markdaggett.com/blog/2013/02/15/functions-explained/) -- Juriy Zaytsev, [Named function expressions demystified](http://kangax.github.com/nfe/) +- Juriy Zaytsev, [Named function expressions demystified](http://kangax.github.io/nfe/) - Marco Rogers polotek, [What is the arguments object?](http://docs.nodejitsu.com/articles/javascript-conventions/what-is-the-arguments-object) - Juriy Zaytsev, [Global eval. What are the options?](http://perfectionkills.com/global-eval-what-are-the-options/) - Axel Rauschmayer, [Evaluating JavaScript code via eval() and new Function()](http://www.2ality.com/2014/01/eval.html) diff --git a/docs/types/number.md b/docs/types/number.md index af8954e..64f0592 100644 --- a/docs/types/number.md +++ b/docs/types/number.md @@ -651,4 +651,4 @@ isFinite(-1) // true ## 参考链接 - Dr. Axel Rauschmayer, [How numbers are encoded in JavaScript](http://www.2ality.com/2012/04/number-encoding.html) -- Humphry, [JavaScript 中 Number 的一些表示上/下限](http://blog.segmentfault.com/humphry/1190000000407658) +- Humphry, [JavaScript 中 Number 的一些表示上/下限](https://segmentfault.com/a/1190000000407658) diff --git a/docs/types/object.md b/docs/types/object.md index 9e50984..3ff539c 100644 --- a/docs/types/object.md +++ b/docs/types/object.md @@ -497,5 +497,5 @@ console.log(temp.p1 + temp.p2); - Dr. Axel Rauschmayer,[Object properties in JavaScript](http://www.2ality.com/2012/10/javascript-properties.html) - Lakshan Perera, [Revisiting JavaScript Objects](http://www.laktek.com/2012/12/29/revisiting-javascript-objects/) -- Angus Croll, [The Secret Life of JavaScript Primitives](http://javascriptweblog.wordpress.com/2010/09/27/the-secret-life-of-javascript-primitives/)i +- Angus Croll, [The Secret Life of JavaScript Primitives](http://javascriptweblog.wordpress.com/2010/09/27/the-secret-life-of-javascript-primitives/) - Dr. Axel Rauschmayer, [JavaScript’s with statement and why it’s deprecated](http://www.2ality.com/2011/06/with-statement.html) From bf18144c97bae1662f72cc02ecbbf7d75093a076 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Tue, 1 Mar 2022 13:41:56 +0800 Subject: [PATCH 074/112] docs(types/function): fix #239 broken reference link --- docs/types/function.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/types/function.md b/docs/types/function.md index ef8625f..76dcbfb 100644 --- a/docs/types/function.md +++ b/docs/types/function.md @@ -992,7 +992,7 @@ window.eval('...') ## 参考链接 - Ben Alman, [Immediately-Invoked Function Expression (IIFE)](http://benalman.com/news/2010/11/immediately-invoked-function-expression/) -- Mark Daggett, [Functions Explained](http://markdaggett.com/blog/2013/02/15/functions-explained/) +- Mark Daggett, [Functions Explained](https://web.archive.org/web/20160911170816/http://markdaggett.com/blog/2013/02/15/functions-explained/) - Juriy Zaytsev, [Named function expressions demystified](http://kangax.github.io/nfe/) - Marco Rogers polotek, [What is the arguments object?](http://docs.nodejitsu.com/articles/javascript-conventions/what-is-the-arguments-object) - Juriy Zaytsev, [Global eval. What are the options?](http://perfectionkills.com/global-eval-what-are-the-options/) From b5ccb913171f73f18b8743701d37a6e1e53df0d1 Mon Sep 17 00:00:00 2001 From: hehe1111 <2908749709@qq.com> Date: Tue, 5 Apr 2022 20:50:45 +0800 Subject: [PATCH 075/112] =?UTF-8?q?=E8=B7=9F=20160=20=E8=A1=8C=E7=9A=84=20?= =?UTF-8?q?Content-Type=20=E9=87=8D=E5=A4=8D=E4=BA=86=20(#241)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/bom/cors.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/bom/cors.md b/docs/bom/cors.md index 368ea0c..23dfac9 100644 --- a/docs/bom/cors.md +++ b/docs/bom/cors.md @@ -162,7 +162,6 @@ Content-Encoding: gzip Content-Length: 0 Keep-Alive: timeout=2, max=100 Connection: Keep-Alive -Content-Type: text/plain ``` 上面的 HTTP 回应中,关键的是`Access-Control-Allow-Origin`字段,表示`http://api.bob.com`可以请求数据。该字段也可以设为星号,表示同意任意跨源请求。 From c0737828d443c2fb939054417c0a22a7505f0c75 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Thu, 7 Apr 2022 13:47:00 +0800 Subject: [PATCH 076/112] docs(elements/input): edit valueAsNumber --- docs/elements/input.md | 13 +- package-lock.json | 1523 ---------------------------------------- 2 files changed, 12 insertions(+), 1524 deletions(-) delete mode 100644 package-lock.json diff --git a/docs/elements/input.md b/docs/elements/input.md index 9a04e0e..fce544a 100644 --- a/docs/elements/input.md +++ b/docs/elements/input.md @@ -75,7 +75,18 @@ - `labels`:返回一个`NodeList`实例,代表绑定当前``节点的`