From 68e25ae1d5220eb173a98fa99c7d7233ed8e02d1 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2019年8月27日 21:47:13 +0800 Subject: [PATCH 001/179] docs(dom): edit document --- docs/dom/document.md | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/docs/dom/document.md b/docs/dom/document.md index 4d1f8b1..7f4b8ed 100644 --- a/docs/dom/document.md +++ b/docs/dom/document.md @@ -584,19 +584,6 @@ var element = document.elementFromPoint(50, 50); var elements = document.elementsFromPoint(x, y); ``` -### document.caretPositionFromPoint() - -`document.caretPositionFromPoint()`返回一个 CaretPosition 对象,包含了指定坐标点在节点对象内部的位置信息。CaretPosition 对象就是光标插入点的概念,用于确定光标点在文本对象内部的具体位置。 - -```javascript -var range = document.caretPositionFromPoint(clientX, clientY); -``` - -上面代码中,`range`是指定坐标点的 CaretPosition 对象。该对象有两个属性。 - -- CaretPosition.offsetNode:该位置的节点对象 -- CaretPosition.offset:该位置在`offsetNode`对象内部,与起始位置相距的字符数。 - ### document.createElement() `document.createElement`方法用来生成元素节点,并返回该节点。 From c4c14a85dad30f20c6e414366008f706974d52d7 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2019年8月27日 21:50:01 +0800 Subject: [PATCH 002/179] refact: update dependencies --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dbe89ea..b89184a 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "homepage": "https://github.com/wangdoc/javascript-tutorial", "dependencies": { "gh-pages": "latest", - "husky": "^0.14.3", + "husky": "3.x", "loppo": "latest", "loppo-theme-wangdoc": "latest" } From 304fd0743b2700cf8f7ec6d10cabd0181068a791 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2019年8月27日 21:52:14 +0800 Subject: [PATCH 003/179] refact: update dependencies --- package.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index b89184a..7328981 100644 --- a/package.json +++ b/package.json @@ -7,13 +7,17 @@ "doc": "docs" }, "scripts": { - "prepush": "npm update", "build": "loppo --site \"JavaScript 教程\" --id javascript --theme wangdoc", "build-and-commit": "npm run build && npm run commit", "commit": "gh-pages --dist dist --dest dist/javascript --branch master --add --repo git@github.com:wangdoc/website.git", "chapter": "loppo chapter", "test": "echo \"Error: no test specified\" && exit 1" }, + "husky": { + "hooks": { + "pre-push": "npm update" + } + }, "repository": { "type": "git", "url": "git+https://github.com/wangdoc/javascript-tutorial.git" From 4f78aa4843a8a9ea31847d4f5de86313188ece38 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Mon, 9 Sep 2019 19:27:03 +0800 Subject: [PATCH 004/179] docs(bom): edit Cookie --- docs/bom/cookie.md | 120 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 106 insertions(+), 14 deletions(-) diff --git a/docs/bom/cookie.md b/docs/bom/cookie.md index 789151b..a18ff85 100644 --- a/docs/bom/cookie.md +++ b/docs/bom/cookie.md @@ -2,38 +2,36 @@ ## 概述 -Cookie 是服务器保存在浏览器的一小段文本信息,每个 Cookie 的大小一般不能超过4KB。浏览器每次向服务器发出请求,就会自动附上这段信息。 +Cookie 是服务器保存在浏览器的一小段文本信息,一般大小不能超过4KB。浏览器每次向服务器发出请求,就会自动附上这段信息。 -Cookie 主要用来分辨两个请求是否来自同一个浏览器,以及用来保存一些状态信息。它的常用场合有以下一些。 +Cookie 主要保存状态信息,以下是一些主要用途。 - 对话(session)管理:保存登录、购物车等需要记录的信息。 -- 个性化:保存用户的偏好,比如网页的字体大小、背景色等等。 -- 追踪:记录和分析用户行为。 +- 个性化信息:保存用户的偏好,比如网页的字体大小、背景色等等。 +- 追踪用户:记录和分析用户行为。 -有些开发者使用 Cookie 作为客户端储存。这样做虽然可行,但是并不推荐,因为 Cookie 的设计目标并不是这个,它的容量很小(4KB),缺乏数据操作接口,而且会影响性能。客户端储存应该使用 Web storage API 和 IndexedDB。 +Cookie 不是一种理想的客户端储存机制。它的容量很小(4KB),缺乏数据操作接口,而且会影响性能。客户端储存应该使用 Web storage API 和 IndexedDB。只有那些每次请求都需要让服务器知道的信息,才应该放在 Cookie 里面。 -Cookie 包含以下几方面的信息。 +每个 Cookie 都有以下几方面的元数据。 - Cookie 的名字 - Cookie 的值(真正的数据写在这里面) -- 到期时间 -- 所属域名(默认是当前域名) -- 生效的路径(默认是当前网址) +- 到期时间(超过这个时间会失效) +- 所属域名(默认为当前域名) +- 生效的路径(默认为当前网址) -举例来说,用户访问网址`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 功能。 +用户可以设置浏览器不接受 Cookie,也可以设置不向服务器发送 Cookie。`window.navigator.cookieEnabled`属性返回一个布尔值,表示浏览器是否打开 Cookie 功能。 ```javascript -// 浏览器是否打开 Cookie 功能 window.navigator.cookieEnabled // true ``` `document.cookie`属性返回当前网页的 Cookie。 ```javascript -// 当前网页的 Cookie -document.cookie +document.cookie // "id=foo;key=bar" ``` 不同浏览器对 Cookie 数量和大小的限制,是不一样的。一般来说,单个域名设置的 Cookie 不应超过30个,每个 Cookie 的大小不能超过4KB。超过限制以后,Cookie 将被忽略,不会被设置。 @@ -181,6 +179,95 @@ Set-Cookie: id=a3fWa; Expires=2015年10月21日 07:28:00 GMT; 上面是跨站点载入的一个恶意脚本的代码,能够将当前网页的 Cookie 发往第三方服务器。如果设置了一个 Cookie 的`HttpOnly`属性,上面代码就不会读到该 Cookie。 +### SameSite + +Chrome 51 开始,浏览器的 Cookie 新增加了一个`SameSite`属性,用来防止 CSRF 攻击和用户追踪。 + +Cookie 往往用来存储用户的身份信息,恶意网站可以设法伪造带有正确 Cookie 的 HTTP 请求,这就是 CSRF 攻击。举例来说,用户登陆了银行网站`your-bank.com`,银行服务器发来了一个 Cookie。 + +```http +Set-Cookie:id=a3fWa; +``` + +用户后来又访问了恶意网站`malicious.com`,上面有一个表单。 + +```html +
+ ... +
+``` + +用户一旦被诱骗发送这个表单,银行网站就会收到带有正确 Cookie 的请求。为了防止这种攻击,表单一般都带有一个随机 token,告诉服务器这是真实请求。 + +```html +
+ + ... +
+``` + +这种第三方网站引导发出的 Cookie,就称为第三方 Cookie。它除了用于 CSRF 攻击,还可以用于用户追踪。比如,Facebook 在第三方网站插入一张看不见的图片。 + +```html + +``` + +浏览器加载上面代码时,就会向 Facebook 发出带有 Cookie 的请求,从而 Facebook 就会知道你是谁,访问了什么网站。 + +Cookie 的`SameSite`属性用来限制第三方 Cookie,从而减少安全风险。它可以设置三个值。 + +> - Strict +> - Lax +> - None + +**(1)Strict** + +`Strict`最为严格,完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。换言之,只有当前网页的 URL 与请求目标一致,才会带上 Cookie。 + +```http +Set-Cookie: CookieName=CookieValue; SameSite=Strict; +``` + +这个规则过于严格,可能造成非常不好的用户体验。比如,当前网页有一个 GitHub 链接,用户点击跳转就不会带有 GitHub 的 Cookie,跳转过去总是未登陆状态。 + +**(2)Lax** + +`Lax`规则稍稍放宽,大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外。 + +```html +Set-Cookie: CookieName=CookieValue; SameSite=Lax; +``` + +导航到目标网址的 GET 请求,只包括三种情况:链接,预加载请求,GET 表单。详见下表。 + +| 请求类型 | 示例 | 正常情况 | Lax | +|-----------|:------------------------------------:|------------:|-------------| +| 链接 | `` | 发送 Cookie | 发送 Cookie | +| 预加载 | `` | 发送 Cookie | 发送 Cookie | +| GET 表单 | `
` | 发送 Cookie | 发送 Cookie | +| POST 表单 | `` | 发送 Cookie | 不发送 | +| iframe | `[フレーム]` | 发送 Cookie | 不发送 | +| AJAX | `$.get("...")` | 发送 Cookie | 不发送 | +| Image | `` | 发送 Cookie | 不发送 | + +设置了`Strict`或`Lax`以后,基本就杜绝了 CSRF 攻击。当然,前提是用户浏览器支持 SameSite 属性。 + +**(3)None** + +Chrome 计划将`Lax`变为默认设置。这时,网站可以选择显式关闭`SameSite`属性,将其设为`None`。不过,前提是必须同时设置`Secure`属性(Cookie 只能通过 HTTPS 协议发送),否则无效。 + +下面的设置无效。 + +```text +Set-Cookie: widget_session=abc123; SameSite=None +``` + +下面的设置有效。 + +```text +Set-Cookie: widget_session=abc123; SameSite=None; Secure +``` + ## document.cookie `document.cookie`属性用于读写当前网页的 Cookie。 @@ -259,3 +346,8 @@ document.cookie = 'fontSize=;expires=Thu, 01-Jan-1970 00:00:01 GMT'; ## 参考链接 - [HTTP cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies), by MDN +- [Using the Same-Site Cookie Attribute to Prevent CSRF Attacks](https://www.netsparker.com/blog/web-security/same-site-cookie-attribute-prevent-cross-site-request-forgery/) +- [SameSite cookies explained](https://web.dev/samesite-cookies-explained) +- [Tough Cookies](https://scotthelme.co.uk/tough-cookies/), Scott Helme +- [Cross-Site Request Forgery is dead!](https://scotthelme.co.uk/csrf-is-dead/), Scott Helme + From ecef95529e3720f1f951d691160ebd104a7652e2 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2019年9月10日 15:36:58 +0800 Subject: [PATCH 005/179] docs(dom): edit CSS --- docs/dom/css.md | 9 +++++++-- package.json | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/dom/css.md b/docs/dom/css.md index eaa28cd..d6d01db 100644 --- a/docs/dom/css.md +++ b/docs/dom/css.md @@ -1,10 +1,10 @@ # CSS 操作 -CSS 与 JavaScript 是两个有着明确分工的领域,前者负责页面的视觉效果,后者负责与用户的行为互动。但是,它们毕竟同属网页开发的前端,因此不可避免有着交叉和互相配合。本节介绍如何通过 JavaScript 操作 CSS。 +CSS 与 JavaScript 是两个有着明确分工的领域,前者负责页面的视觉效果,后者负责与用户的行为互动。但是,它们毕竟同属网页开发的前端,因此不可避免有着交叉和互相配合。本章介绍如何通过 JavaScript 操作 CSS。 ## HTML 元素的 style 属性 -操作 CSS 样式最简单的方法,就是使用网页元素节点的`getAttribute`方法、`setAttribute`方法和`removeAttribute`方法,直接读写或删除网页元素的`style`属性。 +操作 CSS 样式最简单的方法,就是使用网页元素节点的`getAttribute()`方法、`setAttribute()`方法和`removeAttribute()`方法,直接读写或删除网页元素的`style`属性。 ```javascript div.setAttribute( @@ -756,6 +756,8 @@ var mdl = window.matchMedia('(min-width: 400px)'); mdl instanceof MediaQueryList // true ``` +上面代码中,变量`mdl`就是 mediaQueryList 的实例。 + 注意,如果参数不是有效的`MediaQuery`条件语句,`window.matchMedia`不会报错,依然返回一个 MediaQueryList 实例。 ```javascript @@ -841,3 +843,6 @@ function mqCallback(e) { } } ``` + +注意,`MediaQueryList.removeListener()`方法不能撤销`MediaQueryList.onchange`属性指定的监听函数。 + diff --git a/package.json b/package.json index 7328981..a7eeda3 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "homepage": "https://github.com/wangdoc/javascript-tutorial", "dependencies": { "gh-pages": "latest", - "husky": "3.x", + "husky": "^3.0.5", "loppo": "latest", "loppo-theme-wangdoc": "latest" } From ad6049aa962adedb2442dc4cd9eba8bd87753b5a Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2019年9月12日 17:05:06 +0800 Subject: [PATCH 006/179] docs(dom): edit mutationobserver --- 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 c638f15..e44f9a1 100644 --- a/docs/dom/mutationobserver.md +++ b/docs/dom/mutationobserver.md @@ -81,7 +81,7 @@ mutationObserver.observe(document.documentElement, { }); ``` -对一个节点添加观察器,就像使用`addEventListener`方法一样,多次添加同一个观察器是无效的,回调函数依然只会触发一次。但是,如果指定不同的`options`对象,就会被当作两个不同的观察器。 +对一个节点添加观察器,就像使用`addEventListener`方法一样,多次添加同一个观察器是无效的,回调函数依然只会触发一次。如果指定不同的`options`对象,以后面添加的那个为准,类似覆盖。 下面的例子是观察新增的子节点。 From 11d71b0b11d2b4b699abbf13758ed5ff46c17161 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2019年9月12日 17:08:19 +0800 Subject: [PATCH 007/179] docs(bom): edit form --- docs/bom/form.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/bom/form.md b/docs/bom/form.md index 855724a..6773acd 100644 --- a/docs/bom/form.md +++ b/docs/bom/form.md @@ -42,7 +42,7 @@ Content-Length: 74 user_name=张三&user_passwd=123&submit_button=提交 ``` -注意,实际提交的时候,只要键值不是 URL 的合法字符(比如汉字"张三"和"确定"),浏览器会自动对其进行编码。 +注意,实际提交的时候,只要键值不是 URL 的合法字符(比如汉字"张三"和"提交"),浏览器会自动对其进行编码。 点击`submit`控件,就可以提交表单。 From dcd00fe32b3c4626809baf300888c12c383cba53 Mon Sep 17 00:00:00 2001 From: Vincent Hy Date: 2019年9月17日 16:01:37 +0800 Subject: [PATCH 008/179] =?UTF-8?q?=E6=9B=B4=E6=AD=A3=20'instanceOf'=20?= =?UTF-8?q?=E6=8B=BC=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 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 e463e57..f01c701 100644 --- a/docs/oop/prototype.md +++ b/docs/oop/prototype.md @@ -323,7 +323,7 @@ s instanceof String // false 上面代码中,字符串不是`String`对象的实例(因为字符串不是对象),所以返回`false`。 -此外,对于`undefined`和`null`,`instanceOf`运算符总是返回`false`。 +此外,对于`undefined`和`null`,`instanceof`运算符总是返回`false`。 ```javascript undefined instanceof Object // false From 727c26c72b49cba68d353a8fdd14354e93b325e1 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2019年9月30日 17:25:14 +0800 Subject: [PATCH 009/179] docs(bom): edit form --- docs/bom/form.md | 73 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/docs/bom/form.md b/docs/bom/form.md index 6773acd..c4bb42b 100644 --- a/docs/bom/form.md +++ b/docs/bom/form.md @@ -214,6 +214,16 @@ for (var pair of formData) { 如果一个控件通过验证,它就会匹配`:valid`的 CSS 伪类,浏览器会继续进行表单提交的流程。如果没有通过验证,该控件就会匹配`:invalid`的 CSS 伪类,浏览器会终止表单提交,并显示一个错误信息。 +```css +input:invalid { + border-color: red; +} +input, +input:valid { + border-color: #ccc; +} +``` + ### checkValidity() 除了提交表单的时候,浏览器自动校验表单,还可以手动触发表单的校验。表单元素和表单控件都有`checkValidity()`方法,用于手动触发校验。 @@ -279,7 +289,33 @@ if (!myInput.checkValidity()) { 控件元素的`setCustomValidity()`方法用来定制校验失败时的报错信息。它接受一个字符串作为参数,该字符串就是定制的报错信息。如果参数为空字符串,则上次设置的报错信息被清除。 -如果调用这个方法,并且参数不为空字符串,浏览器就会认为控件没有通过校验,就会立刻显示该方法设置的报错信息。 +这个方法可以替换浏览器内置的表单验证报错信息,参数就是要显示的报错信息。 + +```html + + + + +``` + +上面的表单输入框,要求只能输入小写字母,且不得超过15个字符。如果输入不符合要求(比如输入"ABC"),提交表单的时候,Chrome 浏览器会弹出报错信息"Please match the requested format.",禁止表单提交。下面使用`setCustomValidity()`方法替换掉报错信息。 + +```javascript +var input = document.getElementById('username'); +input.oninvalid = function (event) { + event.target.setCustomValidity( + '用户名必须是小写字母,不能为空,最长不超过15个字符' + ); +} +``` + +上面代码中,`setCustomValidity()`方法是在`invalid`事件的监听函数里面调用。该方法也可以直接调用,这时如果参数不为空字符串,浏览器就会认为该控件没有通过校验,就会立刻显示该方法设置的报错信息。 ```javascript /* HTML 代码如下 @@ -345,6 +381,37 @@ if (document.getElementById('myInput').validity.rangeOverflow) { document.getElementById('prompt').innerHTML = txt; ``` +如果想禁止浏览器弹出表单验证的报错信息,可以监听`invalid`事件。 + +```javascript +var input = document.getElementById('username'); +var form = document.getElementById('form'); + +var elem = document.createElement('div'); +elem.id = 'notify'; +elem.style.display = 'none'; +form.appendChild(elem); + +input.addEventListener('invalid', function (event) { + event.preventDefault(); + if (!event.target.validity.valid) { + elem.textContent = '用户名必须是小写字母'; + elem.className = 'error'; + elem.style.display = 'block'; + input.className = 'invalid animated shake'; + } +}); + +input.addEventListener('input', function(event){ + if ( 'block' === elem.style.display ) { + input.className = ''; + elem.style.display = 'none'; + } +}); +``` + +上面代码中,一旦发生`invalid`事件(表单验证失败),`event.preventDefault()`用来禁止浏览器弹出默认的验证失败提示,然后设置定制的报错提示框。 + ### 表单的 novalidate 属性 表单元素的 HTML 属性`novalidate`,可以关闭浏览器的自动校验。 @@ -553,3 +620,7 @@ xhr.open('POST', 'myserver/uploads'); xhr.setRequestHeader('Content-Type', file.type); xhr.send(file); ``` + +## 参考链接 + +- [HTML5 Form Validation With the "pattern" Attribute](https://webdesign.tutsplus.com/tutorials/html5-form-validation-with-the-pattern-attribute--cms-25145), Thoriq Firdaus From 486addf67169806ce731003a112183c29082d323 Mon Sep 17 00:00:00 2001 From: harriet247 <50596251+harriet247@users.noreply.github.com> Date: Thu, 3 Oct 2019 10:45:40 -0700 Subject: [PATCH 010/179] Update arraybuffer.md --- docs/bom/arraybuffer.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/bom/arraybuffer.md b/docs/bom/arraybuffer.md index fea14b8..1ad0e2b 100644 --- a/docs/bom/arraybuffer.md +++ b/docs/bom/arraybuffer.md @@ -73,7 +73,7 @@ myBlob.type // "text/html" `Blob`具有一个实例方法`slice`,用来拷贝原来的数据,返回的也是一个`Blob`实例。 ```javascript -myBlob.slice(start,end, contentType) +myBlob.slice(start, end, contentType) ``` `slice`方法有三个参数,都是可选的。它们依次是起始的字节位置(默认为0)、结束的字节位置(默认为`size`属性的值,该位置本身将不包含在拷贝的数据之中)、新实例的数据类型(默认为空字符串)。 From cbf8fcf2b7d2bdc99d11a80d22cd4fd96111b859 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sun, 6 Oct 2019 10:12:56 +0800 Subject: [PATCH 011/179] docs(stdlib): edit array/sort --- docs/stdlib/array.md | 14 +++++++++++++- package.json | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/docs/stdlib/array.md b/docs/stdlib/array.md index b8736d4..97912f2 100644 --- a/docs/stdlib/array.md +++ b/docs/stdlib/array.md @@ -402,7 +402,7 @@ a // [1, 2] // [10111, 1101, 111] ``` -上面代码的最后两个例子,需要特殊注意。`sort`方法不是按照大小排序,而是按照字典顺序。也就是说,数值会被先转成字符串,再按照字典顺序进行比较,所以`101`排在`11`的前面。 +上面代码的最后两个例子,需要特殊注意。`sort()`方法不是按照大小排序,而是按照字典顺序。也就是说,数值会被先转成字符串,再按照字典顺序进行比较,所以`101`排在`11`的前面。 如果想让`sort`方法按照自定义方式排序,可以传入一个函数作为参数。 @@ -430,6 +430,18 @@ a // [1, 2] // ] ``` +注意,自定义的排序函数应该返回数值,否则不同的浏览器可能有不同的实现,不能保证结果都一致。 + +```javascript +// bad +[1, 4, 2, 6, 0, 6, 2, 6].sort((a, b) => a> b) + +// good +[1, 4, 2, 6, 0, 6, 2, 6].sort((a, b) => a - b) +``` + +上面代码中,前一种排序算法返回的是布尔值,这是不推荐使用的。后一种是数值,才是更好的写法。 + ### map() `map`方法将数组的所有成员依次传入参数函数,然后把每一次的执行结果组成一个新数组返回。 diff --git a/package.json b/package.json index a7eeda3..bceaca7 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "homepage": "https://github.com/wangdoc/javascript-tutorial", "dependencies": { "gh-pages": "latest", - "husky": "^3.0.5", + "husky": "^3.0.7", "loppo": "latest", "loppo-theme-wangdoc": "latest" } From ae4e9cfb4b77f85a0d38234b1e3d7c0417f74fa1 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sun, 6 Oct 2019 10:18:22 +0800 Subject: [PATCH 012/179] docs(stdlib): edit array/sort --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bceaca7..66e3f26 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "homepage": "https://github.com/wangdoc/javascript-tutorial", "dependencies": { "gh-pages": "latest", - "husky": "^3.0.7", + "husky": "^3.0.8", "loppo": "latest", "loppo-theme-wangdoc": "latest" } From b8523bcffed334a1acbdbb7b9c14b5663a50d980 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Mon, 7 Oct 2019 00:05:25 +0800 Subject: [PATCH 013/179] docs(stdlib): edit Number/toLocalString() --- docs/stdlib/number.md | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/docs/stdlib/number.md b/docs/stdlib/number.md index d585fff..dc5dcbc 100644 --- a/docs/stdlib/number.md +++ b/docs/stdlib/number.md @@ -144,7 +144,7 @@ Number.MIN_SAFE_INTEGER // -9007199254740991 ### Number.prototype.toPrecision() -`toPrecision`方法用于将一个数转为指定位数的有效数字。 +`Number.prototype.toPrecision()`方法用于将一个数转为指定位数的有效数字。 ```javascript (12.34).toPrecision(1) // "1e+1" @@ -154,9 +154,9 @@ Number.MIN_SAFE_INTEGER // -9007199254740991 (12.34).toPrecision(5) // "12.340" ``` -`toPrecision`方法的参数为有效数字的位数,范围是1到21,超出这个范围会抛出 RangeError 错误。 +该方法的参数为有效数字的位数,范围是1到21,超出这个范围会抛出 RangeError 错误。 -`toPrecision`方法用于四舍五入时不太可靠,跟浮点数不是精确储存有关。 +该方法用于四舍五入时不太可靠,跟浮点数不是精确储存有关。 ```javascript (12.35).toPrecision(3) // "12.3" @@ -165,6 +165,41 @@ Number.MIN_SAFE_INTEGER // -9007199254740991 (12.45).toPrecision(3) // "12.4" ``` +### Number.prototype.toLocaleString() + +`Number.prototype.toLocaleString()`方法接受一个地区码作为参数,返回一个字符串,表示当前数字在该地区的当地书写形式。 + +```javascript +(123).toLocaleString('zh-Hans-CN-u-nu-hanidec') +// "一二三" +``` + +该方法还可以接受第二个参数配置对象,用来定制指定用途的返回字符串。该对象的`style`属性指定输出样式,默认值是`decimal`,表示输出十进制形式。如果值为`percent`,表示输出百分数。 + +```javascript +(123).toLocaleString('zh-Hans-CN', { style: 'persent' }) +// "12,300%" +``` + +如果`style`属性的值为`currency`,则可以搭配`currency`属性,输出指定格式的货币字符串形式。 + +```javascript +(123).toLocaleString('zh-Hans-CN', { style: 'currency', currency: 'CNY' }) +// "123円.00" + +(123).toLocaleString('de-DE', { style: 'currency', currency: 'EUR' }) +// "123,00 €" + +(123).toLocaleString('en-US', { style: 'currency', currency: 'USD' }) +// "123ドル.00" +``` + +如果`Number.prototype.toLocaleString()`省略了参数,则由浏览器自行决定如何处理,通常会使用操作系统的地区设定。注意,该方法如果使用浏览器不认识的地区码,会抛出一个错误。 + +```javascript +(123).toLocaleString('123') // 出错 +``` + ## 自定义方法 与其他对象一样,`Number.prototype`对象上面可以自定义方法,被`Number`的实例继承。 From 23e3bcb59f4279f7b756cb76bd1bffcb0aba8fff Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2019年10月31日 00:03:34 +0800 Subject: [PATCH 014/179] docs(bom): fix #154 --- docs/bom/location.md | 54 +++++++++++++------------------------------- 1 file changed, 16 insertions(+), 38 deletions(-) diff --git a/docs/bom/location.md b/docs/bom/location.md index 3cec254..4ea667e 100644 --- a/docs/bom/location.md +++ b/docs/bom/location.md @@ -171,27 +171,13 @@ decodeURIComponent('%E6%98%A5%E8%8A%82') // "春节" ``` -## URL 对象 +## URL 接口 -`URL`对象是浏览器的原生对象,可以用来构造、解析和编码 URL。一般情况下,通过`window.URL`可以拿到这个对象。 - -``元素和``元素都部署了这个接口。这就是说,它们的 DOM 节点对象可以使用 URL 的实例属性和方法。 - -```javascript -var a = document.createElement('a'); -a.href = 'http://example.com/?foo=1'; - -a.hostname // "example.com" -a.search // "?foo=1" -``` - -上面代码中,`a`是``元素的 DOM 节点对象。可以在这个对象上使用 URL 的实例属性,比如`hostname`和`search`。 +`URL`接口是一个构造函数,浏览器原生提供,可以用来构造、解析和编码 URL。一般情况下,通过`window.URL`可以拿到这个构造函数。 ### 构造函数 -`URL`对象本身是一个构造函数,可以生成 URL 实例。 - -它接受一个表示 URL 的字符串作为参数。如果参数不是合法的 URL,会报错。 +`URL`作为构造函数,可以生成 URL 实例。它接受一个表示 URL 的字符串作为参数。如果参数不是合法的 URL,会报错。 ```javascript var url = new URL('http://www.example.com/index.html'); @@ -283,7 +269,7 @@ url.href // "http://example.com/index2.html#part2" **(1)URL.createObjectURL()** -`URL.createObjectURL`方法用来为上传/下载的文件、流媒体文件生成一个 URL 字符串。这个字符串代表了`File`对象或`Blob`对象的 URL。 +`URL.createObjectURL()`方法用来为上传/下载的文件、流媒体文件生成一个 URL 字符串。这个字符串代表了`File`对象或`Blob`对象的 URL。 ```javascript // HTML 代码如下 @@ -306,7 +292,7 @@ function handleFiles(files) { } ``` -上面代码中,`URL.createObjectURL`方法用来为上传的文件生成一个 URL 字符串,作为``元素的图片来源。 +上面代码中,`URL.createObjectURL()`方法用来为上传的文件生成一个 URL 字符串,作为``元素的图片来源。 该方法生成的 URL 就像下面的样子。 @@ -314,11 +300,11 @@ function handleFiles(files) { blob:http://localhost/c745ef73-ece9-46da-8f66-ebes574789b1 ``` -注意,每次使用`URL.createObjectURL`方法,都会在内存里面生成一个 URL 实例。如果不再需要该方法生成的 URL 字符串,为了节省内存,可以使用`URL.revokeObjectURL()`方法释放这个实例。 +注意,每次使用`URL.createObjectURL()`方法,都会在内存里面生成一个 URL 实例。如果不再需要该方法生成的 URL 字符串,为了节省内存,可以使用`URL.revokeObjectURL()`方法释放这个实例。 **(2)URL.revokeObjectURL()** -`URL.revokeObjectURL`方法用来释放`URL.createObjectURL`方法生成的 URL 实例。它的参数就是`URL.createObjectURL`方法返回的 URL 字符串。 +`URL.revokeObjectURL()`方法用来释放`URL.createObjectURL()`方法生成的 URL 实例。它的参数就是`URL.createObjectURL()`方法返回的 URL 字符串。 下面为上一段的示例加上`URL.revokeObjectURL()`。 @@ -337,7 +323,7 @@ function handleFiles(files) { } ``` -上面代码中,一旦图片加载成功以后,为本地文件生成的 URL 字符串就没用了,于是可以在`img.onload`回调函数里面,通过`URL.revokeObjectURL`方法卸载这个 URL 实例。 +上面代码中,一旦图片加载成功以后,为本地文件生成的 URL 字符串就没用了,于是可以在`img.onload`回调函数里面,通过`URL.revokeObjectURL()`方法卸载这个 URL 实例。 ## URLSearchParams 对象 @@ -390,14 +376,6 @@ var foo = url.searchParams.get('foo') || 'somedefault'; 上面代码中,URL 实例的`searchParams`属性就是一个`URLSearchParams`实例,所以可以使用`URLSearchParams`接口的`get`方法。 -DOM 的`a`元素节点的`searchParams`属性,就是一个`URLSearchParams`实例。 - -```javascript -var a = document.createElement('a'); -a.href = 'https://example.com?filter=api'; -a.searchParams.get('filter') // "api" -``` - `URLSearchParams`实例有遍历器接口,可以用`for...of`循环遍历(详见《ES6 标准入门》的《Iterator》一章)。 ```javascript @@ -434,7 +412,7 @@ window.location.href = location.pathname + '?' + params; ### URLSearchParams.append() -`append`方法用来追加一个查询参数。它接受两个参数,第一个为键名,第二个为键值,没有返回值。 +`append()`方法用来追加一个查询参数。它接受两个参数,第一个为键名,第二个为键值,没有返回值。 ```javascript var params = new URLSearchParams({'foo': 1 , 'bar': 2}); @@ -442,7 +420,7 @@ params.append('baz', 3); params.toString() // "foo=1&bar=2&baz=3" ``` -`append`方法不会识别是否键名已经存在。 +`append()`方法不会识别是否键名已经存在。 ```javascript var params = new URLSearchParams({'foo': 1 , 'bar': 2}); @@ -454,7 +432,7 @@ params.toString() // "foo=1&bar=2&foo=3" ### URLSearchParams.delete() -`delete`方法用来删除指定的查询参数。它接受键名作为参数。 +`delete()`方法用来删除指定的查询参数。它接受键名作为参数。 ```javascript var params = new URLSearchParams({'foo': 1 , 'bar': 2}); @@ -464,7 +442,7 @@ params.toString() // "foo=1" ### URLSearchParams.has() -`has`方法返回一个布尔值,表示查询字符串是否包含指定的键名。 +`has()`方法返回一个布尔值,表示查询字符串是否包含指定的键名。 ```javascript var params = new URLSearchParams({'foo': 1 , 'bar': 2}); @@ -474,7 +452,7 @@ params.has('baz') // false ### URLSearchParams.set() -`set`方法用来设置查询字符串的键值。 +`set()`方法用来设置查询字符串的键值。 它接受两个参数,第一个是键名,第二个是键值。如果是已经存在的键,键值会被改写,否则会被追加。 @@ -509,7 +487,7 @@ window.history.replaceState({}, '', location.pathname + `?` + params); ### URLSearchParams.get(),URLSearchParams.getAll() -`get`方法用来读取查询字符串里面的指定键。它接受键名作为参数。 +`get()`方法用来读取查询字符串里面的指定键。它接受键名作为参数。 ```javascript var params = new URLSearchParams('?foo=1'); @@ -528,7 +506,7 @@ params.get('foo') // "3" 上面代码中,查询字符串有三个`foo`键,`get`方法返回最前面的键值`3`。 -`getAll`方法返回一个数组,成员是指定键的所有键值。它接受键名作为参数。 +`getAll()`方法返回一个数组,成员是指定键的所有键值。它接受键名作为参数。 ```javascript var params = new URLSearchParams('?foo=1&foo=2'); @@ -539,7 +517,7 @@ params.getAll('foo') // ["1", "2"] ### URLSearchParams.sort() -`sort`方法对查询字符串里面的键进行排序,规则是按照 Unicode 码点从小到大排列。 +`sort()`方法对查询字符串里面的键进行排序,规则是按照 Unicode 码点从小到大排列。 该方法没有返回值,或者说返回值是`undefined`。 From ff74e42925763ae85fb1f6ea509fc69849357c8f Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2019年10月31日 00:16:01 +0800 Subject: [PATCH 015/179] refactor: upgrade node.js --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ead9a81..6304e69 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: node_js node_js: -- '8' +- '10' branches: only: From 786148c7b0363871eafc1327001623dfa4eaaf1b Mon Sep 17 00:00:00 2001 From: ruanyf Date: Mon, 4 Nov 2019 18:44:07 +0800 Subject: [PATCH 016/179] docs: fix #155 --- docs/stdlib/number.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/stdlib/number.md b/docs/stdlib/number.md index dc5dcbc..e0c2158 100644 --- a/docs/stdlib/number.md +++ b/docs/stdlib/number.md @@ -177,7 +177,7 @@ Number.MIN_SAFE_INTEGER // -9007199254740991 该方法还可以接受第二个参数配置对象,用来定制指定用途的返回字符串。该对象的`style`属性指定输出样式,默认值是`decimal`,表示输出十进制形式。如果值为`percent`,表示输出百分数。 ```javascript -(123).toLocaleString('zh-Hans-CN', { style: 'persent' }) +(123).toLocaleString('zh-Hans-CN', { style: 'percent' }) // "12,300%" ``` From 19d0628816dd19f6395e1f762c988d1ee1a85780 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2019年11月12日 05:38:48 +0800 Subject: [PATCH 017/179] docs(stdlib): fix Date.setDate --- docs/stdlib/date.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/stdlib/date.md b/docs/stdlib/date.md index 357913c..503c3b1 100644 --- a/docs/stdlib/date.md +++ b/docs/stdlib/date.md @@ -480,7 +480,7 @@ d.setDate(9) // 1357660800000 d // Wed Jan 09 2013 00:00:00 GMT+0800 (CST) ``` -`set*`方法的参数都会自动折算。以`setDate`为例,如果参数超过当月的最大天数,则向下一个月顺延,如果参数是负数,表示从上个月的最后一天开始减去的天数。 +`set*`方法的参数都会自动折算。以`setDate()`为例,如果参数超过当月的最大天数,则向下一个月顺延,如果参数是负数,表示从上个月的最后一天开始减去的天数。 ```javascript var d1 = new Date('January 6, 2013'); @@ -490,10 +490,12 @@ d1 // Fri Feb 01 2013 00:00:00 GMT+0800 (CST) var d2 = new Date ('January 6, 2013'); -d.setDate(-1) // 1356796800000 -d // Sun Dec 30 2012 00:00:00 GMT+0800 (CST) +d2.setDate(-1) // 1356796800000 +d2 // Sun Dec 30 2012 00:00:00 GMT+0800 (CST) ``` +上面代码中,`d1.setDate(32)`将日期设为1月份的32号,因为1月份只有31号,所以自动折算为2月1日。`d2.setDate(-1)`表示设为上个月的倒数第二天,即12月30日。 + `set`类方法和`get`类方法,可以结合使用,得到相对时间。 ```javascript From d3e17b1373c3fbb4f3ff6a5eef61532755e081f8 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2019年11月15日 01:12:31 +0800 Subject: [PATCH 018/179] docs(bom): edit window --- docs/bom/window.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/bom/window.md b/docs/bom/window.md index 4b75320..f5eea3b 100644 --- a/docs/bom/window.md +++ b/docs/bom/window.md @@ -416,7 +416,7 @@ window.moveTo(100, 200) 上面代码将窗口移动到屏幕`(100, 200)`的位置。 -`window.moveBy`方法将窗口移动到一个相对位置。它接受两个参数,分布是窗口左上角向右移动的水平距离和向下移动的垂直距离,单位为像素。 +`window.moveBy()`方法将窗口移动到一个相对位置。它接受两个参数,分别是窗口左上角向右移动的水平距离和向下移动的垂直距离,单位为像素。 ```javascript window.moveBy(25, 50) @@ -424,7 +424,7 @@ window.moveBy(25, 50) 上面代码将窗口向右移动25像素、向下移动50像素。 -为了防止有人滥用这两个方法,随意移动用户的窗口,目前只有一种情况,浏览器允许用脚本移动窗口:该窗口是用`window.open`方法新建的,并且它所在的 Tab 页是当前窗口里面唯一的。除此以外的情况,使用上面两个方法都是无效的。 +为了防止有人滥用这两个方法,随意移动用户的窗口,目前只有一种情况,浏览器允许用脚本移动窗口:该窗口是用`window.open()`方法新建的,并且窗口里只有它一个 Tab 页。除此以外的情况,使用上面两个方法都是无效的。 ### window.resizeTo(),window.resizeBy() From 4e1e7ddeb86a5d942e0fed698f62673af7c1ba8c Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2019年11月22日 18:56:54 +0800 Subject: [PATCH 019/179] docs: fix #157 --- docs/dom/document.md | 2 +- docs/dom/parentnode.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/dom/document.md b/docs/dom/document.md index 7f4b8ed..4a5315c 100644 --- a/docs/dom/document.md +++ b/docs/dom/document.md @@ -11,7 +11,7 @@ - Ajax 操作返回的文档,使用`XMLHttpRequest`对象的`responseXML`属性。 - 内部节点的`ownerDocument`属性。 -`document`对象继承了`EventTarget`接口、`Node`接口、`ParentNode`接口。这意味着,这些接口的方法都可以在`document`对象上调用。除此之外,`document`对象还有很多自己的属性和方法。 +`document`对象继承了`EventTarget`接口和`Node`接口,并且混入(mixin)了`ParentNode`接口。这意味着,这些接口的方法都可以在`document`对象上调用。除此之外,`document`对象还有很多自己的属性和方法。 ## 属性 diff --git a/docs/dom/parentnode.md b/docs/dom/parentnode.md index f440ff1..1aa2d0c 100644 --- a/docs/dom/parentnode.md +++ b/docs/dom/parentnode.md @@ -1,10 +1,10 @@ # ParentNode 接口,ChildNode 接口 -节点对象除了继承 Node 接口以外,还会继承其他接口。`ParentNode`接口表示当前节点是一个父节点,提供一些处理子节点的方法。`ChildNode`接口表示当前节点是一个子节点,提供一些相关方法。 +节点对象除了继承 Node 接口以外,还拥有其他接口。`ParentNode`接口表示当前节点是一个父节点,提供一些处理子节点的方法。`ChildNode`接口表示当前节点是一个子节点,提供一些相关方法。 ## ParentNode 接口 -如果当前节点是父节点,就会继承`ParentNode`接口。由于只有元素节点(element)、文档节点(document)和文档片段节点(documentFragment)拥有子节点,因此只有这三类节点会继承`ParentNode`接口。 +如果当前节点是父节点,就会混入了(mixin)`ParentNode`接口。由于只有元素节点(element)、文档节点(document)和文档片段节点(documentFragment)拥有子节点,因此只有这三类节点会拥有`ParentNode`接口。 ### ParentNode.children @@ -84,7 +84,7 @@ parent.append('Hello', p); ## ChildNode 接口 -如果一个节点有父节点,那么该节点就继承了`ChildNode`接口。 +如果一个节点有父节点,那么该节点就拥有了`ChildNode`接口。 ### ChildNode.remove() From 7f65d8b0e5873eead0d4ea91848c4b81a7c5d15e Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2019年11月28日 17:26:39 +0800 Subject: [PATCH 020/179] docs: fix #158 --- docs/features/error.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/error.md b/docs/features/error.md index c0b8ebb..17c33cd 100644 --- a/docs/features/error.md +++ b/docs/features/error.md @@ -406,7 +406,7 @@ result 上面代码中,`catch`代码块结束执行之前,会先执行`finally`代码块。 -`catch`代码块之中,触发转入`finally`代码快的标志,不仅有`return`语句,还有`throw`语句。 +`catch`代码块之中,触发转入`finally`代码块的标志,不仅有`return`语句,还有`throw`语句。 ```javascript function f() { From 173611cb7b46fd4a355e765566621355e594485e Mon Sep 17 00:00:00 2001 From: atimidguy <49008464+atimidguy@users.noreply.github.com> Date: 2019年12月24日 12:16:23 +0800 Subject: [PATCH 021/179] fixed typo --- docs/stdlib/regexp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/stdlib/regexp.md b/docs/stdlib/regexp.md index 3ba5f86..b253cbb 100644 --- a/docs/stdlib/regexp.md +++ b/docs/stdlib/regexp.md @@ -298,7 +298,7 @@ str.replace(search, replacement) 'aaa'.replace(/a/g, 'b') // "bbb" ``` -上面代码中,最后一个正则表达式使用了`g`修饰符,导致所有的`b`都被替换掉了。 +上面代码中,最后一个正则表达式使用了`g`修饰符,导致所有的`a`都被替换掉了。 `replace`方法的一个应用,就是消除字符串首尾两端的空格。 From 5312a09ac73b5db5464756959b9bc118a5b658bd Mon Sep 17 00:00:00 2001 From: Jacty Date: Tue, 7 Jan 2020 02:22:23 +0800 Subject: [PATCH 022/179] typo fixed a typo --- docs/stdlib/wrapper.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/stdlib/wrapper.md b/docs/stdlib/wrapper.md index 7c3367b..7e89bf3 100644 --- a/docs/stdlib/wrapper.md +++ b/docs/stdlib/wrapper.md @@ -124,5 +124,5 @@ Number.prototype.double = function () { (123).double() // 246 ``` -上面代码在`String`和`Number`这两个对象的原型上面,分别自定义了一个方法,从而可以在所有实例对象上调用。注意,最后一张的`123`外面必须要加上圆括号,否则后面的点运算符(`.`)会被解释成小数点。 +上面代码在`String`和`Number`这两个对象的原型上面,分别自定义了一个方法,从而可以在所有实例对象上调用。注意,最后一行的`123`外面必须要加上圆括号,否则后面的点运算符(`.`)会被解释成小数点。 From f71489d048ec352c95e5be304ce7c3616e4bf8df Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年2月13日 13:55:20 +0800 Subject: [PATCH 023/179] docs(stdlib): edit regexp/exec() --- docs/stdlib/regexp.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/stdlib/regexp.md b/docs/stdlib/regexp.md index b253cbb..0d41c43 100644 --- a/docs/stdlib/regexp.md +++ b/docs/stdlib/regexp.md @@ -137,7 +137,7 @@ new RegExp('').test('abc') ### RegExp.prototype.exec() -正则实例对象的`exec`方法,用来返回匹配结果。如果发现匹配,就返回一个数组,成员是匹配成功的子字符串,否则返回`null`。 +正则实例对象的`exec()`方法,用来返回匹配结果。如果发现匹配,就返回一个数组,成员是匹配成功的子字符串,否则返回`null`。 ```javascript var s = '_x_x'; @@ -159,12 +159,12 @@ var r = /_(x)/; r.exec(s) // ["_x", "x"] ``` -上面代码的`exec`方法,返回一个数组。第一个成员是整个匹配的结果,第二个成员是圆括号匹配的结果。 +上面代码的`exec()`方法,返回一个数组。第一个成员是整个匹配的结果,第二个成员是圆括号匹配的结果。 -`exec`方法的返回数组还包含以下两个属性: +`exec()`方法的返回数组还包含以下两个属性: - `input`:整个原字符串。 -- `index`:整个模式匹配成功的开始位置(从0开始计数)。 +- `index`:模式匹配成功的开始位置(从0开始计数)。 ```javascript var r = /a(b+)a/; @@ -178,7 +178,7 @@ arr.input // "_abbba_aba_" 上面代码中的`index`属性等于1,是因为从原字符串的第二个位置开始匹配成功。 -如果正则表达式加上`g`修饰符,则可以使用多次`exec`方法,下一次搜索的位置从上一次匹配成功结束的位置开始。 +如果正则表达式加上`g`修饰符,则可以使用多次`exec()`方法,下一次搜索的位置从上一次匹配成功结束的位置开始。 ```javascript var reg = /a/g; @@ -204,7 +204,7 @@ r4 // null reg.lastIndex // 0 ``` -上面代码连续用了四次`exec`方法,前三次都是从上一次匹配结束的位置向后匹配。当第三次匹配结束以后,整个字符串已经到达尾部,匹配结果返回`null`,正则实例对象的`lastIndex`属性也重置为`0`,意味着第四次匹配将从头开始。 +上面代码连续用了四次`exec()`方法,前三次都是从上一次匹配结束的位置向后匹配。当第三次匹配结束以后,整个字符串已经到达尾部,匹配结果返回`null`,正则实例对象的`lastIndex`属性也重置为`0`,意味着第四次匹配将从头开始。 利用`g`修饰符允许多次匹配的特点,可以用一个循环完成全部匹配。 @@ -222,7 +222,7 @@ while(true) { // #8:a ``` -上面代码中,只要`exec`方法不返回`null`,就会一直循环下去,每次输出匹配的位置和匹配的文本。 +上面代码中,只要`exec()`方法不返回`null`,就会一直循环下去,每次输出匹配的位置和匹配的文本。 正则实例对象的`lastIndex`属性不仅可读,还可写。设置了`g`修饰符的时候,只要手动设置了`lastIndex`的值,就会从指定位置开始匹配。 From 23b342aad96e264d5f35a5191783f7741b980589 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年2月21日 19:01:49 +0800 Subject: [PATCH 024/179] docs(dom): add document.currentScript --- docs/dom/document.md | 14 ++++++++++++++ docs/stdlib/date.md | 27 +++++++++++++++++++++------ 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/docs/dom/document.md b/docs/dom/document.md index 4a5315c..8e08982 100644 --- a/docs/dom/document.md +++ b/docs/dom/document.md @@ -327,6 +327,20 @@ var editor = document.getElementById('editor'); editor.contentDocument.designMode = 'on'; ``` +### document.currentScript + +`document.currentScript`属性只用在` +``` + +上面代码中,`document.currentScript`就是`>`元素节点。 + ### document.implementation `document.implementation`属性返回一个`DOMImplementation`对象。该对象有三个方法,主要用于创建独立于当前文档的新的 Document 对象。 diff --git a/docs/stdlib/date.md b/docs/stdlib/date.md index 503c3b1..4edbaeb 100644 --- a/docs/stdlib/date.md +++ b/docs/stdlib/date.md @@ -337,7 +337,7 @@ dateObj.toLocaleDateString([locales[, options]]) dateObj.toLocaleTimeString([locales[, options]]) ``` -这两个参数中,`locales`是一个指定所用语言的字符串,`options`是一个配置对象。下面是`locales`的例子。 +这两个参数中,`locales`是一个指定所用语言的字符串,`options`是一个配置对象。下面是`locales`的例子,分别采用`en-US`和`zh-CN`语言设定。 ```javascript var d = new Date(2013, 0, 1); @@ -352,13 +352,23 @@ d.toLocaleTimeString('en-US') // "12:00:00 AM" d.toLocaleTimeString('zh-CN') // "上午12:00:00" ``` -下面是`options`的例子。 +`options`配置对象有以下属性。 + +- `dateStyle`:可能的值为`full`、`long`、`medium`、`short`。 +- `timeStyle`:可能的值为`full`、`long`、`medium`、`short`。 +- `month`:可能的值为`numeric`、`2-digit`、`long`、`short`、`narrow`。 +- `year`:可能的值为`numeric`、`2-digit`。 +- `weekday`:可能的值为`long`、`short`、`narrow`。 +- `day`、`hour`、`minute`、`second`:可能的值为`numeric`、`2-digit`。 +- `timeZone`:可能的值为 IANA 的时区数据库。 +- `timeZooneName`:可能的值为`long`、`short`。 +- `hour12`:24小时周期还是12小时周期,可能的值为`true`、`false`。 + +下面是用法实例。 ```javascript var d = new Date(2013, 0, 1); -// 时间格式 -// 下面的设置是,星期和月份为完整文字,年份和日期为数字 d.toLocaleDateString('en-US', { weekday: 'long', year: 'numeric', @@ -367,7 +377,13 @@ d.toLocaleDateString('en-US', { }) // "Tuesday, January 1, 2013" -// 指定时区 +d.toLocaleDateString('en-US', { + day: "2-digit", + month: "long", + year: "2-digit" +}); +// "January 01, 13" + d.toLocaleTimeString('en-US', { timeZone: 'UTC', timeZoneName: 'short' @@ -380,7 +396,6 @@ d.toLocaleTimeString('en-US', { }) // "12:00:00 AM China Standard Time" -// 小时周期为12还是24 d.toLocaleTimeString('en-US', { hour12: false }) From b7106086a4f32560e49914b198d22b1dd9027c2a Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年2月27日 11:00:31 +0800 Subject: [PATCH 025/179] docs(error): fix #161 --- docs/features/error.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/docs/features/error.md b/docs/features/error.md index 17c33cd..a361a99 100644 --- a/docs/features/error.md +++ b/docs/features/error.md @@ -79,19 +79,15 @@ unknownVariable // Uncaught ReferenceError: unknownVariable is not defined ``` -另一种触发场景是,将一个值分配给无法分配的对象,比如对函数的运行结果或者`this`赋值。 +另一种触发场景是,将一个值分配给无法分配的对象,比如对函数的运行结果赋值。 ```javascript // 等号左侧不是变量 console.log() = 1 // Uncaught ReferenceError: Invalid left-hand side in assignment - -// this 对象不能手动赋值 -this = 1 -// ReferenceError: Invalid left-hand side in assignment ``` -上面代码对函数`console.log`的运行结果和`this`赋值,结果都引发了`ReferenceError`错误。 +上面代码对函数`console.log`的运行结果赋值,结果引发了`ReferenceError`错误。 ### RangeError 对象 From 20423b9ccc226b002b3720ee554d1d74e35c19ca Mon Sep 17 00:00:00 2001 From: ruanyf Date: Wed, 4 Mar 2020 18:44:22 +0800 Subject: [PATCH 026/179] docs(stdlib/number): fix #162 --- docs/stdlib/number.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/stdlib/number.md b/docs/stdlib/number.md index e0c2158..53fb8c5 100644 --- a/docs/stdlib/number.md +++ b/docs/stdlib/number.md @@ -117,7 +117,7 @@ Number.MIN_SAFE_INTEGER // -9007199254740991 上面代码中,`10`和`10.005`先转成2位小数,然后转成字符串。其中`10`必须放在括号里,否则后面的点会被处理成小数点。 -`toFixed()`方法的参数为小数位数,有效范围为0到20,超出这个范围将抛出 RangeError 错误。 +`toFixed()`方法的参数为小数位数,有效范围为0到100,超出这个范围将抛出 RangeError 错误。 由于浮点数的原因,小数`5`的四舍五入是不确定的,使用的时候必须小心。 @@ -140,7 +140,7 @@ Number.MIN_SAFE_INTEGER // -9007199254740991 (1234).toExponential(2) // "1.23e+3" ``` -`toExponential`方法的参数是小数点后有效数字的位数,范围为0到20,超出这个范围,会抛出一个 RangeError 错误。 +`toExponential`方法的参数是小数点后有效数字的位数,范围为0到100,超出这个范围,会抛出一个 RangeError 错误。 ### Number.prototype.toPrecision() @@ -154,7 +154,7 @@ Number.MIN_SAFE_INTEGER // -9007199254740991 (12.34).toPrecision(5) // "12.340" ``` -该方法的参数为有效数字的位数,范围是1到21,超出这个范围会抛出 RangeError 错误。 +该方法的参数为有效数字的位数,范围是1到100,超出这个范围会抛出 RangeError 错误。 该方法用于四舍五入时不太可靠,跟浮点数不是精确储存有关。 From 136026aa0de9fd00e73e8b93516c2f4e88160687 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年3月16日 10:19:47 +0800 Subject: [PATCH 027/179] docs(dom/css): fix typo --- docs/dom/css.md | 2 +- docs/dom/mutationobserver.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/dom/css.md b/docs/dom/css.md index d6d01db..a29de76 100644 --- a/docs/dom/css.md +++ b/docs/dom/css.md @@ -820,7 +820,7 @@ mql.onchange = function(e) { } ``` -上面代码中,`change`事件发生后,存在两种可能。一种是显示宽度从700像素以上变为以下,另一种是从700像素以下变为以上,所以在监听函数内部要判断一下当前是哪一种情况。 +上面代码中,`change`事件发生后,存在两种可能。一种是显示宽度从600像素以上变为以下,另一种是从600像素以下变为以上,所以在监听函数内部要判断一下当前是哪一种情况。 ### MediaQueryList 接口的实例方法 diff --git a/docs/dom/mutationobserver.md b/docs/dom/mutationobserver.md index e44f9a1..139709b 100644 --- a/docs/dom/mutationobserver.md +++ b/docs/dom/mutationobserver.md @@ -60,7 +60,7 @@ observer.observe(article, options); - **attributes**:属性的变动。 - **characterData**:节点内容或节点文本的变动。 -想要观察哪一种变动类型,就在`option`对象中指定它的值为`true`。需要注意的是,必须同时指定`childList`、`attributes`和`characterData`中的一种或多种,若未均指定将报错。 +想要观察哪一种变动类型,就在`option`对象中指定它的值为`true`。需要注意的是,至少必须同时指定这三种观察的一种,若均未指定将报错。 除了变动类型,`options`对象还可以设定以下属性: From a975c0ca1e5fa1b54ce3f0c37ebefd785fe3f55d Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年3月17日 18:09:14 +0800 Subject: [PATCH 028/179] docs(oop/this): fix #165 --- docs/oop/this.md | 44 ++++++++++++++++++++++---------------------- docs/stdlib/array.md | 16 ++++++++-------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/docs/oop/this.md b/docs/oop/this.md index ca6158b..6668047 100644 --- a/docs/oop/this.md +++ b/docs/oop/this.md @@ -694,11 +694,11 @@ var f = function (){ $('#button').on('click', f); ``` -上面代码中,点击按钮以后,控制台将会显示`true`。由于`apply`方法(或者`call`方法)不仅绑定函数执行时所在的对象,还会立即执行函数,因此不得不把绑定语句写在一个函数体内。更简洁的写法是采用下面介绍的`bind`方法。 +上面代码中,点击按钮以后,控制台将会显示`true`。由于`apply()`方法(或者`call()`方法)不仅绑定函数执行时所在的对象,还会立即执行函数,因此不得不把绑定语句写在一个函数体内。更简洁的写法是采用下面介绍的`bind()`方法。 ### Function.prototype.bind() -`bind`方法用于将函数体内的`this`绑定到某个对象,然后返回一个新函数。 +`bind()`方法用于将函数体内的`this`绑定到某个对象,然后返回一个新函数。 ```javascript var d = new Date(); @@ -708,16 +708,16 @@ var print = d.getTime; print() // Uncaught TypeError: this is not a Date object. ``` -上面代码中,我们将`d.getTime`方法赋给变量`print`,然后调用`print`就报错了。这是因为`getTime`方法内部的`this`,绑定`Date`对象的实例,赋给变量`print`以后,内部的`this`已经不指向`Date`对象的实例了。 +上面代码中,我们将`d.getTime()`方法赋给变量`print`,然后调用`print()`就报错了。这是因为`getTime()`方法内部的`this`,绑定`Date`对象的实例,赋给变量`print`以后,内部的`this`已经不指向`Date`对象的实例了。 -`bind`方法可以解决这个问题。 +`bind()`方法可以解决这个问题。 ```javascript var print = d.getTime.bind(d); print() // 1481869925657 ``` -上面代码中,`bind`方法将`getTime`方法内部的`this`绑定到`d`对象,这时就可以安全地将这个方法赋值给其他变量了。 +上面代码中,`bind()`方法将`getTime()`方法内部的`this`绑定到`d`对象,这时就可以安全地将这个方法赋值给其他变量了。 `bind`方法的参数就是所要绑定`this`的对象,下面是一个更清晰的例子。 @@ -734,7 +734,7 @@ func(); counter.count // 1 ``` -上面代码中,`counter.inc`方法被赋值给变量`func`。这时必须用`bind`方法将`inc`内部的`this`,绑定到`counter`,否则就会出错。 +上面代码中,`counter.inc()`方法被赋值给变量`func`。这时必须用`bind()`方法将`inc()`内部的`this`,绑定到`counter`,否则就会出错。 `this`绑定到其他对象也是可以的。 @@ -754,9 +754,9 @@ func(); obj.count // 101 ``` -上面代码中,`bind`方法将`inc`方法内部的`this`,绑定到`obj`对象。结果调用`func`函数以后,递增的就是`obj`内部的`count`属性。 +上面代码中,`bind()`方法将`inc()`方法内部的`this`,绑定到`obj`对象。结果调用`func`函数以后,递增的就是`obj`内部的`count`属性。 -`bind`还可以接受更多的参数,将这些参数绑定原函数的参数。 +`bind()`还可以接受更多的参数,将这些参数绑定原函数的参数。 ```javascript var add = function (x, y) { @@ -772,9 +772,9 @@ var newAdd = add.bind(obj, 5); newAdd(5) // 20 ``` -上面代码中,`bind`方法除了绑定`this`对象,还将`add`函数的第一个参数`x`绑定成`5`,然后返回一个新函数`newAdd`,这个函数只要再接受一个参数`y`就能运行了。 +上面代码中,`bind()`方法除了绑定`this`对象,还将`add()`函数的第一个参数`x`绑定成`5`,然后返回一个新函数`newAdd()`,这个函数只要再接受一个参数`y`就能运行了。 -如果`bind`方法的第一个参数是`null`或`undefined`,等于将`this`绑定到全局对象,函数运行时`this`指向顶层对象(浏览器为`window`)。 +如果`bind()`方法的第一个参数是`null`或`undefined`,等于将`this`绑定到全局对象,函数运行时`this`指向顶层对象(浏览器为`window`)。 ```javascript function add(x, y) { @@ -785,19 +785,19 @@ var plus5 = add.bind(null, 5); plus5(10) // 15 ``` -上面代码中,函数`add`内部并没有`this`,使用`bind`方法的主要目的是绑定参数`x`,以后每次运行新函数`plus5`,就只需要提供另一个参数`y`就够了。而且因为`add`内部没有`this`,所以`bind`的第一个参数是`null`,不过这里如果是其他对象,也没有影响。 +上面代码中,函数`add()`内部并没有`this`,使用`bind()`方法的主要目的是绑定参数`x`,以后每次运行新函数`plus5()`,就只需要提供另一个参数`y`就够了。而且因为`add()`内部没有`this`,所以`bind()`的第一个参数是`null`,不过这里如果是其他对象,也没有影响。 -`bind`方法有一些使用注意点。 +`bind()`方法有一些使用注意点。 **(1)每一次返回一个新函数** -`bind`方法每运行一次,就返回一个新函数,这会产生一些问题。比如,监听事件的时候,不能写成下面这样。 +`bind()`方法每运行一次,就返回一个新函数,这会产生一些问题。比如,监听事件的时候,不能写成下面这样。 ```javascript element.addEventListener('click', o.m.bind(o)); ``` -上面代码中,`click`事件绑定`bind`方法生成的一个匿名函数。这样会导致无法取消绑定,所以,下面的代码是无效的。 +上面代码中,`click`事件绑定`bind()`方法生成的一个匿名函数。这样会导致无法取消绑定,所以下面的代码是无效的。 ```javascript element.removeEventListener('click', o.m.bind(o)); @@ -814,7 +814,7 @@ element.removeEventListener('click', listener); **(2)结合回调函数使用** -回调函数是 JavaScript 最常用的模式之一,但是一个常见的错误是,将包含`this`的方法直接当作回调函数。解决方法就是使用`bind`方法,将`counter.inc`绑定`counter`。 +回调函数是 JavaScript 最常用的模式之一,但是一个常见的错误是,将包含`this`的方法直接当作回调函数。解决方法就是使用`bind()`方法,将`counter.inc()`绑定`counter`。 ```javascript var counter = { @@ -833,7 +833,7 @@ callIt(counter.inc.bind(counter)); counter.count // 1 ``` -上面代码中,`callIt`方法会调用回调函数。这时如果直接把`counter.inc`传入,调用时`counter.inc`内部的`this`就会指向全局对象。使用`bind`方法将`counter.inc`绑定`counter`以后,就不会有这个问题,`this`总是指向`counter`。 +上面代码中,`callIt()`方法会调用回调函数。这时如果直接把`counter.inc`传入,调用时`counter.inc()`内部的`this`就会指向全局对象。使用`bind()`方法将`counter.inc`绑定`counter`以后,就不会有这个问题,`this`总是指向`counter`。 还有一种情况比较隐蔽,就是某些数组方法可以接受一个函数当作参数。这些函数内部的`this`指向,很可能也会出错。 @@ -852,7 +852,7 @@ obj.print() // 没有任何输出 ``` -上面代码中,`obj.print`内部`this.times`的`this`是指向`obj`的,这个没有问题。但是,`forEach`方法的回调函数内部的`this.name`却是指向全局对象,导致没有办法取到值。稍微改动一下,就可以看得更清楚。 +上面代码中,`obj.print`内部`this.times`的`this`是指向`obj`的,这个没有问题。但是,`forEach()`方法的回调函数内部的`this.name`却是指向全局对象,导致没有办法取到值。稍微改动一下,就可以看得更清楚。 ```javascript obj.print = function () { @@ -867,7 +867,7 @@ obj.print() // true ``` -解决这个问题,也是通过`bind`方法绑定`this`。 +解决这个问题,也是通过`bind()`方法绑定`this`。 ```javascript obj.print = function () { @@ -882,9 +882,9 @@ obj.print() // 张三 ``` -**(3)结合`call`方法使用** +**(3)结合`call()`方法使用** -利用`bind`方法,可以改写一些 JavaScript 原生方法的使用形式,以数组的`slice`方法为例。 +利用`bind()`方法,可以改写一些 JavaScript 原生方法的使用形式,以数组的`slice()`方法为例。 ```javascript [1, 2, 3].slice(0, 1) // [1] @@ -892,9 +892,9 @@ obj.print() Array.prototype.slice.call([1, 2, 3], 0, 1) // [1] ``` -上面的代码中,数组的`slice`方法从`[1, 2, 3]`里面,按照指定位置和长度切分出另一个数组。这样做的本质是在`[1, 2, 3]`上面调用`Array.prototype.slice`方法,因此可以用`call`方法表达这个过程,得到同样的结果。 +上面的代码中,数组的`slice`方法从`[1, 2, 3]`里面,按照指定的开始位置和结束位置,切分出另一个数组。这样做的本质是在`[1, 2, 3]`上面调用`Array.prototype.slice()`方法,因此可以用`call`方法表达这个过程,得到同样的结果。 -`call`方法实质上是调用`Function.prototype.call`方法,因此上面的表达式可以用`bind`方法改写。 +`call()`方法实质上是调用`Function.prototype.call()`方法,因此上面的表达式可以用`bind()`方法改写。 ```javascript var slice = Function.prototype.call.bind(Array.prototype.slice); diff --git a/docs/stdlib/array.md b/docs/stdlib/array.md index 97912f2..5c999da 100644 --- a/docs/stdlib/array.md +++ b/docs/stdlib/array.md @@ -1,4 +1,4 @@ -# Array 对象 + Array 对象 ## 构造函数 @@ -282,13 +282,13 @@ a // ["c", "b", "a"] ### slice() -`slice`方法用于提取目标数组的一部分,返回一个新数组,原数组不变。 +`slice()`方法用于提取目标数组的一部分,返回一个新数组,原数组不变。 ```javascript arr.slice(start, end); ``` -它的第一个参数为起始位置(从0开始),第二个参数为终止位置(但该位置的元素本身不包括在内)。如果省略第二个参数,则一直返回到原数组的最后一个成员。 +它的第一个参数为起始位置(从0开始,会包括在返回的新数组之中),第二个参数为终止位置(但该位置的元素本身不包括在内)。如果省略第二个参数,则一直返回到原数组的最后一个成员。 ```javascript var a = ['a', 'b', 'c']; @@ -300,9 +300,9 @@ a.slice(2, 6) // ["c"] a.slice() // ["a", "b", "c"] ``` -上面代码中,最后一个例子`slice`没有参数,实际上等于返回一个原数组的拷贝。 +上面代码中,最后一个例子`slice()`没有参数,实际上等于返回一个原数组的拷贝。 -如果`slice`方法的参数是负数,则表示倒数计算的位置。 +如果`slice()`方法的参数是负数,则表示倒数计算的位置。 ```javascript var a = ['a', 'b', 'c']; @@ -320,7 +320,7 @@ a.slice(4) // [] a.slice(2, 1) // [] ``` -`slice`方法的一个重要应用,是将类似数组的对象转为真正的数组。 +`slice()`方法的一个重要应用,是将类似数组的对象转为真正的数组。 ```javascript Array.prototype.slice.call({ 0: 'a', 1: 'b', length: 2 }) @@ -330,11 +330,11 @@ Array.prototype.slice.call(document.querySelectorAll("div")); Array.prototype.slice.call(arguments); ``` -上面代码的参数都不是数组,但是通过`call`方法,在它们上面调用`slice`方法,就可以把它们转为真正的数组。 +上面代码的参数都不是数组,但是通过`call`方法,在它们上面调用`slice()`方法,就可以把它们转为真正的数组。 ### splice() -`splice`方法用于删除原数组的一部分成员,并可以在删除的位置添加新的数组成员,返回值是被删除的元素。注意,该方法会改变原数组。 +`splice()`方法用于删除原数组的一部分成员,并可以在删除的位置添加新的数组成员,返回值是被删除的元素。注意,该方法会改变原数组。 ```javascript arr.splice(start, count, addElement1, addElement2, ...); From 2f728aa4e40a805bc1319b8322dc2eea46bb619b Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年3月17日 19:29:57 +0800 Subject: [PATCH 029/179] docs(DOM): fix #167 --- docs/dom/general.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/dom/general.md b/docs/dom/general.md index 0382a94..7e08332 100644 --- a/docs/dom/general.md +++ b/docs/dom/general.md @@ -17,7 +17,7 @@ DOM 的最小组成单位叫做节点(node)。文档的树形结构(DOM - `Document`:整个文档树的顶层节点 - `DocumentType`:`doctype`标签(比如``) - `Element`:网页的各种HTML标签(比如`
`、``等) -- `Attribute`:网页元素的属性(比如`class="right"`) +- `Attr`:网页元素的属性(比如`class="right"`) - `Text`:标签之间或标签包含的文本 - `Comment`:注释 - `DocumentFragment`:文档的片段 @@ -26,7 +26,7 @@ DOM 的最小组成单位叫做节点(node)。文档的树形结构(DOM ## 节点树 -一个文档的所有节点,按照所在的层级,可以抽象成一种树状结构。这种树状结构就是 DOM 树。它有一个顶层节点,下一层都是顶层节点的子节点,然后子节点又有自己的子节点,就这样层层衍生出一个金字塔结构,倒过来就像一棵树。 +一个文档的所有节点,按照所在的层级,可以抽象成一种树状结构。这种树状结构就是 DOM 树。它有一个顶层节点,下一层都是顶层节点的子节点,然后子节点又有自己的子节点,就这样层层衍生出一个金字塔结构,又像一棵树。 浏览器原生提供`document`节点,代表整个文档。 From 0f286ea45b6be28df51d65e6aedfa15c3889e20a Mon Sep 17 00:00:00 2001 From: xiaobeiqiaodaima <32065775+xiaobeiqiaodaima@users.noreply.github.com> Date: 2020年3月17日 23:27:16 +0800 Subject: [PATCH 030/179] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E6=8F=90=E5=8D=87=E8=A1=A8=E8=BF=B0=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 同时采用`function`命令和赋值语句声明同一个函数。调用函数的位置如果在顶部,会采用声明语句,调用函数的位置在赋值语句后面,就会采用赋值语句的定义。 --- 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 71df9bb..c87b266 100644 --- a/docs/types/function.md +++ b/docs/types/function.md @@ -186,7 +186,7 @@ f(); f = function () {}; ``` -上面代码第二行,调用`f`的时候,`f`只是被声明了,还没有被赋值,等于`undefined`,所以会报错。因此,如果同时采用`function`命令和赋值语句声明同一个函数,最后总是采用赋值语句的定义。 +上面代码第二行,调用`f`的时候,`f`只是被声明了,还没有被赋值,等于`undefined`,所以会报错。因此,如果同时采用`function`命令和赋值语句声明同一个函数,调用函数的位置如果在顶部,会采用声明语句,调用函数的位置在赋值语句后面,就会采用赋值语句的定义。 ```javascript var f = function () { From aa26f6db13a9bf72e0ec8f234d2f69129be2ada4 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年3月18日 13:21:22 +0800 Subject: [PATCH 031/179] =?UTF-8?q?docs(types/function):=20edit=20?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E6=8F=90=E5=8D=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/types/function.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/types/function.md b/docs/types/function.md index c87b266..cb028b4 100644 --- a/docs/types/function.md +++ b/docs/types/function.md @@ -186,7 +186,9 @@ f(); f = function () {}; ``` -上面代码第二行,调用`f`的时候,`f`只是被声明了,还没有被赋值,等于`undefined`,所以会报错。因此,如果同时采用`function`命令和赋值语句声明同一个函数,调用函数的位置如果在顶部,会采用声明语句,调用函数的位置在赋值语句后面,就会采用赋值语句的定义。 +上面代码第二行,调用`f`的时候,`f`只是被声明了,还没有被赋值,等于`undefined`,所以会报错。 + +注意,如果像下面例子那样,采用`function`命令和`var`赋值语句声明同一个函数,由于存在函数提升,最后会采用`var`赋值语句的定义。 ```javascript var f = function () { @@ -200,6 +202,8 @@ function f() { f() // 1 ``` +上面例子中,表面上后面声明的函数`f`,应该覆盖前面的`var`赋值语句,但是由于存在函数提升,实际上正好反过来。 + ## 函数的属性和方法 ### name 属性 From a4bd6ee0dbb064bc79d7b7b546bd8cc42cda1042 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Tue, 7 Apr 2020 01:15:40 +0800 Subject: [PATCH 032/179] docs(stdlib): edit math/Math.pow() --- docs/stdlib/math.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/stdlib/math.md b/docs/stdlib/math.md index de60029..a36cd38 100644 --- a/docs/stdlib/math.md +++ b/docs/stdlib/math.md @@ -37,7 +37,7 @@ Math.SQRT2 // 1.4142135623730951 - `Math.floor()`:向下取整 - `Math.max()`:最大值 - `Math.min()`:最小值 -- `Math.pow()`:指数运算 +- `Math.pow()`:幂运算 - `Math.sqrt()`:平方根 - `Math.log()`:自然对数 - `Math.exp()`:`e`的指数 @@ -121,7 +121,7 @@ Math.round(-1.6) // -2 ### Math.pow() -`Math.pow`方法返回以第一个参数为底数、第二个参数为幂的指数值。 +`Math.pow`方法返回以第一个参数为底数、第二个参数为指数的幂运算值。 ```javascript // 等同于 2 ** 2 From 65d72c0486ffc83f65619c90c7da9e94496955be Mon Sep 17 00:00:00 2001 From: ruanyf Date: Tue, 7 Apr 2020 01:31:21 +0800 Subject: [PATCH 033/179] docs(stdlib/string): fix typo --- docs/stdlib/string.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/stdlib/string.md b/docs/stdlib/string.md index 08feda3..f155546 100644 --- a/docs/stdlib/string.md +++ b/docs/stdlib/string.md @@ -110,7 +110,7 @@ s.charAt(s.length - 1) // "c" ### String.prototype.charCodeAt() -`charCodeAt`方法返回字符串指定位置的 Unicode 码点(十进制表示),相当于`String.fromCharCode()`的逆操作。 +`charCodeAt()`方法返回字符串指定位置的 Unicode 码点(十进制表示),相当于`String.fromCharCode()`的逆操作。 ```javascript 'abc'.charCodeAt(1) // 98 @@ -131,7 +131,7 @@ s.charAt(s.length - 1) // "c" 'abc'.charCodeAt(4) // NaN ``` -注意,`charCodeAt`方法返回的 Unicode 码点不会大于65536(0xFFFF),也就是说,只返回两个字节的字符的码点。如果遇到码点大于 65536 的字符(四个字节的字符),必需连续使用两次`charCodeAt`,不仅读入`charCodeAt(i)`,还要读入`charCodeAt(i+1)`,将两个值放在一起,才能得到准确的字符。 +注意,`charCodeAt`方法返回的 Unicode 码点不会大于65536(0xFFFF),也就是说,只返回两个字节的字符的码点。如果遇到码点大于 65536 的字符(四个字节的字符),必须连续使用两次`charCodeAt`,不仅读入`charCodeAt(i)`,还要读入`charCodeAt(i+1)`,将两个值放在一起,才能得到准确的字符。 ### String.prototype.concat() From 5075536146334f3cd6a3b9fd1179e2a6479fe212 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年4月14日 00:24:52 +0800 Subject: [PATCH 034/179] docs(stdlib): edit array --- docs/stdlib/array.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/stdlib/array.md b/docs/stdlib/array.md index 5c999da..f2d971f 100644 --- a/docs/stdlib/array.md +++ b/docs/stdlib/array.md @@ -10,9 +10,9 @@ arr.length // 2 arr // [ empty x 2 ] ``` -上面代码中,`Array`构造函数的参数`2`,表示生成一个两个成员的数组,每个位置都是空值。 +上面代码中,`Array()`构造函数的参数`2`,表示生成一个两个成员的数组,每个位置都是空值。 -如果没有使用`new`,运行结果也是一样的。 +如果没有使用`new`关键字,运行结果也是一样的。 ```javascript var arr = new Array(2); @@ -20,7 +20,9 @@ var arr = new Array(2); var arr = Array(2); ``` -`Array`构造函数有一个很大的缺陷,就是不同的参数,会导致它的行为不一致。 +考虑到语义性,以及与其他构造函数用户保持一致,建议总是加上`new`。 + +`Array()`构造函数有一个很大的缺陷,不同的参数会导致行为不一致。 ```javascript // 无参数时,返回一个空数组 @@ -44,7 +46,7 @@ new Array(1, 2) // [1, 2] new Array('a', 'b', 'c') // ['a', 'b', 'c'] ``` -可以看到,`Array`作为构造函数,行为很不一致。因此,不建议使用它生成新数组,直接使用数组字面量是更好的做法。 +可以看到,`Array()`作为构造函数,行为很不一致。因此,不建议使用它生成新数组,直接使用数组字面量是更好的做法。 ```javascript // bad @@ -54,7 +56,7 @@ var arr = new Array(1, 2); var arr = [1, 2]; ``` -注意,如果参数是一个正整数,返回数组的成员都是空位。虽然读取的时候返回`undefined`,但实际上该位置没有任何值。虽然可以取到`length`属性,但是取不到键名。 +注意,如果参数是一个正整数,返回数组的成员都是空位。虽然读取的时候返回`undefined`,但实际上该位置没有任何值。虽然这时可以读取到`length`属性,但是取不到键名。 ```javascript var a = new Array(3); @@ -70,7 +72,7 @@ b[0] // undefined 0 in b // true ``` -上面代码中,`a`是一个长度为3的空数组,`b`是一个三个成员都是`undefined`的数组。读取键值的时候,`a`和`b`都返回`undefined`,但是`a`的键位都是空的,`b`的键位是有值的。 +上面代码中,`a`是`Array()`生成的一个长度为3的空数组,`b`是一个三个成员都是`undefined`的数组,这两个数组是不一样的。读取键值的时候,`a`和`b`都返回`undefined`,但是`a`的键名(成员的序号)都是空的,`b`的键名是有值的。 ## 静态方法 From 24db3a8758e209e482d4e2080a4dcfce15841796 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年4月14日 00:27:21 +0800 Subject: [PATCH 035/179] refactor: update dependencies --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 66e3f26..8487f50 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "homepage": "https://github.com/wangdoc/javascript-tutorial", "dependencies": { "gh-pages": "latest", - "husky": "^3.0.8", + "husky": "latest", "loppo": "latest", "loppo-theme-wangdoc": "latest" } From 7d37676b8a9f2da8d71612953f46195cbdbc9714 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年4月14日 00:29:56 +0800 Subject: [PATCH 036/179] refactor: update travis-ci node.js version --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6304e69..0a1ded5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: node_js node_js: -- '10' +- 'node' branches: only: From 2baaafd4f3de2fb459eb1a0a9c1db8f347f732eb Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年4月14日 00:33:21 +0800 Subject: [PATCH 037/179] refactor: add lopp server command --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 8487f50..c4b5ac2 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "build-and-commit": "npm run build && npm run commit", "commit": "gh-pages --dist dist --dest dist/javascript --branch master --add --repo git@github.com:wangdoc/website.git", "chapter": "loppo chapter", + "server": "loppo server", "test": "echo \"Error: no test specified\" && exit 1" }, "husky": { From 1dad034da3a3a72d12e20248057c4354e7f7d095 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年4月14日 16:02:11 +0800 Subject: [PATCH 038/179] docs(types): edit function --- docs/types/function.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/types/function.md b/docs/types/function.md index cb028b4..66265d9 100644 --- a/docs/types/function.md +++ b/docs/types/function.md @@ -260,7 +260,7 @@ f.length // 2 ### toString() -函数的`toString`方法返回一个字符串,内容是函数的源码。 +函数的`toString()`方法返回一个字符串,内容是函数的源码。 ```javascript function f() { @@ -284,7 +284,7 @@ Math.sqrt.toString() // "function sqrt() { [native code] }" ``` -上面代码中,`Math.sqrt`是 JavaScript 引擎提供的原生函数,`toString()`方法就返回原生代码的提示。 +上面代码中,`Math.sqrt()`是 JavaScript 引擎提供的原生函数,`toString()`方法就返回原生代码的提示。 函数内部的注释也可以返回。 @@ -550,7 +550,7 @@ f(obj); obj // [1, 2, 3] ``` -上面代码中,在函数`f`内部,参数对象`obj`被整个替换成另一个值。这时不会影响到原始值。这是因为,形式参数(`o`)的值实际是参数`obj`的地址,重新对`o`赋值导致`o`指向另一个地址,保存在原地址上的值当然不受影响。 +上面代码中,在函数`f()`内部,参数对象`obj`被整个替换成另一个值。这时不会影响到原始值。这是因为,形式参数(`o`)的值实际是参数`obj`的地址,重新对`o`赋值导致`o`指向另一个地址,保存在原地址上的值当然不受影响。 ### 同名参数 @@ -564,7 +564,7 @@ function f(a, a) { f(1, 2) // 2 ``` -上面代码中,函数`f`有两个参数,且参数名都是`a`。取值的时候,以后面的`a`为准,即使后面的`a`没有值或被省略,也是以其为准。 +上面代码中,函数`f()`有两个参数,且参数名都是`a`。取值的时候,以后面的`a`为准,即使后面的`a`没有值或被省略,也是以其为准。 ```javascript function f(a, a) { @@ -574,7 +574,7 @@ function f(a, a) { f(1) // undefined ``` -调用函数`f`的时候,没有提供第二个参数,`a`的取值就变成了`undefined`。这时,如果要获得第一个`a`的值,可以使用`arguments`对象。 +调用函数`f()`的时候,没有提供第二个参数,`a`的取值就变成了`undefined`。这时,如果要获得第一个`a`的值,可以使用`arguments`对象。 ```javascript function f(a, a) { @@ -617,7 +617,7 @@ var f = function(a, b) { f(1, 1) // 5 ``` -上面代码中,函数`f`调用时传入的参数,在函数内部被修改成`3`和`2`。 +上面代码中,函数`f()`调用时传入的参数,在函数内部被修改成`3`和`2`。 严格模式下,`arguments`对象与函数参数不具有联动关系。也就是说,修改`arguments`对象不会影响到实际的函数参数。 From 0ea89ff02667b75bce80888e674528b8782a01fb Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年4月14日 16:26:42 +0800 Subject: [PATCH 039/179] docs(dom): edit mutation observer --- docs/dom/mutationobserver.md | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/dom/mutationobserver.md b/docs/dom/mutationobserver.md index 139709b..12651c2 100644 --- a/docs/dom/mutationobserver.md +++ b/docs/dom/mutationobserver.md @@ -36,7 +36,7 @@ var observer = new MutationObserver(function (mutations, observer) { ### observe() -`observe`方法用来启动监听,它接受两个参数。 +`observe()`方法用来启动监听,它接受两个参数。 - 第一个参数:所要观察的 DOM 节点 - 第二个参数:一个配置对象,指定所要观察的特定变动 @@ -52,7 +52,7 @@ var options = { observer.observe(article, options); ``` -上面代码中,`observe`方法接受两个参数,第一个是所要观察的DOM元素是`article`,第二个是所要观察的变动类型(子节点变动和属性变动)。 +上面代码中,`observe()`方法接受两个参数,第一个是所要观察的DOM元素是`article`,第二个是所要观察的变动类型(子节点变动和属性变动)。 观察器所能观察的 DOM 变动类型(即上面代码的`options`对象),有以下几种。 @@ -81,7 +81,7 @@ mutationObserver.observe(document.documentElement, { }); ``` -对一个节点添加观察器,就像使用`addEventListener`方法一样,多次添加同一个观察器是无效的,回调函数依然只会触发一次。如果指定不同的`options`对象,以后面添加的那个为准,类似覆盖。 +对一个节点添加观察器,就像使用`addEventListener()`方法一样,多次添加同一个观察器是无效的,回调函数依然只会触发一次。如果指定不同的`options`对象,以后面添加的那个为准,类似覆盖。 下面的例子是观察新增的子节点。 @@ -100,13 +100,13 @@ observer.observe(document, { childList: true, subtree: true }); ### disconnect(),takeRecords() -`disconnect`方法用来停止观察。调用该方法后,DOM 再发生变动,也不会触发观察器。 +`disconnect()`方法用来停止观察。调用该方法后,DOM 再发生变动,也不会触发观察器。 ```javascript observer.disconnect(); ``` -`takeRecords`方法用来清除变动记录,即不再处理未处理的变动。该方法返回变动记录的数组。 +`takeRecords()`方法用来清除变动记录,即不再处理未处理的变动。该方法返回变动记录的数组。 ```javascript observer.takeRecords(); diff --git a/package.json b/package.json index c4b5ac2..cd2b54a 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,6 @@ "gh-pages": "latest", "husky": "latest", "loppo": "latest", - "loppo-theme-wangdoc": "latest" + "loppo-theme-wangdoc": "^0.4.0" } } From d6847629e63102868c003cfac1f47a341c4e3e05 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年4月15日 03:02:52 +0800 Subject: [PATCH 040/179] docs(dom): edit element --- docs/dom/element.md | 6 +++++- package.json | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/dom/element.md b/docs/dom/element.md index 7593f9e..82c276b 100644 --- a/docs/dom/element.md +++ b/docs/dom/element.md @@ -1,5 +1,7 @@ # Element 节点 +## 简介 + `Element`节点对象对应网页的 HTML 元素。每一个 HTML 元素,在 DOM 树上都会转化成一个`Element`节点对象(以下简称元素节点)。 元素节点的`nodeType`属性都是`1`。 @@ -10,7 +12,9 @@ p.nodeName // "P" p.nodeType // 1 ``` -`Element`对象继承了`Node`接口,因此`Node`的属性和方法在`Element`对象都存在。此外,不同的 HTML 元素对应的元素节点是不一样的,浏览器使用不同的构造函数,生成不同的元素节点,比如``元素的节点对象由`HTMLAnchorElement`构造函数生成,` +
+
``` From 91161ff51f6e2e4b307788f44111574ebd86706e Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年5月14日 17:14:08 +0800 Subject: [PATCH 045/179] docs(operator): edit bit operator --- docs/operators/bit.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/operators/bit.md b/docs/operators/bit.md index f02a028..edbb8b4 100644 --- a/docs/operators/bit.md +++ b/docs/operators/bit.md @@ -303,7 +303,7 @@ var FLAG_D = 8; // 1000 上面代码设置 A、B、C、D 四个开关,每个开关分别占有一个二进制位。 -然后,就可以用二进制与运算检验,当前设置是否打开了指定开关。 +然后,就可以用二进制与运算,检查当前设置是否打开了指定开关。 ```javascript var flags = 5; // 二进制的0101 @@ -331,6 +331,8 @@ var mask = FLAG_A | FLAG_B | FLAG_D; flags = flags | mask; ``` +上面代码中,计算后得到的`flags`变量,代表三个开关的二进制位都打开了。 + 二进制与运算可以将当前设置中凡是与开关设置不一样的项,全部关闭。 ```javascript From 1b0b7b87e6585dc06cd453ac5572577470dab82b Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年5月22日 12:19:59 +0800 Subject: [PATCH 046/179] docs(event): edit load / unload event --- docs/events/common.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/events/common.md b/docs/events/common.md index d6e731a..13bab7f 100644 --- a/docs/events/common.md +++ b/docs/events/common.md @@ -27,9 +27,9 @@ window.addEventListener('beforeunload', function (e) { }); ``` -注意,许多手机浏览器默认忽略这个事件,桌面浏览器也有办法忽略这个事件。所以,它可能根本不会生效,不能依赖它来阻止用户关闭窗口。另外,一旦使用了`beforeunload`事件,浏览器就不会缓存当前网页,使用"回退"按钮将重新向服务器请求网页。这是因为监听这个事件的目的,一般是修改初始状态,这时缓存初始页面就没意义了。 +注意,许多手机浏览器(比如 Safari)默认忽略这个事件,桌面浏览器也有办法忽略这个事件。所以,它可能根本不会生效,不能依赖它来阻止用户关闭浏览器窗口,最好不要使用这个事件。 -基本上,只有一种场合可以监听`unload`事件,其他情况都不应该监听:用户修改了表单,还没有保存就要离开。 +另外,一旦使用了`beforeunload`事件,浏览器就不会缓存当前网页,使用"回退"按钮将重新向服务器请求网页。这是因为监听这个事件的目的,一般是为了网页状态,这时缓存页面的初始状态就没意义了。 ### unload 事件 @@ -45,6 +45,8 @@ window.addEventListener('unload', function(event) { 手机上,浏览器或系统可能会直接丢弃网页,这时该事件根本不会发生。而且跟`beforeunload`事件一样,一旦使用了`unload`事件,浏览器就不会缓存当前网页,理由同上。因此,任何情况下都不应该依赖这个事件,指定网页卸载时要执行的代码,可以考虑完全不使用这个事件。 +该事件可以用`pagehide`代替。 + ### load 事件,error 事件 `load`事件在页面或某个资源加载成功时触发。注意,页面或资源从浏览器缓存加载,并不会触发`load`事件。 @@ -59,13 +61,15 @@ window.addEventListener('load', function(event) { 这三个事件实际上属于进度事件,不仅发生在`document`对象,还发生在各种外部资源上面。浏览网页就是一个加载各种资源的过程,图像(image)、样式表(style sheet)、脚本(script)、视频(video)、音频(audio)、Ajax请求(XMLHttpRequest)等等。这些资源和`document`对象、`window`对象、XMLHttpRequestUpload 对象,都会触发`load`事件和`error`事件。 +最后,页面的`load`事件也可以用`pageshow`事件代替。 + ## session 历史事件 ### pageshow 事件,pagehide 事件 默认情况下,浏览器会在当前会话(session)缓存页面,当用户点击"前进/后退"按钮时,浏览器就会从缓存中加载页面。 -pageshow 事件在页面加载时触发,包括第一次加载和从缓存加载两种情况。如果要指定页面每次加载(不管是不是从浏览器缓存)时都运行的代码,可以放在这个事件的监听函数。 +`pageshow`事件在页面加载时触发,包括第一次加载和从缓存加载两种情况。如果要指定页面每次加载(不管是不是从浏览器缓存)时都运行的代码,可以放在这个事件的监听函数。 第一次加载时,它的触发顺序排在`load`事件后面。从缓存加载时,`load`事件不会触发,因为网页在缓存中的样子通常是`load`事件的监听函数运行后的样子,所以不必重复执行。同理,如果是从缓存中加载页面,网页内初始化的 JavaScript 脚本(比如 DOMContentLoaded 事件的监听函数)也不会执行。 @@ -75,7 +79,7 @@ window.addEventListener('pageshow', function(event) { }); ``` -pageshow 事件有一个`persisted`属性,返回一个布尔值。页面第一次加载时,这个属性是`false`;当页面从缓存加载时,这个属性是`true`。 +`pageshow`事件有一个`persisted`属性,返回一个布尔值。页面第一次加载时,这个属性是`false`;当页面从缓存加载时,这个属性是`true`。 ```javascript window.addEventListener('pageshow', function(event){ From 9eb914d2ad23e8151002da92423a755661afd862 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年5月25日 17:27:25 +0800 Subject: [PATCH 047/179] docs(types): edit array --- 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 d2fde5b..6f9d054 100644 --- a/docs/types/array.md +++ b/docs/types/array.md @@ -124,7 +124,7 @@ arr.length // 1001 上面代码表示,数组的数字键不需要连续,`length`属性的值总是比最大的那个整数键大`1`。另外,这也表明数组是一种动态的数据结构,可以随时增减数组的成员。 -`length`属性是可写的。如果人为设置一个小于当前成员个数的值,该数组的成员会自动减少到`length`设置的值。 +`length`属性是可写的。如果人为设置一个小于当前成员个数的值,该数组的成员数量会自动减少到`length`设置的值。 ```javascript var arr = [ 'a', 'b', 'c' ]; From 48619c081d054eaeb6321d269ebc7306340151ee Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年5月25日 17:53:19 +0800 Subject: [PATCH 048/179] =?UTF-8?q?docs(operator):=20edit=20=E7=BB=93?= =?UTF-8?q?=E5=90=88=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/operators/priority.md | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/docs/operators/priority.md b/docs/operators/priority.md index 8b2a65a..d347f87 100644 --- a/docs/operators/priority.md +++ b/docs/operators/priority.md @@ -162,34 +162,56 @@ f() // 1 ### 左结合与右结合 -对于优先级别相同的运算符,大多数情况,计算顺序总是从左到右,这叫做运算符的"左结合"(left-to-right associativity),即从左边开始计算。 +对于优先级别相同的运算符,同时出现的时候,就会有计算顺序的问题。 + +```javascript +a OP b OP c +``` + +上面代码中,`OP`表示运算符。它可以有两种解释方式。 + +```javascript +// 方式一 +(a OP b) OP c + +// 方式二 +a OP (b OP c) +``` + +上面的两种方式,得到的计算结果往往是不一样的。方式一是将左侧两个运算数结合在一起,采用这种解释方式的运算符,称为"左结合"(left-to-right associativity)运算符;方式二是将右侧两个运算数结合在一起,这样的运算符称为"右结合"运算符(right-to-left associativity)。 + +JavaScript 语言的大多数运算符是"左结合",请看下面加法运算符的例子。 ```javascript x + y + z + +// 引擎解释如下 +(x + y) + z ``` -上面代码先计算最左边的`x`与`y`的和,然后再计算与`z`的和。 +上面代码中,`x`与`y`结合在一起,它们的预算结果再与`z`进行运算。 -但是少数运算符的计算顺序是从右到左,即从右边开始计算,这叫做运算符的"右结合"(right-to-left associativity)。其中,最主要的是赋值运算符(`=`)和三元条件运算符(`?:`)。 +少数运算符是"右结合",其中最主要的是赋值运算符(`=`)和三元条件运算符(`?:`)。 ```javascript w = x = y = z; q = a ? b : c ? d : e ? f : g; ``` -上面代码的运算结果,相当于下面的样子。 +上面代码的解释方式如下。 ```javascript w = (x = (y = z)); q = a ? b : (c ? d : (e ? f : g)); ``` -上面的两行代码,各有三个等号运算符和三个三元运算符,都是先计算最右边的那个运算符。 +上面的两行代码,都是右侧的运算数结合在一起。 -指数运算符(`**`)也是右结合的。 +另外,指数运算符(`**`)也是右结合。 ```javascript -// 相当于 2 ** (3 ** 2) 2 ** 3 ** 2 +// 相当于 2 ** (3 ** 2) // 512 ``` + From 0d10e3bef5f2b4d52749a73e361c4812bb37e709 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年5月31日 11:26:31 +0800 Subject: [PATCH 049/179] =?UTF-8?q?docs(bom):=20edit=20=E5=90=8C=E6=BA=90?= =?UTF-8?q?=E6=94=BF=E7=AD=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/bom/cookie.md | 2 +- docs/bom/same-origin.md | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/bom/cookie.md b/docs/bom/cookie.md index a18ff85..9c7f53b 100644 --- a/docs/bom/cookie.md +++ b/docs/bom/cookie.md @@ -36,7 +36,7 @@ document.cookie // "id=foo;key=bar" 不同浏览器对 Cookie 数量和大小的限制,是不一样的。一般来说,单个域名设置的 Cookie 不应超过30个,每个 Cookie 的大小不能超过4KB。超过限制以后,Cookie 将被忽略,不会被设置。 -浏览器的同源政策规定,两个网址只要域名相同和端口相同,就可以共享 Cookie(参见《同源政策》一章)。注意,这里不要求协议相同。也就是说,`http://example.com`设置的 Cookie,可以被`https://example.com`读取。 +浏览器的同源政策规定,两个网址只要域名相同,就可以共享 Cookie(参见《同源政策》一章)。注意,这里不要求协议相同。也就是说,`http://example.com`设置的 Cookie,可以被`https://example.com`读取。 ## Cookie 与 HTTP 协议 diff --git a/docs/bom/same-origin.md b/docs/bom/same-origin.md index 23d6c56..553dc39 100644 --- a/docs/bom/same-origin.md +++ b/docs/bom/same-origin.md @@ -12,7 +12,7 @@ > - 协议相同 > - 域名相同 -> - 端口相同 +> - 端口相同(这点可以忽略,详见下文) 举例来说,`http://www.example.com/dir/page.html`这个网址,协议是`http://`,域名是`www.example.com`,端口是`80`(默认端口可以省略),它的同源情况如下。 @@ -22,11 +22,13 @@ - `http://www.example.com:81/dir/other.html`:不同源(端口不同) - `https://www.example.com/dir/page.html`:不同源(协议不同) +注意,标准规定端口不同的网址不是同源(比如8000端口和8001端口不是同源),但是浏览器没有遵守这条规定。实际上,同一个网域的不同端口,是可以互相读取 Cookie 的。 + ### 目的 同源政策的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据。 -设想这样一种情况:A 网站是一家银行,用户登录以后,A 网站在用户的机器上设置了一个 Cookie,包含了一些隐私信息(比如存款总额)。用户离开 A 网站以后,又去访问 B 网站,如果没有同源限制,B 网站可以读取 A 网站的 Cookie,那么隐私信息就会泄漏。更可怕的是,Cookie 往往用来保存用户的登录状态,如果用户没有退出登录,其他网站就可以冒充用户,为所欲为。因为浏览器同时还规定,提交表单不受同源政策的限制。 +设想这样一种情况:A 网站是一家银行,用户登录以后,A 网站在用户的机器上设置了一个 Cookie,包含了一些隐私信息。用户离开 A 网站以后,又去访问 B 网站,如果没有同源限制,B 网站可以读取 A 网站的 Cookie,那么隐私就泄漏了。更可怕的是,Cookie 往往用来保存用户的登录状态,如果用户没有退出登录,其他网站就可以冒充用户,为所欲为。因为浏览器同时还规定,提交表单不受同源政策的限制。 由此可见,同源政策是必需的,否则 Cookie 可以共享,互联网就毫无安全可言了。 @@ -56,7 +58,7 @@ - window.focus() - window.postMessage() -上面的九个属性之中,只有`window.location`是可读写的,其他八个全部都是只读。而且,即使是`location`对象,非同源的情况下,也只允许调用`location.replace`方法和写入`location.href`属性。 +上面的九个属性之中,只有`window.location`是可读写的,其他八个全部都是只读。而且,即使是`location`对象,非同源的情况下,也只允许调用`location.replace()`方法和写入`location.href`属性。 虽然这些限制是必要的,但是有时很不方便,合理的用途也受到影响。下面介绍如何规避上面的限制。 From 7afc47774546232445ebb5f3713411e392d8ce21 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年5月31日 11:28:39 +0800 Subject: [PATCH 050/179] 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 cd7c434..b556c0d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -512,9 +512,9 @@ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" }, "gh-pages": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-2.2.0.tgz", - "integrity": "sha512-c+yPkNOPMFGNisYg9r4qvsMIjVYikJv7ImFOhPIVPt0+AcRUamZ7zkGRLHz7FKB0xrlZ+ddSOJsZv9XAFVXLmA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-3.0.0.tgz", + "integrity": "sha512-oaOfVcrSwnqoWUgZ6cmCDM6mUuWyOSG+SHjqxGBawN0F3SKaF5NwbeYDG+w2RNXO2HJ/5Iam4o7dP5NAtoHuwQ==", "requires": { "async": "^2.6.1", "commander": "^2.18.0", diff --git a/package.json b/package.json index 0ba3685..b5fc37f 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ }, "homepage": "https://github.com/wangdoc/javascript-tutorial", "dependencies": { - "gh-pages": "latest", + "gh-pages": "^3.0.0", "husky": "latest", "loppo": "latest", "loppo-theme-wangdoc": "^0.4.6" From 3f8e88a297b525e89aa635c7a392dc3fc99ef43d Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年6月12日 00:01:10 +0800 Subject: [PATCH 051/179] docs(stdlib/attribute): fix #175 --- docs/stdlib/attributes.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/stdlib/attributes.md b/docs/stdlib/attributes.md index 851ac0a..1440a67 100644 --- a/docs/stdlib/attributes.md +++ b/docs/stdlib/attributes.md @@ -445,7 +445,7 @@ obj.p2 // 2 除了直接定义以外,属性还可以用存取器(accessor)定义。其中,存值函数称为`setter`,使用属性描述对象的`set`属性;取值函数称为`getter`,使用属性描述对象的`get`属性。 -一旦对目标属性定义了存取器,那么存取的时候,都将执行对应的函数。利用这个功能,可以实现许多高级特性,比如某个属性禁止赋值。 +一旦对目标属性定义了存取器,那么存取的时候,都将执行对应的函数。利用这个功能,可以实现许多高级特性,比如定制属性的读取和赋值行为。 ```javascript var obj = Object.defineProperty({}, 'p', { @@ -466,6 +466,7 @@ obj.p = 123 // "setter: 123" JavaScript 还提供了存取器的另一种写法。 ```javascript +// 写法二 var obj = { get p() { return 'getter'; @@ -476,7 +477,7 @@ var obj = { }; ``` -上面的写法与定义属性描述对象是等价的,而且使用更广泛。 +上面两种写法,虽然属性`p`的读取和赋值行为是一样的,但是有一些细微的区别。第一种写法,属性`p`的`configurable`和`enumerable`都为`false`,从而导致属性`p`是不可遍历的;第二种写法,属性`p`的`configurable`和`enumerable`都为`true`,因此属性`p`是可遍历的。实际开发中,写法二更常用。 注意,取值函数`get`不能接受参数,存值函数`set`只能接受一个参数(即属性的值)。 From 4b98a2ca237dfb806005584c769eaeff534fbbd2 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年6月12日 15:39:13 +0800 Subject: [PATCH 052/179] =?UTF-8?q?docs(stdlib/regex):=20edit=20=E8=B4=AA?= =?UTF-8?q?=E5=A9=AA=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/stdlib/regexp.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/docs/stdlib/regexp.md b/docs/stdlib/regexp.md index 0d41c43..4d7fecb 100644 --- a/docs/stdlib/regexp.md +++ b/docs/stdlib/regexp.md @@ -694,7 +694,7 @@ var html = "Hello\nworld!"; ### 贪婪模式 -上一小节的三个量词符,默认情况下都是最大可能匹配,即匹配直到下一个字符不满足匹配规则为止。这被称为贪婪模式。 +上一小节的三个量词符,默认情况下都是最大可能匹配,即匹配到下一个字符不满足匹配规则为止。这被称为贪婪模式。 ```javascript var s = 'aaa'; @@ -703,29 +703,31 @@ s.match(/a+/) // ["aaa"] 上面代码中,模式是`/a+/`,表示匹配1个`a`或多个`a`,那么到底会匹配几个`a`呢?因为默认是贪婪模式,会一直匹配到字符`a`不出现为止,所以匹配结果是3个`a`。 -如果想将贪婪模式改为非贪婪模式,可以在量词符后面加一个问号。 +除了贪婪模式,还有非贪婪模式,即最小可能匹配。只要一发现匹配,就返回结果,不要往下检查。如果想将贪婪模式改为非贪婪模式,可以在量词符后面加一个问号。 ```javascript var s = 'aaa'; s.match(/a+?/) // ["a"] ``` -上面代码中,模式结尾添加了一个问号`/a+?/`,这时就改为非贪婪模式,一旦条件满足,就不再往下匹配。 +上面例子中,模式结尾添加了一个问号`/a+?/`,这时就改为非贪婪模式,一旦条件满足,就不再往下匹配,`+?`表示只要发现一个`a`,就不再往下匹配了。 -除了非贪婪模式的加号,还有非贪婪模式的星号(`*`)和非贪婪模式的问号(`?`)。 +除了非贪婪模式的加号(`+?`),还有非贪婪模式的星号(`*?`)和非贪婪模式的问号(`??`)。 - `+?`:表示某个模式出现1次或多次,匹配时采用非贪婪模式。 - `*?`:表示某个模式出现0次或多次,匹配时采用非贪婪模式。 - `??`:表格某个模式出现0次或1次,匹配时采用非贪婪模式。 ```javascript -'abb'.match(/ab*b/) // ["abb"] -'abb'.match(/ab*?b/) // ["ab"] +'abb'.match(/ab*/) // ["abb"] +'abb'.match(/ab*?/) // ["a"] -'abb'.match(/ab?b/) // ["abb"] -'abb'.match(/ab??b/) // ["ab"] +'abb'.match(/ab?/) // ["ab"] +'abb'.match(/ab??/) // ["a"] ``` +上面例子中,`/ab*/`表示如果`a`后面有多个`b`,那么匹配尽可能多的`b`;`/ab*?/`表示匹配尽可能少的`b`,也就是0个`b`。 + ### 修饰符 修饰符(modifier)表示模式的附加规则,放在正则模式的最尾部。 From 7b4c045afadefaa4185e8b4df1f347410a9acd61 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年6月12日 18:17:56 +0800 Subject: [PATCH 053/179] docs(string): fixed slice() #176 --- docs/stdlib/string.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/stdlib/string.md b/docs/stdlib/string.md index f155546..63d21fa 100644 --- a/docs/stdlib/string.md +++ b/docs/stdlib/string.md @@ -166,7 +166,7 @@ one + two + three // "33" ### String.prototype.slice() -`slice`方法用于从原字符串取出子字符串并返回,不改变原字符串。它的第一个参数是子字符串的开始位置,第二个参数是子字符串的结束位置(不含该位置)。 +`slice()`方法用于从原字符串取出子字符串并返回,不改变原字符串。它的第一个参数是子字符串的开始位置,第二个参数是子字符串的结束位置(不含该位置)。 ```javascript 'JavaScript'.slice(0, 4) // "Java" @@ -186,7 +186,7 @@ one + two + three // "33" 'JavaScript'.slice(-2, -1) // "p" ``` -如果第一个参数大于第二个参数,`slice`方法返回一个空字符串。 +如果第一个参数大于第二个参数(正数情况下),`slice()`方法返回一个空字符串。 ```javascript 'JavaScript'.slice(2, 1) // "" From 2d95d1e9f9cf15f5c85dfc688a25b09b6ee5ff62 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年6月22日 01:12:10 +0800 Subject: [PATCH 054/179] docs(dom): edit document.getElementsByTagName --- docs/dom/document.md | 16 ++++++++-------- docs/dom/element.md | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/dom/document.md b/docs/dom/document.md index 8e08982..46da3e9 100644 --- a/docs/dom/document.md +++ b/docs/dom/document.md @@ -496,7 +496,7 @@ document.querySelectorAll('DIV, A, SCRIPT'); ### document.getElementsByTagName() -`document.getElementsByTagName`方法搜索 HTML 标签名,返回符合条件的元素。它的返回值是一个类似数组对象(`HTMLCollection`实例),可以实时反映 HTML 文档的变化。如果没有任何匹配的元素,就返回一个空集。 +`document.getElementsByTagName()`方法搜索 HTML 标签名,返回符合条件的元素。它的返回值是一个类似数组对象(`HTMLCollection`实例),可以实时反映 HTML 文档的变化。如果没有任何匹配的元素,就返回一个空集。 ```javascript var paras = document.getElementsByTagName('p'); @@ -505,7 +505,7 @@ paras instanceof HTMLCollection // true 上面代码返回当前文档的所有`p`元素节点。 -HTML 标签名是大小写不敏感的,因此`getElementsByTagName`方法也是大小写不敏感的。另外,返回结果中,各个成员的顺序就是它们在文档中出现的顺序。 +HTML 标签名是大小写不敏感的,因此`getElementsByTagName()`方法的参数也是大小写不敏感的。另外,返回结果中,各个成员的顺序就是它们在文档中出现的顺序。 如果传入`*`,就可以返回文档中所有 HTML 元素。 @@ -524,7 +524,7 @@ var spans = firstPara.getElementsByTagName('span'); ### document.getElementsByClassName() -`document.getElementsByClassName`方法返回一个类似数组的对象(`HTMLCollection`实例),包括了所有`class`名字符合指定条件的元素,元素的变化实时反映在返回结果中。 +`document.getElementsByClassName()`方法返回一个类似数组的对象(`HTMLCollection`实例),包括了所有`class`名字符合指定条件的元素,元素的变化实时反映在返回结果中。 ```javascript var elements = document.getElementsByClassName(names); @@ -542,7 +542,7 @@ var elements = document.getElementsByClassName('foo bar'); 注意,正常模式下,CSS 的`class`是大小写敏感的。(`quirks mode`下,大小写不敏感。) -与`getElementsByTagName`方法一样,`getElementsByClassName`方法不仅可以在`document`对象上调用,也可以在任何元素节点上调用。 +与`getElementsByTagName()`方法一样,`getElementsByClassName()`方法不仅可以在`document`对象上调用,也可以在任何元素节点上调用。 ```javascript // 非document对象上调用 @@ -551,7 +551,7 @@ var elements = rootElement.getElementsByClassName(names); ### document.getElementsByName() -`document.getElementsByName`方法用于选择拥有`name`属性的 HTML 元素(比如`
`、``、``、``、``和``等),返回一个类似数组的的对象(`NodeList`实例),因为`name`属性相同的元素可能不止一个。 +`document.getElementsByName()`方法用于选择拥有`name`属性的 HTML 元素(比如``、``、``、``、``和``等),返回一个类似数组的的对象(`NodeList`实例),因为`name`属性相同的元素可能不止一个。 ```javascript // 表单为 @@ -561,7 +561,7 @@ forms[0].tagName // "FORM" ### document.getElementById() -`document.getElementById`方法返回匹配指定`id`属性的元素节点。如果没有发现匹配的节点,则返回`null`。 +`document.getElementById()`方法返回匹配指定`id`属性的元素节点。如果没有发现匹配的节点,则返回`null`。 ```javascript var elem = document.getElementById('para1'); @@ -569,7 +569,7 @@ var elem = document.getElementById('para1'); 注意,该方法的参数是大小写敏感的。比如,如果某个节点的`id`属性是`main`,那么`document.getElementById('Main')`将返回`null`。 -`document.getElementById`方法与`document.querySelector`方法都能获取元素节点,不同之处是`document.querySelector`方法的参数使用 CSS 选择器语法,`document.getElementById`方法的参数是元素的`id`属性。 +`document.getElementById()`方法与`document.querySelector()`方法都能获取元素节点,不同之处是`document.querySelector()`方法的参数使用 CSS 选择器语法,`document.getElementById()`方法的参数是元素的`id`属性。 ```javascript document.getElementById('myElement') @@ -582,7 +582,7 @@ document.querySelector('#myElement') ### document.elementFromPoint(),document.elementsFromPoint() -`document.elementFromPoint`方法返回位于页面指定位置最上层的元素节点。 +`document.elementFromPoint()`方法返回位于页面指定位置最上层的元素节点。 ```javascript var element = document.elementFromPoint(50, 50); diff --git a/docs/dom/element.md b/docs/dom/element.md index 82c276b..b569f31 100644 --- a/docs/dom/element.md +++ b/docs/dom/element.md @@ -603,14 +603,14 @@ for (var i = 0; i< matches.length; i++) { ### Element.getElementsByTagName() -`Element.getElementsByTagName`方法返回一个`HTMLCollection`实例,成员是当前节点的所有匹配指定标签名的子元素节点。该方法与`document.getElementsByClassName`方法的用法类似,只是搜索范围不是整个文档,而是当前元素节点。 +`Element.getElementsByTagName()`方法返回一个`HTMLCollection`实例,成员是当前节点的所有匹配指定标签名的子元素节点。该方法与`document.getElementsByClassName()`方法的用法类似,只是搜索范围不是整个文档,而是当前元素节点。 ```javascript var table = document.getElementById('forecast-table'); var cells = table.getElementsByTagName('td'); ``` -注意,该方法的参数是大小写不敏感的。 +注意,该方法的参数是大小写不敏感的,因为 HTML 标签名也是大小写不敏感。 ### Element.closest() From 3d936cd2a6a204fc5fd79c6a6055021622d71ebe Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年6月24日 17:24:20 +0800 Subject: [PATCH 055/179] docs: edit README --- README.md | 7 +++++-- package-lock.json | 37 ++++++++++++++++++++++++++++++++++--- package.json | 2 +- 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 521bf3a..7b47ff2 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ -本教程全面介绍 JavaScript 核心语法,从最简单的讲起,循序渐进、由浅入深,力求清晰易懂。所有章节都带有大量的代码实例,便于理解和模仿,可以用到实际项目中,即学即用。 +本教程全面介绍 JavaScript 核心语法,覆盖了 ES5 和 DOM 规范的所有内容。 + +内容上从最简单的讲起,循序渐进、由浅入深,力求清晰易懂。所有章节都带有大量的代码实例,便于理解和模仿,可以用到实际项目中,即学即用。 + +本教程适合初学者当作 JavaScript 语言入门教程,学完后就可以承担实际的网页开发工作,也适合当作日常使用的参考手册。JavaScript 后续新增的 ES6 语法,请看[《ES6 标准入门教程》](https://wangdoc.com/es6/)。 -本教程适合初学者当作 JavaScript 语言入门教程,也适合当作日常使用的参考手册。 diff --git a/package-lock.json b/package-lock.json index b556c0d..896253b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -237,6 +237,11 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, "compare-versions": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", @@ -464,6 +469,16 @@ } } }, + "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==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -512,14 +527,15 @@ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" }, "gh-pages": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-3.0.0.tgz", - "integrity": "sha512-oaOfVcrSwnqoWUgZ6cmCDM6mUuWyOSG+SHjqxGBawN0F3SKaF5NwbeYDG+w2RNXO2HJ/5Iam4o7dP5NAtoHuwQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-3.1.0.tgz", + "integrity": "sha512-3b1rly9kuf3/dXsT8+ZxP0UhNLOo1CItj+3e31yUVcaph/yDsJ9RzD7JOw5o5zpBTJVQLlJAASNkUfepi9fe2w==", "requires": { "async": "^2.6.1", "commander": "^2.18.0", "email-addresses": "^3.0.1", "filenamify-url": "^1.0.0", + "find-cache-dir": "^3.3.1", "fs-extra": "^8.1.0", "globby": "^6.1.0" } @@ -932,6 +948,21 @@ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "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": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", diff --git a/package.json b/package.json index b5fc37f..ecfb296 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ }, "homepage": "https://github.com/wangdoc/javascript-tutorial", "dependencies": { - "gh-pages": "^3.0.0", + "gh-pages": "^3.1.0", "husky": "latest", "loppo": "latest", "loppo-theme-wangdoc": "^0.4.6" From 16df62c9604b9c4aa98ac95a7c9a01bebcccefda Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年6月24日 17:29:48 +0800 Subject: [PATCH 056/179] docs: edit README --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7b47ff2..b3f09b2 100644 --- a/README.md +++ b/README.md @@ -2,5 +2,7 @@ 内容上从最简单的讲起,循序渐进、由浅入深,力求清晰易懂。所有章节都带有大量的代码实例,便于理解和模仿,可以用到实际项目中,即学即用。 -本教程适合初学者当作 JavaScript 语言入门教程,学完后就可以承担实际的网页开发工作,也适合当作日常使用的参考手册。JavaScript 后续新增的 ES6 语法,请看[《ES6 标准入门教程》](https://wangdoc.com/es6/)。 +本教程适合初学者当作 JavaScript 语言入门教程,学完后就可以承担实际的网页开发工作,也适合当作日常使用的参考手册。 + +JavaScript 后续新增的 ES6 语法,请看[《ES6 标准入门教程》](https://wangdoc.com/es6/)。 From db23e4c9c1921f43d57166db776d95537b227a44 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: 2020年7月15日 23:19:26 +0000 Subject: [PATCH 057/179] build(deps): bump lodash from 4.17.15 to 4.17.19 Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.19. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.19) 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 896253b..bc1165e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -812,9 +812,9 @@ } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" }, "log-symbols": { "version": "3.0.0", From e793217e29835b2ec73303a9c41e30228b3d3e7f Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sun, 2 Aug 2020 16:23:14 +0800 Subject: [PATCH 058/179] =?UTF-8?q?docs(types/function):=20edit=20?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E5=AE=9A=E4=B9=89=E5=90=8E=E9=9D=A2=E7=9A=84?= =?UTF-8?q?=E5=9C=86=E6=8B=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/types/function.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/types/function.md b/docs/types/function.md index 66265d9..70c41ee 100644 --- a/docs/types/function.md +++ b/docs/types/function.md @@ -790,7 +790,7 @@ p1.getAge() // 25 ### 立即调用的函数表达式(IIFE) -在 JavaScript 中,圆括号`()`是一种运算符,跟在函数名之后,表示调用该函数。比如,`print()`就表示调用`print`函数。 +根据 JavaScript 的语法,圆括号`()`跟在函数名之后,表示调用该函数。比如,`print()`就表示调用`print`函数。 有时,我们需要在定义函数之后,立即调用该函数。这时,你不能在函数的定义之后加上圆括号,这会产生语法错误。 @@ -809,7 +809,16 @@ function f() {} var f = function f() {} ``` -为了避免解析上的歧义,JavaScript 引擎规定,如果`function`关键字出现在行首,一律解释成语句。因此,JavaScript 引擎看到行首是`function`关键字之后,认为这一段都是函数的定义,不应该以圆括号结尾,所以就报错了。 +当作表达式时,函数可以定义后直接加圆括号调用。 + +```javascript +var f = function f(){ return 1}(); +f // 1 +``` + +上面的代码中,函数定义后直接加圆括号调用,没有报错。原因就是`function`作为表达式,引擎就把函数定义当作一个值。这种情况下,就不会报错 + +为了避免解析的歧义,JavaScript 规定,如果`function`关键字出现在行首,一律解释成语句。因此,引擎看到行首是`function`关键字之后,认为这一段都是函数的定义,不应该以圆括号结尾,所以就报错了。 解决方法就是不要让`function`出现在行首,让引擎将其理解成一个表达式。最简单的处理,就是将其放在一个圆括号里面。 From 7cb09b2ea9946635c3ac8a620e1d1aad327f83c2 Mon Sep 17 00:00:00 2001 From: Lean You <7764115+byog@users.noreply.github.com> Date: Tue, 4 Aug 2020 15:42:53 +0800 Subject: [PATCH 059/179] Update math.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 不全 Math.floor() 和 Math.ceil() 信息 --- docs/stdlib/math.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/stdlib/math.md b/docs/stdlib/math.md index a36cd38..a5e8947 100644 --- a/docs/stdlib/math.md +++ b/docs/stdlib/math.md @@ -66,14 +66,14 @@ Math.max() // -Infinity ### Math.floor(),Math.ceil() -`Math.floor`方法返回小于参数值的最大整数(地板值)。 +`Math.floor`方法返回小于或等于参数值的最大整数(地板值)。 ```javascript Math.floor(3.2) // 3 Math.floor(-3.2) // -4 ``` -`Math.ceil`方法返回大于参数值的最小整数(天花板值)。 +`Math.ceil`方法返回大于或等于参数值的最小整数(天花板值)。 ```javascript Math.ceil(3.2) // 4 From d0ae41cbc4435f9b3ffd885116760cbfe966e88b Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年8月24日 23:43:15 +0800 Subject: [PATCH 060/179] docs(stdlib/regex): fix typo --- docs/stdlib/regexp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/stdlib/regexp.md b/docs/stdlib/regexp.md index 4d7fecb..8e306e0 100644 --- a/docs/stdlib/regexp.md +++ b/docs/stdlib/regexp.md @@ -485,7 +485,7 @@ str.split(separator, [limit]) 上面代码指的是,`a`和`b`之间有一个空格或者一个制表符。 -其他的元字符还包括`\`、`\*`、`+`、`?`、`()`、`[]`、`{}`等,将在下文解释。 +其他的元字符还包括`\`、`*`、`+`、`?`、`()`、`[]`、`{}`等,将在下文解释。 ### 转义符 From a2aed617b96b8c5b75ab319a15bd327564687dd1 Mon Sep 17 00:00:00 2001 From: Lean You <7764115+byog@users.noreply.github.com> Date: 2020年8月26日 16:51:55 +0800 Subject: [PATCH 061/179] 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 d082d4d..94ba613 100644 --- a/docs/events/drag.md +++ b/docs/events/drag.md @@ -452,7 +452,7 @@ event.dataTransfer.clearData('text/uri-list'); 拖动过程中(`dragstart`事件触发后),浏览器会显示一张图片跟随鼠标一起移动,表示被拖动的节点。这张图片是自动创造的,通常显示为被拖动节点的外观,不需要自己动手设置。 -`DataTransfer.setDragImage()`方法可以自定义这张图片。它接受三个参数。第一个是``节点或者``节点,如果省略或为`null`,则使用被拖动的节点的外观;第二个和第三个参数为鼠标相对于该图片左上角的横坐标和右坐标。 +`DataTransfer.setDragImage()`方法可以自定义这张图片。它接受三个参数。第一个是``节点或者``节点,如果省略或为`null`,则使用被拖动的节点的外观;第二个和第三个参数为鼠标相对于该图片左上角的横坐标和纵坐标。 下面是一个例子。 From 9ab17c05c08b336d92de53f58380c78dacc051c0 Mon Sep 17 00:00:00 2001 From: Lean You <7764115+byog@users.noreply.github.com> Date: 2020年8月27日 23:39:32 +0800 Subject: [PATCH 062/179] Update engine.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 参考 MDN 上的介绍和自己的理解 --- docs/bom/engine.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/bom/engine.md b/docs/bom/engine.md index b42197c..006a43d 100644 --- a/docs/bom/engine.md +++ b/docs/bom/engine.md @@ -372,13 +372,13 @@ foo.style.marginTop = '30px'; - 使用`documentFragment`操作 DOM - 动画使用`absolute`定位或`fixed`定位,这样可以减少对其他元素的影响。 - 只在必要时才显示隐藏元素。 -- 使用`window.requestAnimationFrame()`,因为它可以把代码推迟到下一次重流时执行,而不是立即要求页面重流。 +- 使用`window.requestAnimationFrame()`,因为它可以把代码推迟到下一次重绘之前执行,而不是立即要求页面重绘。 - 使用虚拟 DOM(virtual DOM)库。 下面是一个`window.requestAnimationFrame()`对比效果的例子。 ```javascript -// 重绘代价高 +// 重流代价高 function doubleHeight(element) { var currentHeight = element.clientHeight; element.style.height = (currentHeight * 2) + 'px'; From 913da4be3964b0111996d6ef18d401d7783a9835 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年8月29日 13:08:29 +0800 Subject: [PATCH 063/179] docs: edit bom/engine & event/drag --- docs/bom/engine.md | 4 ++-- docs/events/drag.md | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/bom/engine.md b/docs/bom/engine.md index 006a43d..86e7f53 100644 --- a/docs/bom/engine.md +++ b/docs/bom/engine.md @@ -6,7 +6,7 @@ JavaScript 是浏览器的内置脚本语言。也就是说,浏览器内置了 ## 代码嵌入网页的方法 -网页中嵌入 JavaScript 代码,主要有三种方法。 +网页中嵌入 JavaScript 代码,主要有四种方法。 - `>`元素直接嵌入代码。 - `>`标签加载外部脚本 @@ -15,7 +15,7 @@ JavaScript 是浏览器的内置脚本语言。也就是说,浏览器内置了 ### script 元素嵌入代码 -`>`元素内部可以直接写 JavaScript 代码。 +`>`元素内部可以直接写入 JavaScript 代码。 ```html > diff --git a/docs/events/drag.md b/docs/events/drag.md index 94ba613..8764a86 100644 --- a/docs/events/drag.md +++ b/docs/events/drag.md @@ -4,7 +4,7 @@ 拖拉(drag)指的是,用户在某个对象上按下鼠标键不放,拖动它到另一个位置,然后释放鼠标键,将该对象放在那里。 -拖拉的对象有好几种,包括元素节点、图片、链接、选中的文字等等。在网页中,除了元素节点默认不可以拖拉,其他(图片、链接、选中的文字)都是可以直接拖拉的。为了让元素节点可拖拉,可以将该节点的`draggable`属性设为`true`。 +拖拉的对象有好几种,包括元素节点、图片、链接、选中的文字等等。在网页中,除了元素节点默认不可以拖拉,其他(图片、链接、选中的文字)都可以直接拖拉。为了让元素节点可拖拉,可以将该节点的`draggable`属性设为`true`。 ```html
@@ -12,6 +12,8 @@
``` +上面代码的`div`区块,在网页中可以直接用鼠标拖动。松开鼠标键时,拖动效果就会消失,该区块依然在原来的位置。 + `draggable`属性可用于任何元素节点,但是图片(``)和链接(`
`)不加这个属性,就可以拖拉。对于它们,用到这个属性的时候,往往是将其设为`false`,防止拖拉这两种元素。 注意,一旦某个元素节点的`draggable`属性设为`true`,就无法再用鼠标选中该节点内部的文字或子节点了。 From be0c31d7872958280477a70ac16bd57bb0591343 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年9月10日 21:41:36 +0800 Subject: [PATCH 064/179] docs(operators): fix #185 --- docs/operators/comparison.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/operators/comparison.md b/docs/operators/comparison.md index c348da5..020bde4 100644 --- a/docs/operators/comparison.md +++ b/docs/operators/comparison.md @@ -74,7 +74,7 @@ true> false // true 上面代码中,字符串和布尔值都会先转成数值,再进行比较。 -这里需要注意与`NaN`的比较。任何值(包括`NaN`本身)与`NaN`比较,返回的都是`false`。 +这里需要注意与`NaN`的比较。任何值(包括`NaN`本身)与`NaN`使用非相等运算符进行比较,返回的都是`false`。 ```javascript 1> NaN // false From e12104298777ab00beccce782bc3b5122a7cff15 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年9月15日 16:18:22 +0800 Subject: [PATCH 065/179] docs(operator/comparison): fix #186 --- docs/operators/comparison.md | 49 +++++++++++++----- package-lock.json | 96 +++++++++++++++--------------------- package.json | 2 +- 3 files changed, 77 insertions(+), 70 deletions(-) diff --git a/docs/operators/comparison.md b/docs/operators/comparison.md index 020bde4..3f34eca 100644 --- a/docs/operators/comparison.md +++ b/docs/operators/comparison.md @@ -227,7 +227,7 @@ v1 === v2 // true 1 === 1.0 ``` -比较不同类型的数据时,相等运算符会先将数据进行类型转换,然后再用严格相等运算符比较。下面分成四种情况,讨论不同类型的值互相比较的规则。 +比较不同类型的数据时,相等运算符会先将数据进行类型转换,然后再用严格相等运算符比较。下面分成几种情况,讨论不同类型的值互相比较的规则。 **(1)原始类型值** @@ -272,38 +272,61 @@ v1 === v2 // true 对象(这里指广义的对象,包括数组和函数)与原始类型的值比较时,对象转换成原始类型的值,再进行比较。 +具体来说,先调用对象的`valueOf()`方法,如果得到原始类型的值,就按照上一小节的规则,互相比较;如果得到的还是对象,则再调用`toString()`方法,得到字符串形式,再进行比较。 + +下面是数组与原始类型值比较的例子。 + ```javascript -// 对象与数值比较时,对象转为数值 +// 数组与数值的比较 [1] == 1 // true -// 等同于 Number([1]) == 1 -// 对象与字符串比较时,对象转为字符串 +// 数组与字符串的比较 [1] == '1' // true -// 等同于 String([1]) == '1' [1, 2] == '1,2' // true -// 等同于 String([1, 2]) == '1,2' -// 对象与布尔值比较时,两边都转为数值 +// 对象与布尔值的比较 [1] == true // true -// 等同于 Number([1]) == Number(true) [2] == true // false -// 等同于 Number([2]) == Number(true) ``` -上面代码中,数组`[1]`与数值进行比较,会先转成数值,再进行比较;与字符串进行比较,会先转成字符串,再进行比较;与布尔值进行比较,对象和布尔值都会先转成数值,再进行比较。 +上面例子中,JavaScript 引擎会先对数组`[1]`调用数组的`valueOf()`方法,由于返回的还是一个数组,所以会接着调用数组的`toString()`方法,得到字符串形式,再按照上一小节的规则进行比较。 + +下面是一个更直接的例子。 + +```javascript +const obj = { + valueOf: function () { + console.log('执行 valueOf()'); + return obj; + }, + toString: function () { + console.log('执行 toString()'); + return 'foo'; + } +}; + +obj == 'foo' +// 执行 valueOf() +// 执行 toString() +// true +``` + +上面例子中,`obj`是一个自定义了`valueOf()`和`toString()`方法的对象。这个对象与字符串`'foo'`进行比较时,会依次调用`valueOf()`和`toString()`方法,最后返回`'foo'`,所以比较结果是`true`。 **(3)undefined 和 null** -`undefined`和`null`与其他类型的值比较时,结果都为`false`,它们互相比较时结果为`true`。 +`undefined`和`null`只有与自身比较,或者互相比较时,才会返回`true`;与其他类型的值比较时,结果都为`false`。 ```javascript +undefined == undefined // true +null == null // true +undefined == null // true + false == null // false false == undefined // false 0 == null // false 0 == undefined // false - -undefined == null // true ``` **(4)相等运算符的缺点** diff --git a/package-lock.json b/package-lock.json index bc1165e..adeb3be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,24 +5,24 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "requires": { - "@babel/highlight": "^7.8.3" + "@babel/highlight": "^7.10.4" } }, "@babel/helper-validator-identifier": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", - "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" + "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==" }, "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -73,14 +73,6 @@ } } }, - "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -178,9 +170,9 @@ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" }, "chalk": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", - "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -274,15 +266,15 @@ } }, "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", "requires": { "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", + "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", - "yaml": "^1.7.2" + "yaml": "^1.10.0" } }, "date-format": { @@ -658,14 +650,14 @@ } }, "husky": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.5.tgz", - "integrity": "sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.0.tgz", + "integrity": "sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA==", "requires": { "chalk": "^4.0.0", "ci-info": "^2.0.0", "compare-versions": "^3.6.0", - "cosmiconfig": "^6.0.0", + "cosmiconfig": "^7.0.0", "find-versions": "^3.2.0", "opencollective-postinstall": "^2.0.2", "pkg-dir": "^4.2.0", @@ -739,10 +731,10 @@ "esprima": "^4.0.0" } }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "jsonfile": { "version": "4.0.0", @@ -1155,9 +1147,9 @@ } }, "opencollective-postinstall": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", - "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==" }, "os-locale": { "version": "1.4.0", @@ -1205,13 +1197,13 @@ } }, "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", + "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, @@ -1377,11 +1369,6 @@ "util-deprecate": "^1.0.1" } }, - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" - }, "relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -1624,9 +1611,9 @@ "integrity": "sha1-IrD6OkE4WzO+PzMVUbu4N/oM164=" }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } @@ -1800,12 +1787,9 @@ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, "yaml": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.8.3.tgz", - "integrity": "sha512-X/v7VDnK+sxbQ2Imq4Jt2PRUsRsP7UcpSl3Llg6+NRRqWLIvxkMFYtH1FmvwNGYRKKPa+EPA4qDBlI9WVG1UKw==", - "requires": { - "@babel/runtime": "^7.8.7" - } + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==" }, "yargs": { "version": "15.3.1", diff --git a/package.json b/package.json index ecfb296..a13bac1 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": "latest", + "husky": "^4.3.0", "loppo": "latest", "loppo-theme-wangdoc": "^0.4.6" } From 1fb851ba54f080f019b6282eba6fe3156881407e Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年9月15日 21:37:43 +0800 Subject: [PATCH 066/179] refactor: update dependencies --- package-lock.json | 666 +++++++++++----------------------------------- package.json | 2 +- 2 files changed, 156 insertions(+), 512 deletions(-) diff --git a/package-lock.json b/package-lock.json index adeb3be..be3471c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -89,9 +89,9 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "ansi-styles": { "version": "4.2.1", @@ -164,11 +164,6 @@ "upper-case": "^1.1.1" } }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -192,13 +187,13 @@ } }, "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.1.tgz", + "integrity": "sha512-rcvHOWyGyid6I1WjT/3NatKj2kDt9OdSHSXpyLXaMWFbKpGACNW8pRhhdPUq9MWUOdwn8Rz9AVETjF4105rZZQ==", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, "clone": { @@ -206,11 +201,6 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -297,11 +287,6 @@ } } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -322,14 +307,14 @@ }, "dependencies": { "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==" + "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.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", - "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" } } }, @@ -393,6 +378,11 @@ "is-arrayish": "^0.2.1" } }, + "escalade": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.0.tgz", + "integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==" + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -514,9 +504,9 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "gh-pages": { "version": "3.1.0", @@ -581,14 +571,9 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, "highlight.js": { - "version": "9.18.1", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.1.tgz", - "integrity": "sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg==" - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.2.0.tgz", + "integrity": "sha512-OryzPiqqNCfO/wtFo619W+nPYALM6u7iCQkum4bqRmmlcTikOkmlL06i009QelynBPAlNByTQU6cBB2cOBQtCw==" }, "html-minifier": { "version": "4.0.0", @@ -689,43 +674,30 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } + "version": "3.0.0", + "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=" }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -752,49 +724,19 @@ "match-at": "^0.1.0" } }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "^1.0.0" - } - }, "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" }, "linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.2.tgz", + "integrity": "sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==", "requires": { "uc.micro": "^1.0.1" } }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "^1.2.0" - } - } - } - }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -809,99 +751,53 @@ "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" }, "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", "requires": { - "chalk": "^2.4.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } + "chalk": "^4.0.0" } }, "log4js": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.1.2.tgz", - "integrity": "sha512-knS4Y30pC1e0n7rfx3VxcLOdBCsEo0o6/C7PVTGxdVK+5b1TYOSGQPn9FDcrhkoQBV29qwmA2mtkznPAQKnxQg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", + "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", "requires": { "date-format": "^3.0.0", "debug": "^4.1.1", "flatted": "^2.0.1", "rfdc": "^1.1.4", - "streamroller": "^2.2.3" + "streamroller": "^2.2.4" } }, "loppo": { - "version": "0.6.17", - "resolved": "https://registry.npmjs.org/loppo/-/loppo-0.6.17.tgz", - "integrity": "sha512-JwHrSCVkXrTfuYD0nYG1w7ysbFPNMtUeU7z6YdmEARK+1GD5LlS4Cwp7STlSsgRjwxYzzYIq4xv9bPXBXrdESg==", + "version": "0.6.20", + "resolved": "https://registry.npmjs.org/loppo/-/loppo-0.6.20.tgz", + "integrity": "sha512-+b8XgeBKV6BxVBA8E3rX/MTtamLwor0sqlkLeWSkgPhpheT79goM1TRpRwvaxoE3b65hBlIqH2J9Pff6HkFkjw==", "requires": { "connect": "^3.7.0", "debug": "4.x", - "fs-extra": "9.x", + "fs-extra": "^9.0.1", "html-minifier": "4.x", "html-to-text": "5.x", - "js-yaml": "^3.13.1", - "lodash": "^4.17.11", - "log-symbols": "3.x", - "log4js": "6.x", + "js-yaml": "^3.14.0", + "lodash": "^4.17.20", + "log-symbols": "4.x", + "log4js": "^6.3.0", "loppo-theme-oceandeep": "2.x", "promptly": "^3.0.3", "serve-static": "^1.14.1", "tarim": "^0.1.2", - "turpan": "^0.2.9", - "walk-sync": "2.x", + "turpan": "^0.3.0", + "walk-sync": "^2.2.0", "wordcount": "^1.1.1", - "yargs": "15.x" + "yargs": "16.x" }, "dependencies": { "fs-extra": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", - "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -918,6 +814,11 @@ "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", @@ -956,15 +857,22 @@ } }, "markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-11.0.1.tgz", + "integrity": "sha512-aU1TzmBKcWNNYvH9pjq6u92BML+Hz3h5S/QpfTFwiQF852pLT+9qHsrhM9JYipkOXZxGn+sGH8oyJE9FD9WezQ==", "requires": { "argparse": "^1.0.7", - "entities": "~1.1.1", - "linkify-it": "^2.0.0", + "entities": "~2.0.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==" + } } }, "markdown-it-abbr": { @@ -973,14 +881,14 @@ "integrity": "sha1-1mtTZFIcuz3Yqlna37ovtoZcj9g=" }, "markdown-it-container": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-2.0.0.tgz", - "integrity": "sha1-ABm0P9Au7+zi8ZYKKJX7qBpARpU=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-3.0.0.tgz", + "integrity": "sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw==" }, "markdown-it-deflist": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/markdown-it-deflist/-/markdown-it-deflist-2.0.3.tgz", - "integrity": "sha512-/BNZ8ksW42bflm1qQLnRI09oqU2847Z7MVavrR0MORyKLtiUYOMpwtlAfMSZAQU9UCvaUZMpgVAqoS3vpToJxw==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/markdown-it-deflist/-/markdown-it-deflist-2.1.0.tgz", + "integrity": "sha512-3OuqoRUlSxJiuQYu0cWTLHNhhq2xtoSFqsZK8plANg91+RJQU1ziQ6lA2LzmFAEes18uPBsHZpcX6We5l76Nzg==" }, "markdown-it-emoji": { "version": "1.4.0", @@ -993,9 +901,9 @@ "integrity": "sha512-JVW6fCmZWjvMdDQSbOT3nnOQtd9iAXmw7hTSh26+v42BnvXeVyGMDBm5b/EZocMed2MbCAHiTX632vY0FyGB8A==" }, "markdown-it-implicit-figures": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/markdown-it-implicit-figures/-/markdown-it-implicit-figures-0.5.0.tgz", - "integrity": "sha1-x7NZF1hrXTSHNAzeb69geuAB5Tw=" + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/markdown-it-implicit-figures/-/markdown-it-implicit-figures-0.10.0.tgz", + "integrity": "sha512-1TWr6+apyoJvRa4Z7eIolZdeajZCRBcc1ckVXon7XwdL8MfydIWsHnZOS5zRrpUNX5b0/O9giWcmuItSkleK5A==" }, "markdown-it-imsize": { "version": "2.0.1", @@ -1003,9 +911,9 @@ "integrity": "sha1-zKBCeQXQUziiR8ucqdloxc3dUXA=" }, "markdown-it-ins": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-it-ins/-/markdown-it-ins-2.0.0.tgz", - "integrity": "sha1-papqMPHi9x6Ul1Z8/f9A8f3mdIM=" + "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==" }, "markdown-it-katex": { "version": "2.0.3", @@ -1016,9 +924,9 @@ } }, "markdown-it-mark": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-it-mark/-/markdown-it-mark-2.0.0.tgz", - "integrity": "sha1-RqGqlHEFrtgYiXjgoBYXnkBPQsc=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-mark/-/markdown-it-mark-3.0.0.tgz", + "integrity": "sha512-HqMWeKfMMOu4zBO0emmxsoMWmbf2cPKZY1wP6FsTbKmicFfp5y4L3KXAsNeO1rM6NTJVOrNlLKMPjWzriBGspw==" }, "markdown-it-sub": { "version": "1.0.0", @@ -1031,9 +939,9 @@ "integrity": "sha1-y5yf+RpSVawI8/09YyhuFd8KH8M=" }, "markdown-it-task-lists": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/markdown-it-task-lists/-/markdown-it-task-lists-1.4.1.tgz", - "integrity": "sha1-ynurx2pnjhCDfXWpAYP0URK4ewU=" + "version": "2.1.1", + "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", @@ -1098,17 +1006,6 @@ "lower-case": "^1.1.1" } }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, "normalize-url": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", @@ -1120,11 +1017,6 @@ "sort-keys": "^1.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -1151,14 +1043,6 @@ "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==" }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "^1.0.0" - } - }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -1222,11 +1106,6 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -1309,56 +1188,6 @@ "mute-stream": "~0.0.4" } }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "dependencies": { - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - } - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } - } - } - }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -1379,19 +1208,6 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "requires": { - "path-parse": "^1.0.6" - } - }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -1403,14 +1219,9 @@ "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==" }, "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "semver-compare": { "version": "1.0.0", @@ -1475,11 +1286,6 @@ "send": "0.17.1" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", @@ -1503,34 +1309,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -1542,9 +1320,9 @@ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, "streamroller": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.3.tgz", - "integrity": "sha512-AegmvQsscTRhHVO46PhCDerjIpxi7E+d2GxgUDu+nzw/HuLnUdxHWr6WQ+mVn/4iJgMKKFFdiUwFcFRDvcjCtw==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", + "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", "requires": { "date-format": "^2.1.0", "debug": "^4.1.1", @@ -1564,13 +1342,20 @@ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "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==" + } } }, "string_decoder": { @@ -1582,19 +1367,11 @@ } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "^0.2.0" + "ansi-regex": "^5.0.0" } }, "strip-outer": { @@ -1641,50 +1418,28 @@ } }, "turpan": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/turpan/-/turpan-0.2.9.tgz", - "integrity": "sha512-Gex+LpTT42k+ewkA4QtIWYwzaHfW7L0H1FjhArzj2h2bwKqiwZuc6yrShqD0ZP0fDOnTvDrnUcBcZK8MEA4t9g==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/turpan/-/turpan-0.3.0.tgz", + "integrity": "sha512-pFI2Uo4AkalVy+xNuFO8AUW2Ys0ngeQfhBkLrNswBjsX1XLC5r4lgVY2cjeZSDuh9gIZCNYwjKMqvbSPJqT3lw==", "requires": { "clone": "^2.1.1", "github-slugger": "^1.1.1", - "highlight.js": "^9.10.0", - "markdown-it": "^8.3.1", + "highlight.js": "^10.2.0", + "markdown-it": "^11.0.1", "markdown-it-abbr": "^1.0.4", - "markdown-it-container": "^2.0.0", + "markdown-it-container": "^3.0.0", "markdown-it-deflist": "^2.0.1", "markdown-it-emoji": "^1.3.0", "markdown-it-footnote": "^3.0.1", - "markdown-it-implicit-figures": "^0.5.0", + "markdown-it-implicit-figures": "^0.10.0", "markdown-it-imsize": "^2.0.1", - "markdown-it-ins": "^2.0.0", + "markdown-it-ins": "^3.0.0", "markdown-it-katex": "^2.0.3", - "markdown-it-mark": "^2.0.0", + "markdown-it-mark": "^3.0.0", "markdown-it-sub": "^1.0.0", "markdown-it-sup": "^1.0.0", - "markdown-it-task-lists": "^1.4.1", - "yargs": "^7.0.2" - }, - "dependencies": { - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - } - } + "markdown-it-task-lists": "^2.1.1", + "yargs": "^16.0.3" } }, "uc.micro": { @@ -1693,12 +1448,9 @@ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, "uglify-js": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.0.tgz", - "integrity": "sha512-j5wNQBWaql8gr06dOUrfaohHlscboQZ9B8sNsoK5o4sBjm7Ht9dxSbrMXyktQpA16Acaij8AcoozteaPYZON0g==", - "requires": { - "commander": "~2.20.3" - } + "version": "3.10.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.4.tgz", + "integrity": "sha512-kBFT3U4Dcj4/pJ52vfjCSfyLyvG9VYYuGYPmrPvAxRw/i7xHiT4VvCev+uiEMcEEiu6UNB6KgWmGtSUYIWScbw==" }, "universalify": { "version": "0.1.2", @@ -1725,30 +1477,17 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "walk-sync": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/walk-sync/-/walk-sync-2.0.2.tgz", - "integrity": "sha512-dCZkrxfHjPn7tIvdYrX3uMD/R0beVrHpA8lROQ5wWrl8psJgR6xwCkwqTFes0dNujbS2o/ITpvSYgIFsLsf13A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/walk-sync/-/walk-sync-2.2.0.tgz", + "integrity": "sha512-IC8sL7aB4/ZgFcGI2T1LczZeFWZ06b3zoHH7jBPyHxOtIIz1jppWHjjEXkOFvFojBVAK9pV7g47xOZ4LW3QLfg==", "requires": { "@types/minimatch": "^3.0.3", "ensure-posix-path": "^1.1.0", - "matcher-collection": "^2.0.0" + "matcher-collection": "^2.0.0", + "minimatch": "^3.0.4" } }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" - }, "which-pm-runs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", @@ -1768,12 +1507,13 @@ } }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, "wrappy": { @@ -1782,9 +1522,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.1.tgz", + "integrity": "sha512-/jJ831jEs4vGDbYPQp4yGKDYPSCCEQ45uZWJHE1AoYBzqdZi8+LDWas0z4HrmJXmKdpFsTiowSHXdxyFhpmdMg==" }, "yaml": { "version": "1.10.0", @@ -1792,119 +1532,23 @@ "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==" }, "yargs": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", - "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.0.3.tgz", + "integrity": "sha512-6+nLw8xa9uK1BOEOykaiYAJVh6/CjxWXK/q9b5FpRgNslt8s22F2xMBqVIKgCRjNgGvGPBy8Vog7WN7yh4amtA==", + "requires": { + "cliui": "^7.0.0", + "escalade": "^3.0.2", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "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==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "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==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" - }, - "yargs-parser": { - "version": "18.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", - "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + "y18n": "^5.0.1", + "yargs-parser": "^20.0.0" } }, "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "requires": { - "camelcase": "^3.0.0" - } + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.0.0.tgz", + "integrity": "sha512-8eblPHTL7ZWRkyjIZJjnGf+TijiKJSwA24svzLRVvtgoi/RZiKa9fFQTrlx0OKLnyHSdt/enrdadji6WFfESVA==" } } } diff --git a/package.json b/package.json index a13bac1..e2fb260 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "dependencies": { "gh-pages": "^3.1.0", "husky": "^4.3.0", - "loppo": "latest", + "loppo": "^0.6.20", "loppo-theme-wangdoc": "^0.4.6" } } From 3336dabf0d46544a17651deee62e74a257ac2ed9 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年9月23日 19:13:09 +0800 Subject: [PATCH 067/179] docs(events): fix typo --- docs/events/keyboard.md | 4 ++-- docs/events/mouse.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/events/keyboard.md b/docs/events/keyboard.md index 4d689d0..4e33320 100644 --- a/docs/events/keyboard.md +++ b/docs/events/keyboard.md @@ -66,9 +66,9 @@ document.body.addEventListener('keydown', showChar, false); `KeyboardEvent.code`属性返回一个字符串,表示当前按下的键的字符串形式。该属性只读。 -下面是一些常用键的字符串形式,其他键请查[文档](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code#Code_values)。 +下面是一些常用键的字符串形式,其他键请查[文档](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code/code_values)。 -- 数字键0 - 9:返回`digital0` - `digital9` +- 数字键0 - 9:返回`digit0` - `digit9` - 字母键A - z:返回`KeyA` - `KeyZ` - 功能键F1 - F12:返回 `F1` - `F12` - 方向键:返回`ArrowDown`、`ArrowUp`、`ArrowLeft`、`ArrowRight` diff --git a/docs/events/mouse.md b/docs/events/mouse.md index eb1a919..177217d 100644 --- a/docs/events/mouse.md +++ b/docs/events/mouse.md @@ -313,7 +313,7 @@ document.body.addEventListener( ```javascript /* HTML 代码如下 -
+
*/ From 26a4628dbb7e4d366e2cdfbdf881449a5204edbf Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2020年9月26日 10:23:55 +0800 Subject: [PATCH 068/179] 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: 2020年9月27日 16:08:10 +0800 Subject: [PATCH 069/179] 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: 2020年9月27日 18:55:32 +0800 Subject: [PATCH 070/179] 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: 2020年9月27日 19:09:14 +0800 Subject: [PATCH 071/179] 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 072/179] 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 073/179] 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 074/179] 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 075/179] 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 076/179] 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 077/179] 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 078/179] 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: 2020年10月11日 18:53:57 +0800 Subject: [PATCH 079/179] 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: 2020年10月11日 21:43:33 +0800 Subject: [PATCH 080/179] 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: 2020年10月16日 07:56:23 +0800 Subject: [PATCH 081/179] 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: 2020年10月16日 08:01:56 +0800 Subject: [PATCH 082/179] 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: 2020年10月17日 15:20:10 +0800 Subject: [PATCH 083/179] 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: 2020年10月17日 20:10:36 +0800 Subject: [PATCH 084/179] 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: 2020年10月24日 07:28:50 +0800 Subject: [PATCH 085/179] 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: 2020年10月24日 09:28:38 +0800 Subject: [PATCH 086/179] 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: 2020年10月27日 18:34:45 +0800 Subject: [PATCH 087/179] 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: 2020年10月27日 19:05:02 +0800 Subject: [PATCH 088/179] 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 089/179] 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 090/179] 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 091/179] 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 092/179] 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 093/179] 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 094/179] 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 095/179] 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: 2020年12月16日 16:57:01 +0800 Subject: [PATCH 096/179] 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: 2020年12月16日 16:57:55 +0800 Subject: [PATCH 097/179] 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: 2020年12月19日 00:33:10 +0800 Subject: [PATCH 098/179] 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: 2020年12月19日 00:44:37 +0800 Subject: [PATCH 099/179] 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: 2020年12月20日 18:24:23 +0800 Subject: [PATCH 100/179] 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: 2020年12月24日 21:42:34 +0800 Subject: [PATCH 101/179] 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: 2021年1月14日 11:06:11 +0800 Subject: [PATCH 102/179] 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: 2021年1月22日 22:57:03 +0800 Subject: [PATCH 103/179] 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 104/179] =?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: 2021年2月11日 15:47:21 +0800 Subject: [PATCH 105/179] 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: 2021年2月12日 17:28:08 +0800 Subject: [PATCH 106/179] 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: 2021年2月12日 17:37:57 +0800 Subject: [PATCH 107/179] 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: 2021年2月14日 20:42:07 +0800 Subject: [PATCH 108/179] 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: 2021年2月14日 20:46:48 +0800 Subject: [PATCH 109/179] 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: 2021年2月24日 09:05:36 +0800 Subject: [PATCH 110/179] 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: 2021年2月24日 09:06:46 +0800 Subject: [PATCH 111/179] 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 112/179] 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 113/179] 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: 2021年5月12日 00:06:00 +0800 Subject: [PATCH 114/179] 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: 2021年5月12日 00:08:11 +0800 Subject: [PATCH 115/179] 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: 2021年5月15日 10:39:56 +0800 Subject: [PATCH 116/179] 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: 2021年5月15日 18:06:54 +0800 Subject: [PATCH 117/179] 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: 2021年5月15日 18:14:23 +0800 Subject: [PATCH 118/179] =?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: 2021年5月19日 02:54:06 +0800 Subject: [PATCH 119/179] 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: 2021年5月25日 13:31:18 +0800 Subject: [PATCH 120/179] 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: 2021年7月14日 16:26:05 +0800 Subject: [PATCH 121/179] 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: 2021年7月21日 12:41:30 +0800 Subject: [PATCH 122/179] 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 123/179] 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: 2021年8月10日 00:56:10 +0800 Subject: [PATCH 124/179] 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: 2021年8月10日 01:38:06 +0800 Subject: [PATCH 125/179] 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: 2021年8月10日 08:46:14 +0800 Subject: [PATCH 126/179] 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: 2021年8月17日 17:41:01 +0800 Subject: [PATCH 127/179] 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: 2021年8月17日 17:50:00 +0800 Subject: [PATCH 128/179] 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: 2021年8月25日 00:22:23 +0800 Subject: [PATCH 129/179] 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 130/179] 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 131/179] 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 132/179] 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-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: 2021年9月11日 19:43:39 +0800 Subject: [PATCH 133/179] 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: 2021年9月19日 19:42:50 +0800 Subject: [PATCH 134/179] 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: 2021年9月27日 13:00:21 +0800 Subject: [PATCH 135/179] 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 136/179] 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=2015年10月21日 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: 2021年10月28日 19:08:55 +0800 Subject: [PATCH 137/179] 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: 2021年10月29日 08:05:50 +0800 Subject: [PATCH 138/179] 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 139/179] 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 140/179] 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 141/179] 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 142/179] =?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 143/179] 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`实例,代表绑定当前``节点的`
...
-document.getElementById('myDiv').scrollHeight // 356 +//
...
+document.getElementById('myDiv').scrollHeight // 200 ``` 上面代码中,即使`myDiv`元素的 CSS 高度只有200像素,且溢出部分不可见,但是`scrollHeight`仍然会返回该元素的原始高度。 From d9420c305423feb7f1ae8dd70fd4fd95ab7b76e1 Mon Sep 17 00:00:00 2001 From: Enoch Gao Date: Tue, 9 Jan 2024 09:34:09 +0800 Subject: [PATCH 161/179] =?UTF-8?q?fix:=20=E5=AF=B9=E9=BD=903.1observe()?= =?UTF-8?q?=E6=A1=88=E4=BE=8B=E4=BB=A3=E7=A0=81=20(#267)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 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 ace5853..0715565 100644 --- a/docs/dom/mutationobserver.md +++ b/docs/dom/mutationobserver.md @@ -44,7 +44,7 @@ var observer = new MutationObserver(function (mutations, observer) { ```javascript var article = document.querySelector('article'); -var options = { +var options = { 'childList': true, 'attributes':true } ; From d77ebe841af28628c8d3c85d967b89e225ce05b5 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sat, 3 Feb 2024 12:53:55 +0800 Subject: [PATCH 162/179] docs(bom/same-origin): fix error --- docs/bom/same-origin.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/bom/same-origin.md b/docs/bom/same-origin.md index 50577ce..4a11a0b 100644 --- a/docs/bom/same-origin.md +++ b/docs/bom/same-origin.md @@ -194,7 +194,7 @@ window.addEventListener('message', function (e) { `message`事件的参数是事件对象`event`,提供以下三个属性。 > - `event.source`:发送消息的窗口 -> - `event.origin`: 消息发向的网址 +> - `event.origin`: 消息发送者的源(origin),即协议、域名、端口。 > - `event.data`: 消息内容 下面的例子是,子窗口通过`event.source`属性引用父窗口,然后发送消息。 @@ -208,7 +208,7 @@ function receiveMessage(event) { 上面代码有几个地方需要注意。首先,`receiveMessage`函数里面没有过滤信息的来源,任意网址发来的信息都会被处理。其次,`postMessage`方法中指定的目标窗口的网址是一个星号,表示该信息可以向任意网址发送。通常来说,这两种做法是不推荐的,因为不够安全,可能会被恶意利用。 -`event.origin`属性可以过滤不是发给本窗口的消息。 +`event.origin`属性可以过滤非许可地址发来的消息。 ```javascript window.addEventListener('message', receiveMessage); From a13288616e6f8409d9f1575db3707b2b524793d5 Mon Sep 17 00:00:00 2001 From: Enoch Gao Date: Sun, 4 Feb 2024 19:05:08 +0800 Subject: [PATCH 163/179] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=94=99=E8=AF=AF=20(#268)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/stdlib/object.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/stdlib/object.md b/docs/stdlib/object.md index 51ba1e6..24b44ca 100644 --- a/docs/stdlib/object.md +++ b/docs/stdlib/object.md @@ -308,7 +308,7 @@ var obj = {}; obj.toString() // "[object Object]" ``` -上面代码调用空对象的`toString`方法,结果返回一个字符串`object Object`,其中第二个`Object`表示该值的构造函数。这是一个十分有用的判断数据类型的方法。 +上面代码调用空对象的`toString`方法,结果返回一个字符串`[object Object]`,其中第二个`Object`表示该值的构造函数。这是一个十分有用的判断数据类型的方法。 由于实例对象可能会自定义`toString`方法,覆盖掉`Object.prototype.toString`方法,所以为了得到类型字符串,最好直接使用`Object.prototype.toString`方法。通过函数的`call`方法,可以在任意值上调用这个方法,帮助我们判断这个值的类型。 From 3a7a19ac749d9e7a08f88d4566c01c9c9c31e269 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2024年2月24日 23:36:43 +0800 Subject: [PATCH 164/179] docs(stdlib/date): fixed #269 --- docs/stdlib/date.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/stdlib/date.md b/docs/stdlib/date.md index a44b2c8..d0475da 100644 --- a/docs/stdlib/date.md +++ b/docs/stdlib/date.md @@ -317,15 +317,15 @@ d.toTimeString() // "00:00:00 GMT+0800 (CST)" var d = new Date(2013, 0, 1); d.toLocaleString() -// 中文版浏览器为"2013年1月1日 上午12:00:00" +// 中文版浏览器为"2013/1/1 00:00:00" // 英文版浏览器为"1/1/2013 12:00:00 AM" d.toLocaleDateString() -// 中文版浏览器为"2013年1月1日" +// 中文版浏览器为"2013/1/1" // 英文版浏览器为"1/1/2013" d.toLocaleTimeString() -// 中文版浏览器为"上午12:00:00" +// 中文版浏览器为"00:00:00" // 英文版浏览器为"12:00:00 AM" ``` @@ -343,13 +343,13 @@ dateObj.toLocaleTimeString([locales[, options]]) var d = new Date(2013, 0, 1); d.toLocaleString('en-US') // "1/1/2013, 12:00:00 AM" -d.toLocaleString('zh-CN') // "2013/1/1 上午12:00:00" +d.toLocaleString('zh-CN') // "2013/1/1 00:00:00" d.toLocaleDateString('en-US') // "1/1/2013" d.toLocaleDateString('zh-CN') // "2013/1/1" d.toLocaleTimeString('en-US') // "12:00:00 AM" -d.toLocaleTimeString('zh-CN') // "上午12:00:00" +d.toLocaleTimeString('zh-CN') // "00:00:00" ``` `options`配置对象有以下属性。 From 7070f24255dc5c093652368698b409e04e6380ae Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2024年4月19日 22:01:55 +0800 Subject: [PATCH 165/179] docs(types/number): fixed #270 --- docs/types/number.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/types/number.md b/docs/types/number.md index b61dc6a..bb9c1b0 100644 --- a/docs/types/number.md +++ b/docs/types/number.md @@ -43,7 +43,7 @@ JavaScript 内部,所有数字都是以64位浮点数形式储存,即使整 上面公式是正常情况下(指数部分在0到2047之间),一个数在 JavaScript 内部实际的表示形式。 -精度最多只能到53个二进制位,这意味着,绝对值小于2的53次方的整数,即-253到253,都可以精确表示。 +精度最多只能到53个二进制位,这意味着,绝对值小于2的53次方的整数,即-253 + 1 到 253 - 1,都可以精确表示。 ```javascript Math.pow(2, 53) From 83aea13cd3626db7ca14f65e42224b5cca3cfa02 Mon Sep 17 00:00:00 2001 From: cogic <72649343+cogic@users.noreply.github.com> Date: 2024年4月22日 23:25:03 +0800 Subject: [PATCH 166/179] docs(dom): fix text (#271) --- docs/dom/document.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/dom/document.md b/docs/dom/document.md index 3eb1d02..c3be770 100644 --- a/docs/dom/document.md +++ b/docs/dom/document.md @@ -363,7 +363,7 @@ document.replaceChild( ); ``` -上面代码中,第一步生成一个新的 HTML 文档`doc`,然后用它的根元素`document.documentElement`替换掉`document.documentElement`。这会使得当前文档的内容全部消失,变成`hello world`。 +上面代码中,第一步生成一个新的 HTML 文档`doc`,然后用它的根元素`doc.documentElement`替换掉`document.documentElement`。这会使得当前文档的内容全部消失,变成`hello world`。 ## 方法 @@ -716,7 +716,7 @@ var element = document.getElementById('ul'); element.appendChild(docfrag); ``` -上面代码中,文档片断`docfrag`包含四个`
  • `节点,这些子节点被一次性插入了当前文档。 +上面代码中,文档片段`docfrag`包含四个`
  • `节点,这些子节点被一次性插入了当前文档。 ### document.createEvent() From 2092d3b237de79db450718dc985222642b91bee2 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2024年4月24日 16:59:12 +0800 Subject: [PATCH 167/179] docs(dom/css): fixed #272 --- docs/dom/css.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/dom/css.md b/docs/dom/css.md index 5a1d39a..b8ac695 100644 --- a/docs/dom/css.md +++ b/docs/dom/css.md @@ -292,7 +292,7 @@ CSS.supports('display: table-cell;') // false 行内样式(inline style)具有最高的优先级,改变行内样式,通常会立即反映出来。但是,网页元素最终的样式是综合各种规则计算出来的。因此,如果想得到元素实际的样式,只读取行内样式是不够的,需要得到浏览器最终计算出来的样式规则。 -`window.getComputedStyle`方法,就用来返回浏览器计算后得到的最终规则。它接受一个节点对象作为参数,返回一个 CSSStyleDeclaration 实例,包含了指定节点的最终样式信息。所谓"最终样式信息",指的是各种 CSS 规则叠加后的结果。 +`window.getComputedStyle()`方法,就用来返回浏览器计算后得到的最终规则。它接受一个节点对象作为参数,返回一个 CSSStyleDeclaration 实例,包含了指定节点的最终样式信息。所谓"最终样式信息",指的是各种 CSS 规则叠加后的结果。 ```javascript var div = document.querySelector('div'); @@ -328,7 +328,7 @@ var height = styleObj.getPropertyValue('height'); - CSSStyleDeclaration 实例返回的 CSS 值都是绝对单位。比如,长度都是像素单位(返回值包括`px`后缀),颜色是`rgb(#, #, #)`或`rgba(#, #, #, #)`格式。 - CSS 规则的简写形式无效。比如,想读取`margin`属性的值,不能直接读,只能读`marginLeft`、`marginTop`等属性;再比如,`font`属性也是不能直接读的,只能读`font-size`等单个属性。 - 如果读取 CSS 原始的属性名,要用方括号运算符,比如`styleObj['z-index']`;如果读取骆驼拼写法的 CSS 属性名,可以直接读取`styleObj.zIndex`。 -- 该方法返回的 CSSStyleDeclaration 实例的`cssText`属性无效,返回`undefined`。 +- 该方法返回的 CSSStyleDeclaration 实例的`cssText`属性总是返回空字符串。 ## CSS 伪元素 From eefffcf3ce979fe6a0cd9c94ad84425a48022b8e Mon Sep 17 00:00:00 2001 From: cogic <72649343+cogic@users.noreply.github.com> Date: 2024年4月25日 15:02:47 +0800 Subject: [PATCH 168/179] docs(dom/css): fix text (#273) --- docs/dom/css.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/dom/css.md b/docs/dom/css.md index b8ac695..b4f1a2d 100644 --- a/docs/dom/css.md +++ b/docs/dom/css.md @@ -401,9 +401,9 @@ myStyleSheet instanceof StyleSheet // true 注意,`disabled`属性只能在 JavaScript 脚本中设置,不能在 HTML 语句中设置。 -**(2)Stylesheet.href** +**(2)StyleSheet.href** -`Stylesheet.href`返回样式表的网址。对于内嵌样式表,该属性返回`null`。该属性只读。 +`StyleSheet.href`返回样式表的网址。对于内嵌样式表,该属性返回`null`。该属性只读。 ```javascript document.styleSheets[0].href From 2f55be82dc7f810ca220c44b02606656868c4d39 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sat, 4 May 2024 12:03:27 +0800 Subject: [PATCH 169/179] docs(dom/document): fixed #274 --- docs/dom/document.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/dom/document.md b/docs/dom/document.md index c3be770..7af7f3a 100644 --- a/docs/dom/document.md +++ b/docs/dom/document.md @@ -69,7 +69,10 @@ document.scrollingElement.scrollTop = 0; `document.fullscreenElement`属性返回当前以全屏状态展示的 DOM 元素。如果不是全屏状态,该属性返回`null`。 ```javascript -if (document.fullscreenElement.nodeName == 'VIDEO') { +if ( + document.fullscreenElement && + document.fullscreenElement.nodeName == 'VIDEO' +) { console.log('全屏播放视频'); } ``` From 370bb5f9ea17a168fdcc9dc6da230e07e5584aed Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sun, 9 Jun 2024 16:40:57 +0800 Subject: [PATCH 170/179] refactor: update dependencies --- package.json | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index f9e429a..6f29bac 100644 --- a/package.json +++ b/package.json @@ -14,11 +14,6 @@ "server": "loppo server", "test": "echo \"Error: no test specified\" && exit 1" }, - "husky": { - "hooks": { - "pre-push": "npm update" - } - }, "repository": { "type": "git", "url": "git+https://github.com/wangdoc/javascript-tutorial.git" @@ -35,9 +30,8 @@ }, "homepage": "https://github.com/wangdoc/javascript-tutorial", "dependencies": { - "gh-pages": "5.x", - "husky": "^4.3.8", + "gh-pages": "6.x", "loppo": "^0.6.24", - "loppo-theme-wangdoc": "^0.6.1" + "loppo-theme-wangdoc": "^0.7.1" } } From 56a50937db811cbfda8c3a4725e59cc6a5e4f782 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sun, 9 Jun 2024 16:45:42 +0800 Subject: [PATCH 171/179] refactor: update github action script --- .github/workflows/wangdoc.yml | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/.github/workflows/wangdoc.yml b/.github/workflows/wangdoc.yml index 80f8bfe..c3e5cbe 100644 --- a/.github/workflows/wangdoc.yml +++ b/.github/workflows/wangdoc.yml @@ -10,28 +10,27 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: persist-credentials: false - name: Setup Node.js - uses: actions/setup-node@main + uses: actions/setup-node@v4 with: - node-version: '14' + node-version: 'latest' - 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 + uses: JamesIves/github-pages-deploy-action@v4 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 + git-config-name: wangdoc-bot + git-config-email: yifeng.ruan@gmail.com + repository-name: wangdoc/website + token: ${{ secrets.WANGDOC_BOT_TOKEN }} + 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 From 5aa689b301aae830a6315123334b66763a12f50c Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2024年6月24日 14:04:54 +0800 Subject: [PATCH 172/179] docs(bom/window): fixed #277 --- 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 a012d61..a873fae 100644 --- a/docs/bom/window.md +++ b/docs/bom/window.md @@ -579,7 +579,7 @@ var start = null; function step(timestamp) { if (!start) start = timestamp; var progress = timestamp - start; - // 元素不断向左移,最大不超过200像素 + // 元素不断向右移,最大不超过200像素 element.style.left = Math.min(progress / 10, 200) + 'px'; // 如果距离第一次执行不超过 2000 毫秒, // 就继续执行动画 From 200b44e6d98e73e71595452d72b24a7d201ee50b Mon Sep 17 00:00:00 2001 From: ruanyf Date: Thu, 4 Jul 2024 19:30:11 +0800 Subject: [PATCH 173/179] docs(oop/this): fixed #279 --- docs/oop/this.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/oop/this.md b/docs/oop/this.md index 6668047..1913fe3 100644 --- a/docs/oop/this.md +++ b/docs/oop/this.md @@ -679,19 +679,19 @@ Array.prototype.slice.apply({length: 1}) // [undefined] 前面的按钮点击事件的例子,可以改写如下。 ```javascript -var o = new Object(); +var obj = new Object(); -o.f = function () { - console.log(this === o); +var func = function () { + console.log(this === obj); } -var f = function (){ - o.f.apply(o); - // 或者 o.f.call(o); +var handler = function (){ + func.apply(obj); + // 或者 f.call(obj); }; // jQuery 的写法 -$('#button').on('click', f); +$('#button').on('click', handler); ``` 上面代码中,点击按钮以后,控制台将会显示`true`。由于`apply()`方法(或者`call()`方法)不仅绑定函数执行时所在的对象,还会立即执行函数,因此不得不把绑定语句写在一个函数体内。更简洁的写法是采用下面介绍的`bind()`方法。 From 1df4272d579f407add746ecf73ff6a664e500364 Mon Sep 17 00:00:00 2001 From: Linho Date: 2024年9月24日 17:22:49 +0800 Subject: [PATCH 174/179] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E5=BC=95=E5=8F=B7=20?= =?UTF-8?q?(#282)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 统一引号 * 统一引号 --- docs/types/null-undefined-boolean.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/types/null-undefined-boolean.md b/docs/types/null-undefined-boolean.md index 9a76679..129dda3 100644 --- a/docs/types/null-undefined-boolean.md +++ b/docs/types/null-undefined-boolean.md @@ -35,7 +35,7 @@ undefined == null 既然含义与用法都差不多,为什么要同时设置两个这样的值,这不是无端增加复杂度,令初学者困扰吗?这与历史原因有关。 -1995年 JavaScript 诞生时,最初像 Java 一样,只设置了`null`表示"无"。根据 C 语言的传统,`null`可以自动转为`0`。 +1995年 JavaScript 诞生时,最初像 Java 一样,只设置了`null`表示"无"。根据 C 语言的传统,`null`可以自动转为`0`。 ```javascript Number(null) // 0 @@ -46,7 +46,7 @@ Number(null) // 0 但是,JavaScript 的设计者 Brendan Eich,觉得这样做还不够。首先,第一版的 JavaScript 里面,`null`就像在 Java 里一样,被当成一个对象,Brendan Eich 觉得表示"无"的值最好不是对象。其次,那时的 JavaScript 不包括错误处理机制,Brendan Eich 觉得,如果`null`自动转为0,很不容易发现错误。 -因此,他又设计了一个`undefined`。区别是这样的:`null`是一个表示"空"的对象,转为数值时为`0`;`undefined`是一个表示"此处无定义"的原始值,转为数值时为`NaN`。 +因此,他又设计了一个`undefined`。区别是这样的:`null`是一个表示"空"的对象,转为数值时为`0`;`undefined`是一个表示"此处无定义"的原始值,转为数值时为`NaN`。 ```javascript Number(undefined) // NaN From 5f4a988c6087dcfd0785f9443d0a8e2db54c9f65 Mon Sep 17 00:00:00 2001 From: Linho Date: 2024年9月24日 22:04:45 +0800 Subject: [PATCH 175/179] =?UTF-8?q?=E8=A1=A5=E5=85=85=20NaN=20=E8=BF=90?= =?UTF-8?q?=E7=AE=97=E8=A7=84=E5=88=99=20(#283)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/types/number.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/types/number.md b/docs/types/number.md index bb9c1b0..53ebfb5 100644 --- a/docs/types/number.md +++ b/docs/types/number.md @@ -280,6 +280,12 @@ NaN * 32 // NaN NaN / 32 // NaN ``` +但是,ES6 引入指数运算符(`**`)后,出现了一个例外。 + +```javascript +NaN ** 0 // 1 +``` + ### Infinity **(1)含义** From 79dcc9bc1799e3a432b0251e12ee07a4ef9727d6 Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2024年9月25日 17:08:58 +0800 Subject: [PATCH 176/179] style: force update theme --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6f29bac..479b7bb 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,6 @@ "dependencies": { "gh-pages": "6.x", "loppo": "^0.6.24", - "loppo-theme-wangdoc": "^0.7.1" + "loppo-theme-wangdoc": "^0.7.3" } } From 2500a083ca4b38d0db357cebd8effe3090208bf0 Mon Sep 17 00:00:00 2001 From: Enoch Gao Date: 2024年12月10日 07:21:34 +0800 Subject: [PATCH 177/179] =?UTF-8?q?fix(docs):=206.2=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E9=94=99=E8=AF=AF=20(#287)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/oop/this.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/oop/this.md b/docs/oop/this.md index 1913fe3..6792c30 100644 --- a/docs/oop/this.md +++ b/docs/oop/this.md @@ -687,7 +687,7 @@ var func = function () { var handler = function (){ func.apply(obj); - // 或者 f.call(obj); + // 或者 func.call(obj); }; // jQuery 的写法 From e4622c26cc36dea67db450f7af2705aee63c5c4a Mon Sep 17 00:00:00 2001 From: ruanyf Date: 2024年12月25日 10:09:38 +0800 Subject: [PATCH 178/179] docs(oop/strict): fixed typo --- docs/oop/strict.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/oop/strict.md b/docs/oop/strict.md index 341f757..cc339c8 100644 --- a/docs/oop/strict.md +++ b/docs/oop/strict.md @@ -108,7 +108,7 @@ function notStrict() { ```javascript // 对只读属性赋值会报错 'use strict'; -Object.defineProperty({}, 'a', { +var obj = Object.defineProperty({}, 'a', { value: 37, writable: false }); From a428ce98018c97fc5880c8b553e9218f1936f14a Mon Sep 17 00:00:00 2001 From: Enoch Gao Date: 2025年9月30日 12:52:05 +0800 Subject: [PATCH 179/179] =?UTF-8?q?fix(docs):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=BC=95=E7=94=A8=E7=AB=A0=E8=8A=82=E5=90=8D=E7=A7=B0=E9=94=99?= =?UTF-8?q?=E8=AF=AF=EF=BC=8C=E9=81=BF=E5=85=8D=E9=98=85=E8=AF=BB=E6=A8=A1?= =?UTF-8?q?=E7=B3=8A=E4=B8=8D=E6=B8=85=20(#291)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/stdlib/object.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/stdlib/object.md b/docs/stdlib/object.md index 24b44ca..783175c 100644 --- a/docs/stdlib/object.md +++ b/docs/stdlib/object.md @@ -56,7 +56,7 @@ obj instanceof Object // true `instanceof`运算符用来验证,一个对象是否为指定的构造函数的实例。`obj instanceof Object`返回`true`,就表示`obj`对象是`Object`的实例。 -如果参数是原始类型的值,`Object`方法将其转为对应的包装对象的实例(参见《原始类型的包装对象》一章)。 +如果参数是原始类型的值,`Object`方法将其转为对应的包装对象的实例(参见《包装对象》一章)。 ```javascript var obj = Object(1); @@ -156,7 +156,7 @@ var obj = { Object.getOwnPropertyNames(obj) // ["p1", "p2"] ``` -对于一般的对象来说,`Object.keys()`和`Object.getOwnPropertyNames()`返回的结果是一样的。只有涉及不可枚举属性时,才会有不一样的结果。`Object.keys`方法只返回可枚举的属性(详见《对象属性的描述对象》一章),`Object.getOwnPropertyNames`方法还返回不可枚举的属性名。 +对于一般的对象来说,`Object.keys()`和`Object.getOwnPropertyNames()`返回的结果是一样的。只有涉及不可枚举属性时,才会有不一样的结果。`Object.keys`方法只返回可枚举的属性(详见《属性描述对象》一章),`Object.getOwnPropertyNames`方法还返回不可枚举的属性名。 ```javascript var a = ['Hello', 'World']; @@ -231,7 +231,7 @@ obj.valueOf() === obj // true 上面代码比较`obj.valueOf()`与`obj`本身,两者是一样的。 -`valueOf`方法的主要用途是,JavaScript 自动类型转换时会默认调用这个方法(详见《数据类型转换》一章)。 +`valueOf`方法的主要用途是,JavaScript 自动类型转换时会默认调用这个方法(详见《数据类型的转换》一章)。 ```javascript var obj = new Object();
  • AltStyle によって変換されたページ (->オリジナル) /