From ad7cd2ba990f0d18aa6fa08a310f1c64d04535cd Mon Sep 17 00:00:00 2001 From: yuri Date: Tue, 7 Jun 2022 15:04:25 +0800 Subject: [PATCH 01/33] Update number.md (#247) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit parseFloat参数不是字符串会先进行隐式类型转换 --- docs/types/number.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/types/number.md b/docs/types/number.md index 64f0592..b61dc6a 100644 --- a/docs/types/number.md +++ b/docs/types/number.md @@ -552,7 +552,15 @@ parseFloat('3.14more non-digit characters') // 3.14 parseFloat('\t\v\r12.34\n ') // 12.34 ``` -如果参数不是字符串,或者字符串的第一个字符不能转化为浮点数,则返回`NaN`。 +如果参数不是字符串,则会先转为字符串再转换。 + +```javascript +parseFloat([1.23]) // 1.23 +// 等同于 +parseFloat(String([1.23])) // 1.23 +``` + +如果字符串的第一个字符不能转化为浮点数,则返回`NaN`。 ```javascript parseFloat([]) // NaN From 87ce3dc5adee2b3caa7b9ec798957f0e98f2b697 Mon Sep 17 00:00:00 2001 From: IKKI2000 Date: Thu, 30 Jun 2022 13:13:38 +0800 Subject: [PATCH 02/33] Update regexp.md (#249) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补全 3.1 示例代码返回值~ --- 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 8e306e0..cc0f002 100644 --- a/docs/stdlib/regexp.md +++ b/docs/stdlib/regexp.md @@ -104,7 +104,7 @@ r.lastIndex = 4; r.test(s) // false r.lastIndex // 0 -r.test(s) +r.test(s) // true ``` 上面代码指定从字符串的第五个位置开始搜索,这个位置为空,所以返回`false`。同时,`lastIndex`属性重置为`0`,所以第二次执行`r.test(s)`会返回`true`。 From 91b5581574ee490bd0cbfde91aa1d06db42ba8d7 Mon Sep 17 00:00:00 2001 From: IKKI2000 Date: Thu, 30 Jun 2022 13:14:56 +0800 Subject: [PATCH 03/33] Update date.md (#250) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补全 5.4 设置毫秒方法的参数~ --- 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 2b0326e..a44b2c8 100644 --- a/docs/stdlib/date.md +++ b/docs/stdlib/date.md @@ -479,7 +479,7 @@ d.getUTCDate() // 5 - `setDate(date)`:设置实例对象对应的每个月的几号(1-31),返回改变后毫秒时间戳。 - `setFullYear(year [, month, date])`:设置四位年份。 - `setHours(hour [, min, sec, ms])`:设置小时(0-23)。 -- `setMilliseconds()`:设置毫秒(0-999)。 +- `setMilliseconds(ms)`:设置毫秒(0-999)。 - `setMinutes(min [, sec, ms])`:设置分钟(0-59)。 - `setMonth(month [, date])`:设置月份(0-11)。 - `setSeconds(sec [, ms])`:设置秒(0-59)。 From 6eeecbf37e054517b6f4f0d23fdb597c6ff7f5e5 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Wed, 16 Nov 2022 13:17:54 +0800 Subject: [PATCH 04/33] docs(basic/grammar): fix typo #253 --- 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 b1ebde1..b0dea02 100644 --- a/docs/basic/grammar.md +++ b/docs/basic/grammar.md @@ -485,7 +485,7 @@ var msg = '数字' + n + '是' + (n % 2 === 0 ? '偶数' : '奇数'); ### while 循环 -`While`语句包括一个循环条件和一段代码块,只要条件为真,就不断循环执行代码块。 +`while`语句包括一个循环条件和一段代码块,只要条件为真,就不断循环执行代码块。 ```javascript while (条件) From eeb6d159235230468c5e05053fb630406d8bb1f5 Mon Sep 17 00:00:00 2001 From: Hencky <40154205+Hencky@users.noreply.github.com> Date: Wed, 28 Dec 2022 22:43:11 +0800 Subject: [PATCH 05/33] =?UTF-8?q?fix:=20=E8=BF=90=E7=AE=97=E7=AC=A6/?= =?UTF-8?q?=E6=AF=94=E8=BE=83=E8=BF=90=E7=AE=97=E7=AC=A6=20=E6=96=87?= =?UTF-8?q?=E6=A1=88=E9=94=99=E8=AF=AF=20(#254)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/operators/comparison.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/operators/comparison.md b/docs/operators/comparison.md index 3f34eca..1355039 100644 --- a/docs/operators/comparison.md +++ b/docs/operators/comparison.md @@ -99,7 +99,7 @@ x > '11' // true x.valueOf = function () { return '1' }; x > '11' // false -// 等同于 [2].valueOf() > '11' +// 等同于 (function () { return '1' })() > '11' // 即 '1' > '11' ``` @@ -115,7 +115,7 @@ x > '11' // false // 即 '2' > '11' { x: 2 } >= { x: 1 } // true -// 等同于 { x: 2 }.valueOf().toString() >= { x: 1 }.valueOf().toString() +// 等同于 ({ x: 2 }).valueOf().toString() >= ({ x: 1 }).valueOf().toString() // 即 '[object Object]' >= '[object Object]' ``` From 2e3f11bdb95836fbff1c897995e0b06b4d3aab30 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Thu, 2 Feb 2023 17:43:53 +0800 Subject: [PATCH 06/33] docs(operator/comparison): fix text --- 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 1355039..002254a 100644 --- a/docs/operators/comparison.md +++ b/docs/operators/comparison.md @@ -114,7 +114,7 @@ x > '11' // false // 等同于 [2].valueOf().toString() > [11].valueOf().toString() // 即 '2' > '11' -{ x: 2 } >= { x: 1 } // true +({ x: 2 }) >= ({ x: 1 }) // true // 等同于 ({ x: 2 }).valueOf().toString() >= ({ x: 1 }).valueOf().toString() // 即 '[object Object]' >= '[object Object]' ``` From 6dc6fb5e4a2a2bf2c67fed65abe6099d276d57da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E7=A5=A5=5F=E6=88=90=E9=83=BD?= <1334196450@qq.com> Date: Sat, 4 Feb 2023 10:34:02 +0800 Subject: [PATCH 07/33] Update cookie.md (#255) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit cookie中domain的值中是不能加*号的 --- docs/bom/cookie.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/bom/cookie.md b/docs/bom/cookie.md index 80c542c..a6b49a6 100644 --- a/docs/bom/cookie.md +++ b/docs/bom/cookie.md @@ -352,7 +352,7 @@ document.cookie = "foo=bar; expires=Fri, 31 Dec 2020 23:59:59 GMT"; document.cookie = 'fontSize=14; ' + 'expires=' + someDate.toGMTString() + '; ' + 'path=/subdirectory; ' - + 'domain=*.example.com'; + + 'domain=.example.com'; ``` Cookie 的属性一旦设置完成,就没有办法读取这些属性的值。 From 133c2d45e787f0e7425a0e44f2c6c469d08c839a Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sat, 4 Feb 2023 10:39:47 +0800 Subject: [PATCH 08/33] docs(bom/cookie): edit set-cookie's domain property --- docs/bom/cookie.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/bom/cookie.md b/docs/bom/cookie.md index a6b49a6..e0ae045 100644 --- a/docs/bom/cookie.md +++ b/docs/bom/cookie.md @@ -342,7 +342,7 @@ document.cookie = "foo=bar; expires=Fri, 31 Dec 2020 23:59:59 GMT"; 各个属性的写入注意点如下。 - `path`属性必须为绝对路径,默认为当前路径。 -- `domain`属性值必须是当前发送 Cookie 的域名的一部分。比如,当前域名是`example.com`,就不能将其设为`foo.com`。该属性默认为当前的一级域名(不含二级域名)。 +- `domain`属性值必须是当前发送 Cookie 的域名的一部分。比如,当前域名是`example.com`,就不能将其设为`foo.com`。该属性默认为当前的一级域名(不含二级域名)。如果显式设置该属性,则该域名的任意子域名也可以读取 Cookie。 - `max-age`属性的值为秒数。 - `expires`属性的值为 UTC 格式,可以使用`Date.prototype.toUTCString()`进行日期格式转换。 @@ -352,9 +352,11 @@ document.cookie = "foo=bar; expires=Fri, 31 Dec 2020 23:59:59 GMT"; document.cookie = 'fontSize=14; ' + 'expires=' + someDate.toGMTString() + '; ' + 'path=/subdirectory; ' - + 'domain=.example.com'; + + 'domain=example.com'; ``` +注意,上面的`domain`属性,以前的写法是`.example.com`,表示子域名也可以读取该 Cookie,新的写法可以省略前面的点。 + Cookie 的属性一旦设置完成,就没有办法读取这些属性的值。 删除一个现存 Cookie 的唯一方法,是设置它的`expires`属性为一个过去的日期。 From 482a5170651b5efc1f5d9e408cb4cc138056d082 Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Sun, 12 Feb 2023 23:13:20 +0800 Subject: [PATCH 09/33] fix translation about cross-origin (#256) --- docs/bom/cors.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/bom/cors.md b/docs/bom/cors.md index 23dfac9..566e1f0 100644 --- a/docs/bom/cors.md +++ b/docs/bom/cors.md @@ -1,12 +1,12 @@ # CORS 通信 -CORS 是一个 W3C 标准,全称是“跨域资源共享”(Cross-origin resource sharing)。它允许浏览器向跨域的服务器,发出`XMLHttpRequest`请求,从而克服了 AJAX 只能同源使用的限制。 +CORS 是一个 W3C 标准,全称是“跨源资源共享”(Cross-origin resource sharing),或者通俗地称为“跨域资源共享”。它允许浏览器向跨源的服务器,发出`XMLHttpRequest`请求,从而克服了 AJAX 只能同源使用的限制。 ## 简介 CORS 需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能。 -整个 CORS 通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS 通信与普通的 AJAX 通信没有差别,代码完全一样。浏览器一旦发现 AJAX 请求跨域,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感知。因此,实现 CORS 通信的关键是服务器。只要服务器实现了 CORS 接口,就可以跨域通信。 +整个 CORS 通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS 通信与普通的 AJAX 通信没有差别,代码完全一样。浏览器一旦发现 AJAX 请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感知。因此,实现 CORS 通信的关键是服务器。只要服务器实现了 CORS 接口,就可以跨源通信。 ## 两种请求 @@ -30,7 +30,7 @@ CORS 请求分成两类:简单请求(simple request)和非简单请求(n 凡是不同时满足上面两个条件,就属于非简单请求。一句话,简单请求就是简单的 HTTP 方法与简单的 HTTP 头信息的结合。 -这样划分的原因是,表单在历史上一直可以跨域发出请求。简单请求就是表单请求,浏览器沿袭了传统的处理方式,不把行为复杂化,否则开发者可能转而使用表单,规避 CORS 的限制。对于非简单请求,浏览器会采用新的处理方式。 +这样划分的原因是,表单在历史上一直可以跨源发出请求。简单请求就是表单请求,浏览器沿袭了传统的处理方式,不把行为复杂化,否则开发者可能转而使用表单,规避 CORS 的限制。对于非简单请求,浏览器会采用新的处理方式。 ## 简单请求 @@ -38,7 +38,7 @@ CORS 请求分成两类:简单请求(simple request)和非简单请求(n 对于简单请求,浏览器直接发出 CORS 请求。具体来说,就是在头信息之中,增加一个`Origin`字段。 -下面是一个例子,浏览器发现这次跨域 AJAX 请求是简单请求,就自动在头信息之中,添加一个`Origin`字段。 +下面是一个例子,浏览器发现这次跨源 AJAX 请求是简单请求,就自动在头信息之中,添加一个`Origin`字段。 ```http GET /cors HTTP/1.1 @@ -99,7 +99,7 @@ xhr.withCredentials = true; xhr.withCredentials = false; ``` -需要注意的是,如果服务器要求浏览器发送 Cookie,`Access-Control-Allow-Origin`就不能设为星号,必须指定明确的、与请求网页一致的域名。同时,Cookie 依然遵循同源政策,只有用服务器域名设置的 Cookie 才会上传,其他域名的 Cookie 并不会上传,且(跨域)原网页代码中的`document.cookie`也无法读取服务器域名下的 Cookie。 +需要注意的是,如果服务器要求浏览器发送 Cookie,`Access-Control-Allow-Origin`就不能设为星号,必须指定明确的、与请求网页一致的域名。同时,Cookie 依然遵循同源政策,只有用服务器域名设置的 Cookie 才会上传,其他域名的 Cookie 并不会上传,且(跨源)原网页代码中的`document.cookie`也无法读取服务器域名下的 Cookie。 ## 非简单请求 @@ -107,7 +107,7 @@ xhr.withCredentials = false; 非简单请求是那种对服务器提出特殊要求的请求,比如请求方法是`PUT`或`DELETE`,或者`Content-Type`字段的类型是`application/json`。 -非简单请求的 CORS 请求,会在正式通信之前,增加一次 HTTP 查询请求,称为“预检”请求(preflight)。浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些 HTTP 方法和头信息字段。只有得到肯定答复,浏览器才会发出正式的`XMLHttpRequest`请求,否则就报错。这是为了防止这些新增的请求,对传统的没有 CORS 支持的服务器形成压力,给服务器一个提前拒绝的机会,这样可以防止服务器收到大量`DELETE`和`PUT`请求,这些传统的表单不可能跨域发出的请求。 +非简单请求的 CORS 请求,会在正式通信之前,增加一次 HTTP 查询请求,称为“预检”请求(preflight)。浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些 HTTP 方法和头信息字段。只有得到肯定答复,浏览器才会发出正式的`XMLHttpRequest`请求,否则就报错。这是为了防止这些新增的请求,对传统的没有 CORS 支持的服务器形成压力,给服务器一个提前拒绝的机会,这样可以防止服务器收到大量`DELETE`和`PUT`请求,这些传统的表单不可能跨源发出的请求。 下面是一段浏览器的 JavaScript 脚本。 @@ -199,7 +199,7 @@ Access-Control-Max-Age: 1728000 **(1)`Access-Control-Allow-Methods`** -该字段必需,它的值是逗号分隔的一个字符串,表明服务器支持的所有跨域请求的方法。注意,返回的是所有支持的方法,而不单是浏览器请求的那个方法。这是为了避免多次“预检”请求。 +该字段必需,它的值是逗号分隔的一个字符串,表明服务器支持的所有跨源请求的方法。注意,返回的是所有支持的方法,而不单是浏览器请求的那个方法。这是为了避免多次“预检”请求。 **(2)`Access-Control-Allow-Headers`** From 0887afc35d3ada0e8b4e8307ee4225c99815622a Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sun, 23 Jul 2023 14:29:52 +0800 Subject: [PATCH 10/33] docs(stdlib/JSON): add JSON.parse(JSON.stringify(obj)) --- docs/stdlib/json.md | 9 +++++++++ package.json | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/stdlib/json.md b/docs/stdlib/json.md index dfe1b76..c395d46 100644 --- a/docs/stdlib/json.md +++ b/docs/stdlib/json.md @@ -395,6 +395,15 @@ JSON.parse('{"a": 1, "b": 2}', f) 上面代码中,`JSON.parse()`的第二个参数是一个函数,如果键名是`a`,该函数会将键值加上10。 +`JSON.parse()`和`JSON.stringify()`可以结合使用,像下面这样写,实现对象的深拷贝。 + +```javascript +JSON.parse(JSON.stringify(obj)) +``` + +上面这种写法,可以深度克隆一个对象,但是对象内部不能有 JSON +不允许的数据类型,比如函数、正则对象、日期对象等。 + ## 参考链接 - MDN, [Using native JSON](https://developer.mozilla.org/en-US/docs/Using_native_JSON) diff --git a/package.json b/package.json index b67124a..f9e429a 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ }, "homepage": "https://github.com/wangdoc/javascript-tutorial", "dependencies": { - "gh-pages": "^3.2.3", + "gh-pages": "5.x", "husky": "^4.3.8", "loppo": "^0.6.24", "loppo-theme-wangdoc": "^0.6.1" From 9f7eb468eea0fbb96de409b1b04dccfdd1afdc67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=BE=E5=B8=85?= <21106848+sdshaoda@users.noreply.github.com> Date: Thu, 10 Aug 2023 17:07:57 +0800 Subject: [PATCH 11/33] docs(types/general): add ES6 BigInt type (#260) --- docs/types/general.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/types/general.md b/docs/types/general.md index 8454b44..6d512ef 100644 --- a/docs/types/general.md +++ b/docs/types/general.md @@ -2,7 +2,7 @@ ## 简介 -JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型,共有六种。(ES6 又新增了第七种 Symbol 类型的值,本教程不涉及。) +JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型,共有六种。(ES6 又新增了 Symbol 和 BigInt 数据类型,本教程不涉及。) - 数值(number):整数和小数(比如`1`和`3.14`)。 - 字符串(string):文本(比如`Hello World`)。 From f05cc4a83f1ae5ba1369f0120b8d9df4384fdb23 Mon Sep 17 00:00:00 2001 From: thinkasany <117748716+thinkasany@users.noreply.github.com> Date: Thu, 17 Aug 2023 11:53:52 +0800 Subject: [PATCH 12/33] docs(general): use '===' replace '==' (#261) --- docs/async/general.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/async/general.md b/docs/async/general.md index a4c9747..a745bfe 100644 --- a/docs/async/general.md +++ b/docs/async/general.md @@ -271,7 +271,7 @@ function launcher() { running--; if(items.length > 0) { launcher(); - } else if(running == 0) { + } else if(running === 0) { final(results); } }); From 4f58c96e9c43936ec2489f392d8c033fb1382881 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sat, 30 Dec 2023 14:47:56 +0800 Subject: [PATCH 13/33] docs(stdlib/regex): fixed #263 --- 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 cc0f002..5a1d884 100644 --- a/docs/stdlib/regexp.md +++ b/docs/stdlib/regexp.md @@ -150,7 +150,7 @@ r2.exec(s) // null 上面代码中,正则对象`r1`匹配成功,返回一个数组,成员是匹配结果;正则对象`r2`匹配失败,返回`null`。 -如果正则表示式包含圆括号(即含有“组匹配”),则返回的数组会包括多个成员。第一个成员是整个匹配成功的结果,后面的成员就是圆括号对应的匹配成功的组。也就是说,第二个成员对应第一个括号,第三个成员对应第二个括号,以此类推。整个数组的`length`属性等于组匹配的数量再加1。 +如果正则表达式包含圆括号(即含有“组匹配”),则返回的数组会包括多个成员。第一个成员是整个匹配成功的结果,后面的成员就是圆括号对应的匹配成功的组。也就是说,第二个成员对应第一个括号,第三个成员对应第二个括号,以此类推。整个数组的`length`属性等于组匹配的数量再加1。 ```javascript var s = '_x_x'; From 35bbedb38227416be049585c3c5bab0753fdf913 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Wed, 3 Jan 2024 08:40:54 +0800 Subject: [PATCH 14/33] docs(oop/strict): fixed #265 --- 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 3dffbe6..341f757 100644 --- a/docs/oop/strict.md +++ b/docs/oop/strict.md @@ -12,7 +12,7 @@ - 明确禁止一些不合理、不严谨的语法,减少 JavaScript 语言的一些怪异行为。 - 增加更多报错的场合,消除代码运行的一些不安全之处,保证代码运行的安全。 -- 提高编译器效率,增加运行速度。 +- 提高编译器效率,提升运行速度。 - 为未来新版本的 JavaScript 语法做好铺垫。 总之,严格模式体现了 JavaScript 更合理、更安全、更严谨的发展方向。 From 1868d0a647596d4f2abaf2ebb6489eeebc6689b2 Mon Sep 17 00:00:00 2001 From: Enoch Gao Date: Fri, 5 Jan 2024 19:33:02 +0800 Subject: [PATCH 15/33] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DscrollHeight?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=E9=94=99=E8=AF=AF=20(#266)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/dom/element.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/dom/element.md b/docs/dom/element.md index 2b5ea6d..6a73887 100644 --- a/docs/dom/element.md +++ b/docs/dom/element.md @@ -371,8 +371,8 @@ document.body.scrollHeight ```javascript // HTML 代码如下 -//
...
-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 16/33] =?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 17/33] 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 18/33] =?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: Sat, 24 Feb 2024 23:36:43 +0800 Subject: [PATCH 19/33] 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: Fri, 19 Apr 2024 22:01:55 +0800 Subject: [PATCH 20/33] 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: Mon, 22 Apr 2024 23:25:03 +0800 Subject: [PATCH 21/33] 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: Wed, 24 Apr 2024 16:59:12 +0800 Subject: [PATCH 22/33] 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: Thu, 25 Apr 2024 15:02:47 +0800 Subject: [PATCH 23/33] 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 24/33] 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 25/33] 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 26/33] 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: Mon, 24 Jun 2024 14:04:54 +0800 Subject: [PATCH 27/33] 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 28/33] 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: Tue, 24 Sep 2024 17:22:49 +0800 Subject: [PATCH 29/33] =?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: Tue, 24 Sep 2024 22:04:45 +0800 Subject: [PATCH 30/33] =?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: Wed, 25 Sep 2024 17:08:58 +0800 Subject: [PATCH 31/33] 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: Tue, 10 Dec 2024 07:21:34 +0800 Subject: [PATCH 32/33] =?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: Wed, 25 Dec 2024 10:09:38 +0800 Subject: [PATCH 33/33] 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 });