From c80eedcd17720626be8db2d97b4a72bf94c1b2d0 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Thu, 7 Mar 2019 13:36:54 +0800 Subject: [PATCH 001/221] docs(operator): fix bit/>>> --- docs/operators/bit.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/operators/bit.md b/docs/operators/bit.md index f19a015..f02a028 100644 --- a/docs/operators/bit.md +++ b/docs/operators/bit.md @@ -10,7 +10,7 @@ - **异或运算符**(xor):符号为`^`,表示若两个二进制位不相同,则结果为1,否则为0。 - **左移运算符**(left shift):符号为`<<`,详见下文解释。 - **右移运算符**(right shift):符号为`>>`,详见下文解释。 -- **带符号位的右移运算符**(zero filled right shift):符号为`>>>`,详见下文解释。 +- **头部补零的右移运算符**(zero filled right shift):符号为`>>>`,详见下文解释。 这些位运算符直接处理每一个比特位(bit),所以是非常底层的运算,好处是速度极快,缺点是很不直观,许多场合不能使用它们,否则会使代码难以理解和查错。 @@ -175,7 +175,7 @@ b // 10 ## 左移运算符 -左移运算符(`<<`)表示将一个数的二进制值向左移动指定的位数,尾部补`0`,即乘以`2`的指定次方。 +左移运算符(`<<`)表示将一个数的二进制值向左移动指定的位数,尾部补`0`,即乘以`2`的指定次方。向左移动的时候,最高位的符号位是一起移动的。 ```javascript // 4 的二进制形式为100, @@ -221,7 +221,7 @@ rgb2hex(color.r, color.g, color.b) ## 右移运算符 -右移运算符(`>>`)表示将一个数的二进制值向右移动指定的位数,头部补`0`,即除以`2`的指定次方(最高位即符号位不参与移动)。 +右移运算符(`>>`)表示将一个数的二进制值向右移动指定的位数。如果是正数,头部全部补`0`;如果是负数,头部全部补`1`。右移运算符基本上相当于除以`2`的指定次方(最高位即符号位参与移动)。 ```javascript 4 >> 1 @@ -261,9 +261,9 @@ rgb2hex(color.r, color.g, color.b) // 相当于 21 / 16 = 1 ``` -## 带符号位的右移运算符 +## 头部补零的右移运算符 -带符号位的右移运算符(`>>>`)表示将一个数的二进制形式向右移动,包括符号位也参与移动,头部补`0`。所以,该运算总是得到正值。对于正数,该运算的结果与右移运算符(`>>`)完全一致,区别主要在于负数。 +头部补零的右移运算符(`>>>`)与右移运算符(`>>`)只有一个差别,就是一个数的二进制形式向右移动时,头部一律补零,而不考虑符号位。所以,该运算总是得到正值。对于正数,该运算的结果与右移运算符(`>>`)完全一致,区别主要在于负数。 ```javascript 4 >>> 1 From 1b9218f2ee796a0826c4da33fa951f8ab31433f7 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Tue, 12 Mar 2019 11:12:15 +0800 Subject: [PATCH 002/221] docs(types): edit types/function.toString --- docs/types/function.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/types/function.md b/docs/types/function.md index 829b4d6..71df9bb 100644 --- a/docs/types/function.md +++ b/docs/types/function.md @@ -273,6 +273,15 @@ f.toString() // } ``` +对于那些原生的函数,`toString()`方法返回`function (){[native code]}`。 + +```javascript +Math.sqrt.toString() +// "function sqrt() { [native code] }" +``` + +上面代码中,`Math.sqrt`是 JavaScript 引擎提供的原生函数,`toString()`方法就返回原生代码的提示。 + 函数内部的注释也可以返回。 ```javascript From 7d27439d590161a16d18c9d0f5ff10fecfc15d5b Mon Sep 17 00:00:00 2001 From: ruanyf Date: Wed, 13 Mar 2019 13:50:14 +0800 Subject: [PATCH 003/221] docs(elements): fix a #104 --- docs/elements/a.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/elements/a.md b/docs/elements/a.md index 188f0eb..6277fe7 100644 --- a/docs/elements/a.md +++ b/docs/elements/a.md @@ -46,7 +46,7 @@ a.username // "user" ```javascript // HTML 代码如下 // test -var a = document.getElementById('a'); +var a = document.getElementById('test'); a.accessKey = 'k'; ``` From 9ae03250e03f90400fbc247a0a6f494040e68e4d Mon Sep 17 00:00:00 2001 From: ruanyf Date: Fri, 15 Mar 2019 15:17:34 +0800 Subject: [PATCH 004/221] docs(event): edit common --- 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 96f5140..9e70b19 100644 --- a/docs/events/common.md +++ b/docs/events/common.md @@ -27,7 +27,7 @@ window.addEventListener('beforeunload', function (e) { }); ``` -注意,许多手机浏览器默认忽略这个事件,桌面浏览器也有办法忽略这个事件。所以,它可能根本不会生效,不能依赖它来阻止用户关闭窗口。另外,一旦使用了`beforeunload`事件,浏览器就不会缓存当前网页。因为执行了这个事件以后,缓存页面就没意义了。 +注意,许多手机浏览器默认忽略这个事件,桌面浏览器也有办法忽略这个事件。所以,它可能根本不会生效,不能依赖它来阻止用户关闭窗口。另外,一旦使用了`beforeunload`事件,浏览器就不会缓存当前网页,使用“回退”按钮将重新向服务器请求网页。这是因为离开页面之前,都会执行这个事件,一般会修改初始状态,这时缓存初始页面就没意义了。 基本上,只有一种场合可以监听`unload`事件,其他情况都不应该监听:用户修改了表单,还没有保存就要离开。 From 769fe0edab99c374e8825abe3e990c23ccf945f8 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Fri, 15 Mar 2019 15:24:13 +0800 Subject: [PATCH 005/221] docs(event): edit common/onbeforeunload --- 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 9e70b19..d52ce84 100644 --- a/docs/events/common.md +++ b/docs/events/common.md @@ -27,7 +27,7 @@ window.addEventListener('beforeunload', function (e) { }); ``` -注意,许多手机浏览器默认忽略这个事件,桌面浏览器也有办法忽略这个事件。所以,它可能根本不会生效,不能依赖它来阻止用户关闭窗口。另外,一旦使用了`beforeunload`事件,浏览器就不会缓存当前网页,使用“回退”按钮将重新向服务器请求网页。这是因为离开页面之前,都会执行这个事件,一般会修改初始状态,这时缓存初始页面就没意义了。 +注意,许多手机浏览器默认忽略这个事件,桌面浏览器也有办法忽略这个事件。所以,它可能根本不会生效,不能依赖它来阻止用户关闭窗口。另外,一旦使用了`beforeunload`事件,浏览器就不会缓存当前网页,使用“回退”按钮将重新向服务器请求网页。这是因为监听这个事件的目的,一般是修改初始状态,这时缓存初始页面就没意义了。 基本上,只有一种场合可以监听`unload`事件,其他情况都不应该监听:用户修改了表单,还没有保存就要离开。 From 9cdd98c7efab5bf10c3454c1a9d0a2f308fbb92c Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sun, 17 Mar 2019 16:40:55 +0800 Subject: [PATCH 006/221] docs(stdlib): fix attribute #109 --- 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 e7ea09c..851ac0a 100644 --- a/docs/stdlib/attributes.md +++ b/docs/stdlib/attributes.md @@ -409,11 +409,12 @@ Object.defineProperty(o2, 'p', {value: 2}) // 修改成功 ``` -另外,`configurable`为`false`时,直接目标属性赋值,不报错,但不会成功。 +另外,`writable`为`false`时,直接目标属性赋值,不报错,但不会成功。 ```javascript var obj = Object.defineProperty({}, 'p', { value: 1, + writable: false, configurable: false }); @@ -421,7 +422,7 @@ obj.p = 2; obj.p // 1 ``` -上面代码中,`obj.p`的`configurable`为`false`,对`obj.p`赋值是不会生效的。如果是严格模式,还会报错。 +上面代码中,`obj.p`的`writable`为`false`,对`obj.p`直接赋值不会生效。如果是严格模式,还会报错。 可配置性决定了目标属性是否可以被删除(delete)。 From 175a75703d5b175e965f60ef873c65803d32e0b9 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sun, 17 Mar 2019 16:55:57 +0800 Subject: [PATCH 007/221] docs(features): fix error/finally #106 --- docs/features/error.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/features/error.md b/docs/features/error.md index df70e72..c0b8ebb 100644 --- a/docs/features/error.md +++ b/docs/features/error.md @@ -432,10 +432,12 @@ try { 上面代码中,进入`catch`代码块之后,一遇到`throw`语句,就会去执行`finally`代码块,其中有`return false`语句,因此就直接返回了,不再会回去执行`catch`代码块剩下的部分了。 +`try`代码块内部,还可以再使用`try`代码块。 + ```javascript try { try { - console.log('Hello world!'); // 报错 + consle.log('Hello world!'); // 报错 } finally { console.log('Finally'); @@ -445,10 +447,10 @@ try { console.error(error.message); } // Finally -// console is not defined +// consle is not defined ``` -上面代码中,`try`里面还有一个`try`。内层的`try`报错,这时会执行内层的`finally`代码块,然后抛出错误,被外层的`catch`捕获。 +上面代码中,`try`里面还有一个`try`。内层的`try`报错(`console`拼错了),这时会执行内层的`finally`代码块,然后抛出错误,被外层的`catch`捕获。 ## 参考连接 From 738008d5d3d58f6f4f13c710c643228a278bc315 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Thu, 21 Mar 2019 11:29:48 +0800 Subject: [PATCH 008/221] docs(dom): fix node/appendChild #110 --- docs/dom/node.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/docs/dom/node.md b/docs/dom/node.md index be0f932..fe5c35d 100644 --- a/docs/dom/node.md +++ b/docs/dom/node.md @@ -295,7 +295,7 @@ test.isConnected // true ### Node.prototype.appendChild() -`appendChild`方法接受一个节点对象作为参数,将其作为最后一个子节点,插入当前节点。该方法的返回值就是插入文档的子节点。 +`appendChild()`方法接受一个节点对象作为参数,将其作为最后一个子节点,插入当前节点。该方法的返回值就是插入文档的子节点。 ```javascript var p = document.createElement('p'); @@ -304,17 +304,16 @@ document.body.appendChild(p); 上面代码新建一个`

