Skip to content

Commit 44c2ca2

Browse files
authored
Merge pull request #1 from wangdoc/master
merge
2 parents 287467c + 16df62c commit 44c2ca2

16 files changed

Lines changed: 121 additions & 52 deletions

File tree

README.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1-
本教程全面介绍 JavaScript 核心语法,从最简单的讲起,循序渐进、由浅入深,力求清晰易懂。所有章节都带有大量的代码实例,便于理解和模仿,可以用到实际项目中,即学即用。
1+
本教程全面介绍 JavaScript 核心语法,覆盖了 ES5 和 DOM 规范的所有内容。
2+
3+
内容上从最简单的讲起,循序渐进、由浅入深,力求清晰易懂。所有章节都带有大量的代码实例,便于理解和模仿,可以用到实际项目中,即学即用。
4+
5+
本教程适合初学者当作 JavaScript 语言入门教程,学完后就可以承担实际的网页开发工作,也适合当作日常使用的参考手册。
6+
7+
JavaScript 后续新增的 ES6 语法,请看[《ES6 标准入门教程》](https://wangdoc.com/es6/)
28

3-
本教程适合初学者当作 JavaScript 语言入门教程,也适合当作日常使用的参考手册。

docs/bom/cookie.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ document.cookie // "id=foo;key=bar"
3636

3737
不同浏览器对 Cookie 数量和大小的限制,是不一样的。一般来说,单个域名设置的 Cookie 不应超过30个,每个 Cookie 的大小不能超过4KB。超过限制以后,Cookie 将被忽略,不会被设置。
3838

39-
浏览器的同源政策规定,两个网址只要域名相同和端口相同,就可以共享 Cookie(参见《同源政策》一章)。注意,这里不要求协议相同。也就是说,`http://example.com`设置的 Cookie,可以被`https://example.com`读取。
39+
浏览器的同源政策规定,两个网址只要域名相同,就可以共享 Cookie(参见《同源政策》一章)。注意,这里不要求协议相同。也就是说,`http://example.com`设置的 Cookie,可以被`https://example.com`读取。
4040

4141
## Cookie 与 HTTP 协议
4242

docs/bom/same-origin.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
> - 协议相同
1414
> - 域名相同
15-
> - 端口相同
15+
> - 端口相同(这点可以忽略,详见下文)
1616
1717
举例来说,`http://www.example.com/dir/page.html`这个网址,协议是`http://`,域名是`www.example.com`,端口是`80`(默认端口可以省略),它的同源情况如下。
1818

@@ -22,11 +22,13 @@
2222
- `http://www.example.com:81/dir/other.html`:不同源(端口不同)
2323
- `https://www.example.com/dir/page.html`:不同源(协议不同)
2424

25+
注意,标准规定端口不同的网址不是同源(比如8000端口和8001端口不是同源),但是浏览器没有遵守这条规定。实际上,同一个网域的不同端口,是可以互相读取 Cookie 的。
26+
2527
### 目的
2628

2729
同源政策的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据。
2830

29-
设想这样一种情况:A 网站是一家银行,用户登录以后,A 网站在用户的机器上设置了一个 Cookie,包含了一些隐私信息(比如存款总额)。用户离开 A 网站以后,又去访问 B 网站,如果没有同源限制,B 网站可以读取 A 网站的 Cookie,那么隐私信息就会泄漏。更可怕的是,Cookie 往往用来保存用户的登录状态,如果用户没有退出登录,其他网站就可以冒充用户,为所欲为。因为浏览器同时还规定,提交表单不受同源政策的限制。
31+
设想这样一种情况:A 网站是一家银行,用户登录以后,A 网站在用户的机器上设置了一个 Cookie,包含了一些隐私信息。用户离开 A 网站以后,又去访问 B 网站,如果没有同源限制,B 网站可以读取 A 网站的 Cookie,那么隐私就泄漏了。更可怕的是,Cookie 往往用来保存用户的登录状态,如果用户没有退出登录,其他网站就可以冒充用户,为所欲为。因为浏览器同时还规定,提交表单不受同源政策的限制。
3032

3133
由此可见,同源政策是必需的,否则 Cookie 可以共享,互联网就毫无安全可言了。
3234

@@ -56,7 +58,7 @@
5658
- window.focus()
5759
- window.postMessage()
5860

59-
上面的九个属性之中,只有`window.location`是可读写的,其他八个全部都是只读。而且,即使是`location`对象,非同源的情况下,也只允许调用`location.replace`方法和写入`location.href`属性。
61+
上面的九个属性之中,只有`window.location`是可读写的,其他八个全部都是只读。而且,即使是`location`对象,非同源的情况下,也只允许调用`location.replace()`方法和写入`location.href`属性。
6062

6163
虽然这些限制是必要的,但是有时很不方便,合理的用途也受到影响。下面介绍如何规避上面的限制。
6264

docs/dom/document.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@ document.querySelectorAll('DIV, A, SCRIPT');
496496

497497
### document.getElementsByTagName()
498498

499-
`document.getElementsByTagName`方法搜索 HTML 标签名,返回符合条件的元素。它的返回值是一个类似数组对象(`HTMLCollection`实例),可以实时反映 HTML 文档的变化。如果没有任何匹配的元素,就返回一个空集。
499+
`document.getElementsByTagName()`方法搜索 HTML 标签名,返回符合条件的元素。它的返回值是一个类似数组对象(`HTMLCollection`实例),可以实时反映 HTML 文档的变化。如果没有任何匹配的元素,就返回一个空集。
500500

501501
```javascript
502502
var paras = document.getElementsByTagName('p');
@@ -505,7 +505,7 @@ paras instanceof HTMLCollection // true
505505

506506
上面代码返回当前文档的所有`p`元素节点。
507507

508-
HTML 标签名是大小写不敏感的,因此`getElementsByTagName`方法也是大小写不敏感的。另外,返回结果中,各个成员的顺序就是它们在文档中出现的顺序。
508+
HTML 标签名是大小写不敏感的,因此`getElementsByTagName()`方法的参数也是大小写不敏感的。另外,返回结果中,各个成员的顺序就是它们在文档中出现的顺序。
509509

510510
如果传入`*`,就可以返回文档中所有 HTML 元素。
511511

@@ -524,7 +524,7 @@ var spans = firstPara.getElementsByTagName('span');
524524

525525
### document.getElementsByClassName()
526526

527-
`document.getElementsByClassName`方法返回一个类似数组的对象(`HTMLCollection`实例),包括了所有`class`名字符合指定条件的元素,元素的变化实时反映在返回结果中。
527+
`document.getElementsByClassName()`方法返回一个类似数组的对象(`HTMLCollection`实例),包括了所有`class`名字符合指定条件的元素,元素的变化实时反映在返回结果中。
528528

529529
```javascript
530530
var elements = document.getElementsByClassName(names);
@@ -542,7 +542,7 @@ var elements = document.getElementsByClassName('foo bar');
542542

543543
注意,正常模式下,CSS 的`class`是大小写敏感的。(`quirks mode`下,大小写不敏感。)
544544

545-
`getElementsByTagName`方法一样,`getElementsByClassName`方法不仅可以在`document`对象上调用,也可以在任何元素节点上调用。
545+
`getElementsByTagName()`方法一样,`getElementsByClassName()`方法不仅可以在`document`对象上调用,也可以在任何元素节点上调用。
546546

547547
```javascript
548548
// 非document对象上调用
@@ -551,7 +551,7 @@ var elements = rootElement.getElementsByClassName(names);
551551

552552
### document.getElementsByName()
553553

554-
`document.getElementsByName`方法用于选择拥有`name`属性的 HTML 元素(比如`<form>``<radio>``<img>``<frame>``<embed>``<object>`等),返回一个类似数组的的对象(`NodeList`实例),因为`name`属性相同的元素可能不止一个。
554+
`document.getElementsByName()`方法用于选择拥有`name`属性的 HTML 元素(比如`<form>``<radio>``<img>``<frame>``<embed>``<object>`等),返回一个类似数组的的对象(`NodeList`实例),因为`name`属性相同的元素可能不止一个。
555555

556556
```javascript
557557
// 表单为 <form name="x"></form>
@@ -561,15 +561,15 @@ forms[0].tagName // "FORM"
561561

562562
### document.getElementById()
563563

564-
`document.getElementById`方法返回匹配指定`id`属性的元素节点。如果没有发现匹配的节点,则返回`null`
564+
`document.getElementById()`方法返回匹配指定`id`属性的元素节点。如果没有发现匹配的节点,则返回`null`
565565

566566
```javascript
567567
var elem = document.getElementById('para1');
568568
```
569569

570570
注意,该方法的参数是大小写敏感的。比如,如果某个节点的`id`属性是`main`,那么`document.getElementById('Main')`将返回`null`
571571

572-
`document.getElementById`方法与`document.querySelector`方法都能获取元素节点,不同之处是`document.querySelector`方法的参数使用 CSS 选择器语法,`document.getElementById`方法的参数是元素的`id`属性。
572+
`document.getElementById()`方法与`document.querySelector()`方法都能获取元素节点,不同之处是`document.querySelector()`方法的参数使用 CSS 选择器语法,`document.getElementById()`方法的参数是元素的`id`属性。
573573

574574
```javascript
575575
document.getElementById('myElement')
@@ -582,7 +582,7 @@ document.querySelector('#myElement')
582582

583583
### document.elementFromPoint(),document.elementsFromPoint()
584584

585-
`document.elementFromPoint`方法返回位于页面指定位置最上层的元素节点。
585+
`document.elementFromPoint()`方法返回位于页面指定位置最上层的元素节点。
586586

587587
```javascript
588588
var element = document.elementFromPoint(50, 50);

docs/dom/element.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -603,14 +603,14 @@ for (var i = 0; i< matches.length; i++) {
603603

604604
### Element.getElementsByTagName()
605605

606-
`Element.getElementsByTagName`方法返回一个`HTMLCollection`实例,成员是当前节点的所有匹配指定标签名的子元素节点。该方法与`document.getElementsByClassName`方法的用法类似,只是搜索范围不是整个文档,而是当前元素节点。
606+
`Element.getElementsByTagName()`方法返回一个`HTMLCollection`实例,成员是当前节点的所有匹配指定标签名的子元素节点。该方法与`document.getElementsByClassName()`方法的用法类似,只是搜索范围不是整个文档,而是当前元素节点。
607607

608608
```javascript
609609
var table = document.getElementById('forecast-table');
610610
var cells = table.getElementsByTagName('td');
611611
```
612612

613-
注意,该方法的参数是大小写不敏感的。
613+
注意,该方法的参数是大小写不敏感的,因为 HTML 标签名也是大小写不敏感
614614

615615
### Element.closest()
616616

docs/events/common.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ window.addEventListener('beforeunload', function (e) {
2727
});
2828
```
2929

30-
注意,许多手机浏览器默认忽略这个事件,桌面浏览器也有办法忽略这个事件。所以,它可能根本不会生效,不能依赖它来阻止用户关闭窗口。另外,一旦使用了`beforeunload`事件,浏览器就不会缓存当前网页,使用“回退”按钮将重新向服务器请求网页。这是因为监听这个事件的目的,一般是修改初始状态,这时缓存初始页面就没意义了
30+
注意,许多手机浏览器(比如 Safari)默认忽略这个事件,桌面浏览器也有办法忽略这个事件。所以,它可能根本不会生效,不能依赖它来阻止用户关闭浏览器窗口,最好不要使用这个事件
3131

32-
基本上,只有一种场合可以监听`unload`事件,其他情况都不应该监听:用户修改了表单,还没有保存就要离开
32+
另外,一旦使用了`beforeunload`事件,浏览器就不会缓存当前网页,使用“回退”按钮将重新向服务器请求网页。这是因为监听这个事件的目的,一般是为了网页状态,这时缓存页面的初始状态就没意义了
3333

3434
### unload 事件
3535

@@ -45,6 +45,8 @@ window.addEventListener('unload', function(event) {
4545

4646
手机上,浏览器或系统可能会直接丢弃网页,这时该事件根本不会发生。而且跟`beforeunload`事件一样,一旦使用了`unload`事件,浏览器就不会缓存当前网页,理由同上。因此,任何情况下都不应该依赖这个事件,指定网页卸载时要执行的代码,可以考虑完全不使用这个事件。
4747

48+
该事件可以用`pagehide`代替。
49+
4850
### load 事件,error 事件
4951

5052
`load`事件在页面或某个资源加载成功时触发。注意,页面或资源从浏览器缓存加载,并不会触发`load`事件。
@@ -59,13 +61,15 @@ window.addEventListener('load', function(event) {
5961

6062
这三个事件实际上属于进度事件,不仅发生在`document`对象,还发生在各种外部资源上面。浏览网页就是一个加载各种资源的过程,图像(image)、样式表(style sheet)、脚本(script)、视频(video)、音频(audio)、Ajax请求(XMLHttpRequest)等等。这些资源和`document`对象、`window`对象、XMLHttpRequestUpload 对象,都会触发`load`事件和`error`事件。
6163

64+
最后,页面的`load`事件也可以用`pageshow`事件代替。
65+
6266
## session 历史事件
6367

6468
### pageshow 事件,pagehide 事件
6569

6670
默认情况下,浏览器会在当前会话(session)缓存页面,当用户点击“前进/后退”按钮时,浏览器就会从缓存中加载页面。
6771

68-
pageshow 事件在页面加载时触发,包括第一次加载和从缓存加载两种情况。如果要指定页面每次加载(不管是不是从浏览器缓存)时都运行的代码,可以放在这个事件的监听函数。
72+
`pageshow`事件在页面加载时触发,包括第一次加载和从缓存加载两种情况。如果要指定页面每次加载(不管是不是从浏览器缓存)时都运行的代码,可以放在这个事件的监听函数。
6973

7074
第一次加载时,它的触发顺序排在`load`事件后面。从缓存加载时,`load`事件不会触发,因为网页在缓存中的样子通常是`load`事件的监听函数运行后的样子,所以不必重复执行。同理,如果是从缓存中加载页面,网页内初始化的 JavaScript 脚本(比如 DOMContentLoaded 事件的监听函数)也不会执行。
7175

@@ -75,7 +79,7 @@ window.addEventListener('pageshow', function(event) {
7579
});
7680
```
7781

78-
pageshow 事件有一个`persisted`属性,返回一个布尔值。页面第一次加载时,这个属性是`false`;当页面从缓存加载时,这个属性是`true`
82+
`pageshow`事件有一个`persisted`属性,返回一个布尔值。页面第一次加载时,这个属性是`false`;当页面从缓存加载时,这个属性是`true`
7983

8084
```javascript
8185
window.addEventListener('pageshow', function(event){

docs/events/model.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ HTML 语言允许在元素的属性中,直接定义某些事件的监听代码
3434
使用这个方法指定的监听代码,只会在冒泡阶段触发。
3535

3636
```html
37-
<div onClick="console.log(2)">
38-
<button onClick="console.log(1)">点击</button>
37+
<div onclick="console.log(2)">
38+
<button onclick="console.log(1)">点击</button>
3939
</div>
4040
```
4141

docs/operators/bit.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ var FLAG_D = 8; // 1000
303303

304304
上面代码设置 A、B、C、D 四个开关,每个开关分别占有一个二进制位。
305305

306-
然后,就可以用二进制与运算检验,当前设置是否打开了指定开关
306+
然后,就可以用二进制与运算,检查当前设置是否打开了指定开关
307307

308308
```javascript
309309
var flags = 5; // 二进制的0101
@@ -331,6 +331,8 @@ var mask = FLAG_A | FLAG_B | FLAG_D;
331331
flags = flags | mask;
332332
```
333333

334+
上面代码中,计算后得到的`flags`变量,代表三个开关的二进制位都打开了。
335+
334336
二进制与运算可以将当前设置中凡是与开关设置不一样的项,全部关闭。
335337

336338
```javascript

docs/operators/boolean.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ true && 'foo' && '' && 4 && 'foo' && true
9696
// 3
9797
```
9898

99-
上面代码中,例一里面,第一个布尔值为`false`的表达式为第三个表达式,所以得到一个空字符串。例二里面,所有表达式的布尔值都是`true`所有返回最后一个表达式的值`3`
99+
上面代码中,例一里面,第一个布尔值为`false`的表达式为第三个表达式,所以得到一个空字符串。例二里面,所有表达式的布尔值都是`true`所以返回最后一个表达式的值`3`
100100

101101
## 或运算符(||)
102102

docs/operators/priority.md

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -162,34 +162,56 @@ f() // 1
162162

163163
### 左结合与右结合
164164

165-
对于优先级别相同的运算符,大多数情况,计算顺序总是从左到右,这叫做运算符的“左结合”(left-to-right associativity),即从左边开始计算。
165+
对于优先级别相同的运算符,同时出现的时候,就会有计算顺序的问题。
166+
167+
```javascript
168+
a OP b OP c
169+
```
170+
171+
上面代码中,`OP`表示运算符。它可以有两种解释方式。
172+
173+
```javascript
174+
// 方式一
175+
(a OP b) OP c
176+
177+
// 方式二
178+
a OP (b OP c)
179+
```
180+
181+
上面的两种方式,得到的计算结果往往是不一样的。方式一是将左侧两个运算数结合在一起,采用这种解释方式的运算符,称为“左结合”(left-to-right associativity)运算符;方式二是将右侧两个运算数结合在一起,这样的运算符称为“右结合”运算符(right-to-left associativity)。
182+
183+
JavaScript 语言的大多数运算符是“左结合”,请看下面加法运算符的例子。
166184

167185
```javascript
168186
x + y + z
187+
188+
// 引擎解释如下
189+
(x + y) + z
169190
```
170191

171-
上面代码先计算最左边的`x``y`的和,然后再计算与`z`的和
192+
上面代码中,`x``y`结合在一起,它们的预算结果再与`z`进行运算
172193

173-
但是少数运算符的计算顺序是从右到左,即从右边开始计算,这叫做运算符的“右结合”(right-to-left associativity)。其中,最主要的是赋值运算符`=`)和三元条件运算符(`?:`)。
194+
少数运算符是“右结合”,其中最主要的是赋值运算符`=`)和三元条件运算符(`?:`)。
174195

175196
```javascript
176197
w = x = y = z;
177198
q = a ? b : c ? d : e ? f : g;
178199
```
179200

180-
上面代码的运算结果,相当于下面的样子
201+
上面代码的解释方式如下
181202

182203
```javascript
183204
w = (x = (y = z));
184205
q = a ? b : (c ? d : (e ? f : g));
185206
```
186207

187-
上面的两行代码,各有三个等号运算符和三个三元运算符,都是先计算最右边的那个运算符
208+
上面的两行代码,都是右侧的运算数结合在一起
188209

189-
指数运算符(`**`也是右结合的
210+
另外,指数运算符(`**`也是右结合
190211

191212
```javascript
192-
// 相当于 2 ** (3 ** 2)
193213
2 ** 3 ** 2
214+
// 相当于 2 ** (3 ** 2)
194215
// 512
195216
```
217+

0 commit comments

Comments
 (0)