`节点,将其插入`document.body`的尾部。 -如果参数节点是 DOM 已经存在的节点,`appendChild`方法会将其从原来的位置,移动到新位置。 +如果参数节点是 DOM 已经存在的节点,`appendChild()`方法会将其从原来的位置,移动到新位置。 ```javascript -var element = document - .createElement('div') - .appendChild(document.createElement('b')); +var div = document.getElementById('myDiv'); +document.body.appendChild(div); ``` -上面代码的返回值是``,而不是`

`。 +上面代码中,插入的是一个已经存在的节点`myDiv`,结果就是该节点会从原来的位置,移动到`document.body`的尾部。 -如果`appendChild`方法的参数是`DocumentFragment`节点,那么插入的是`DocumentFragment`的所有子节点,而不是`DocumentFragment`节点本身。返回值是一个空的`DocumentFragment`节点。 +如果`appendChild()`方法的参数是`DocumentFragment`节点,那么插入的是`DocumentFragment`的所有子节点,而不是`DocumentFragment`节点本身。返回值是一个空的`DocumentFragment`节点。 ### Node.prototype.hasChildNodes() From c80e606e414c5f5dcfeea35efb48a34ec2273ad3 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Thu, 21 Mar 2019 15:49:08 +0800 Subject: [PATCH 009/221] docs(stdlib): fix json/stringify --- docs/stdlib/json.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/stdlib/json.md b/docs/stdlib/json.md index c080ef0..b4250aa 100644 --- a/docs/stdlib/json.md +++ b/docs/stdlib/json.md @@ -332,7 +332,7 @@ RegExp.prototype.toJSON = RegExp.prototype.toString; JSON.stringify(/foo/) // ""/foo/"" ``` -上面代码在正则对象的原型上面部署了`toJSON`方法,将其指向`toString`方法,因此遇到转换成`JSON`时,正则对象就先调用`toJSON`方法转为字符串,然后再被`JSON.stingify`方法处理。 +上面代码在正则对象的原型上面部署了`toJSON()`方法,将其指向`toString()`方法,因此转换成 JSON 格式时,正则对象就先调用`toJSON()`方法转为字符串,然后再被`JSON.stringify()`方法处理。 ## JSON.parse() From 405790c2fe80c0e9a770bee678cb6c75cdc6d4f7 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sat, 23 Mar 2019 13:32:34 +0800 Subject: [PATCH 010/221] docs(bom): fix window/window.open #111 --- 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 dc985da..4b75320 100644 --- a/docs/bom/window.md +++ b/docs/bom/window.md @@ -324,7 +324,7 @@ var popup = window.open( ); ``` -上面代码表示,打开的新窗口高度和宽度都为200像素,没有地址栏和滚动条,但有状态栏,允许用户调整大小。 +上面代码表示,打开的新窗口高度和宽度都为200像素,没有地址栏,但有状态栏和滚动条,允许用户调整大小。 第三个参数可以设定如下属性。 From 578a0c0adee46b4493ecbdd78da4d9edfd150e3e Mon Sep 17 00:00:00 2001 From: ruanyf Date: Wed, 10 Apr 2019 12:13:03 +0800 Subject: [PATCH 011/221] =?UTF-8?q?docs(dom):=20fix=20general/=E9=A1=B6?= =?UTF-8?q?=E5=B1=82=E8=8A=82=E7=82=B9=20#117?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/dom/general.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/dom/general.md b/docs/dom/general.md index bf85ba7..0382a94 100644 --- a/docs/dom/general.md +++ b/docs/dom/general.md @@ -35,7 +35,7 @@ document // 整个文档树 ``` -文档的第一层只有一个节点,就是 HTML 网页的第一个标签``,它构成了树结构的根节点(root node),其他 HTML 标签节点都是它的下级节点。 +文档的第一层有两个节点,第一个是文档类型节点(``),第二个是 HTML 网页的顶层容器标签``。后者构成了树结构的根节点(root node),其他 HTML 标签节点都是它的下级节点。 除了根节点,其他节点都有三种层级关系。 From 729c20b4c3106c6c88e26c8f820df44ceff1de75 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Fri, 12 Apr 2019 22:39:39 +0800 Subject: [PATCH 012/221] docs(bom): edit same-origin/jsonp --- docs/bom/same-origin.md | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/docs/bom/same-origin.md b/docs/bom/same-origin.md index e64efa1..23d6c56 100644 --- a/docs/bom/same-origin.md +++ b/docs/bom/same-origin.md @@ -304,16 +304,28 @@ window.onmessage = function(e) { ### JSONP -JSONP 是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,老式浏览器全部支持,服务端改造非常小。 +JSONP 是服务器与客户端跨源通信的常用方法。最大特点就是简单易用,没有兼容性问题,老式浏览器全部支持,服务端改造非常小。 -它的基本思想是,网页通过添加一个` +``` + +注意,请求的脚本网址有一个`callback`参数(`?callback=bar`),用来告诉服务器,客户端的回调函数名称(`bar`)。 + +第二步,服务器收到请求后,拼接一个字符串,将 JSON 数据放在函数名里面,作为字符串返回(`bar({...})`)。 + +第三步,客户端会将服务器返回的字符串,作为代码解析,因为浏览器认为,这是` +``` + +上面代码中,`document.currentScript`就是`