├── README.md
├── ch01
└── ch01.pdf
├── ch02
└── ch02.pdf
├── ch03
└── ch03.pdf
├── ch04
└── ch04.pdf
├── ch05
└── ch05.pdf
├── ch06
└── ch06.pdf
├── ch07
└── ch07.pdf
├── ch08
└── ch08.pdf
├── ch09
└── ch09.pdf
├── ch10
└── ch10.pdf
├── ch11
└── ch11.pdf
├── ch12
└── ch12.pdf
├── ch13
└── ch13.pdf
├── ch14
└── ch14.pdf
├── ch15
└── ch15.pdf
├── ch16
└── ch16.pdf
├── ch17
└── ch17.pdf
├── ch18
└── ch18.pdf
├── ch19
└── ch19.pdf
├── ch20
└── ch20.pdf
├── ch21
└── ch21.pdf
├── ch22
└── ch22.pdf
├── ch23
└── ch23.pdf
├── ch24
└── ch24.pdf
├── ch25
└── ch25.pdf
├── ch26
└── ch26.pdf
├── ch27
└── ch27.pdf
├── ch28
└── ch28.pdf
├── ch29
└── ch29.pdf
├── ch30
└── ch30.pdf
├── ch31
└── ch31.pdf
├── ch32
└── ch32.pdf
├── ch33
└── ch33.pdf
├── ch34
└── ch34.pdf
├── lessons
├── LS01
│ ├── index.html
│ └── js
│ │ ├── demo01.js
│ │ ├── demo02.js
│ │ ├── demo03.js
│ │ ├── demo04.js
│ │ ├── demo05.js
│ │ ├── demo06.js
│ │ ├── demo07.js
│ │ ├── demo08.js
│ │ ├── demo09.js
│ │ ├── demo10.js
│ │ ├── demo11.js
│ │ ├── demo12.js
│ │ ├── demo13.js
│ │ ├── demo14.js
│ │ └── demo15.js
├── LS02
│ ├── index.html
│ └── js
│ │ ├── demo01.js
│ │ ├── demo02.js
│ │ ├── demo03.js
│ │ ├── demo04.js
│ │ ├── demo05.js
│ │ ├── demo06.js
│ │ ├── demo07.js
│ │ ├── demo08.js
│ │ ├── demo09.js
│ │ ├── demo10.js
│ │ ├── demo11.js
│ │ └── demo12.js
├── LS03
│ ├── index.html
│ └── js
│ │ ├── demo13.js
│ │ └── demo14.js
├── LS04
│ ├── index.html
│ └── js
│ │ ├── demo01.js
│ │ ├── demo02.js
│ │ ├── demo03.js
│ │ ├── demo04.js
│ │ ├── demo05.js
│ │ ├── demo06.js
│ │ ├── demo07.js
│ │ ├── demo08.js
│ │ ├── demo09.js
│ │ └── demo10.js
├── LS05
│ ├── index.html
│ └── js
│ │ ├── demo11.js
│ │ ├── demo12.js
│ │ └── demo13.js
├── LS06
│ ├── index.html
│ └── js
│ │ ├── demo14.js
│ │ ├── demo15.js
│ │ ├── demo16.js
│ │ └── demo17.js
├── LS07
│ ├── index.html
│ └── js
│ │ ├── demo01.js
│ │ ├── demo02.js
│ │ ├── demo03.js
│ │ └── demo04.js
├── LS08
│ ├── index.html
│ └── js
│ │ ├── demo05.js
│ │ ├── demo06.js
│ │ └── demo07.js
├── LS09
│ ├── index.html
│ └── js
│ │ ├── demo08.js
│ │ ├── demo09.js
│ │ └── demo10.js
├── LS10
│ ├── index04_2.html
│ ├── index05.html
│ └── js
│ │ ├── demo01.js
│ │ ├── demo02.js
│ │ ├── demo03.js
│ │ ├── demo04_1.js
│ │ ├── demo04_2.js
│ │ └── demo05.js
├── LS11
│ ├── index07_1_2.html
│ ├── index08.html
│ ├── index09.html
│ └── js
│ │ ├── demo06.js
│ │ ├── demo07_1.js
│ │ ├── demo07_2.js
│ │ ├── demo08.js
│ │ ├── demo09.js
│ │ └── demo10.js
├── LS12
│ ├── ClosureTest.html
│ ├── index11.html
│ ├── index16.html
│ └── js
│ │ ├── ClosureTest.js
│ │ ├── demo11.js
│ │ ├── demo12.js
│ │ ├── demo13.js
│ │ ├── demo14.js
│ │ ├── demo15.js
│ │ └── demo16.js
├── LS13
│ ├── index.html
│ └── js
│ │ ├── demo01.js
│ │ ├── demo02.js
│ │ ├── demo03.js
│ │ ├── demo04.js
│ │ └── demo05.js
├── LS14
│ ├── index.html
│ └── js
│ │ ├── demo06.js
│ │ ├── demo07.js
│ │ ├── demo08.js
│ │ ├── demo09.js
│ │ ├── demo10.js
│ │ ├── demo11.js
│ │ ├── demo12.js
│ │ ├── demo13.js
│ │ ├── demo14.js
│ │ ├── demo15.js
│ │ └── demo16.js
├── LS15
│ ├── index.html
│ └── js
│ │ ├── demo01.js
│ │ ├── demo02.js
│ │ ├── demo03.js
│ │ ├── demo04.js
│ │ ├── demo05.js
│ │ └── demo06.js
├── LS16
│ ├── index.html
│ └── js
│ │ ├── demo01.js
│ │ ├── demo02.js
│ │ ├── demo03.js
│ │ ├── demo04.js
│ │ ├── demo05.js
│ │ ├── demo06.js
│ │ └── demo07.js
├── LS17
│ ├── index.html
│ └── js
│ │ ├── demo07.js
│ │ ├── demo08.js
│ │ ├── demo09.js
│ │ ├── demo10.js
│ │ └── demo11.js
├── LS18
│ ├── index.html
│ └── js
│ │ ├── demo01.js
│ │ ├── demo02.js
│ │ ├── demo03.js
│ │ ├── demo04.js
│ │ ├── demo05.js
│ │ ├── demo06.js
│ │ └── demo07.js
├── LS19
│ ├── index.html
│ └── js
│ │ ├── demo08.js
│ │ ├── demo09.js
│ │ └── demo10.js
├── LS20
│ ├── index.html
│ ├── js
│ │ ├── demo01.js
│ │ ├── demo02.js
│ │ ├── demo03.js
│ │ ├── demo04.js
│ │ ├── demo05.js
│ │ ├── demo06.js
│ │ ├── demo07.js
│ │ ├── demo08.js
│ │ ├── demo09.js
│ │ └── demo10.js
│ └── 正则表达式(思维导图).jpg
├── LS21
│ ├── index.html
│ └── js
│ │ ├── demo11.js
│ │ ├── demo12.js
│ │ ├── demo13.js
│ │ └── demo14.js
├── LS22
│ ├── index.html
│ └── js
│ │ └── demo01.js
├── LS23
│ ├── NodeJsonTest
│ │ ├── NodeJsonTest.html
│ │ ├── NodeJsonTest.js
│ │ ├── NodeJsonTest.json
│ │ └── jquery-2.2.2.js
│ ├── index.html
│ └── js
│ │ ├── demo02.js
│ │ ├── demo03.js
│ │ ├── demo04.js
│ │ └── demo05.js
├── LS24
│ └── index.html
├── LS25
│ ├── demo01.js
│ ├── demo02.js
│ ├── demo03.js
│ ├── demo04.js
│ ├── demo05.js
│ ├── demo06.js
│ ├── index01.html
│ ├── index02.html
│ ├── index03.html
│ ├── index04.html
│ ├── index05.html
│ ├── index06.html
│ └── style.css
├── LS26
│ ├── NodeAjaxTest
│ │ ├── NodeAjaxTest01.html
│ │ ├── NodeAjaxTest01.js
│ │ ├── NodeAjaxTest02.html
│ │ ├── NodeAjaxTest02.js
│ │ ├── NodeJsonTest.html
│ │ ├── NodeJsonTest.js
│ │ ├── NodeJsonTest.json
│ │ └── jquery-2.2.2.js
│ ├── NodePackDemo
│ │ ├── Person.js
│ │ ├── test01.js
│ │ └── test02.js
│ ├── index.html
│ └── js
│ │ ├── demo01.js
│ │ ├── demo02.js
│ │ ├── demo03.js
│ │ ├── demo04-ajax.js
│ │ └── demo04-node.js
├── LS27
│ ├── index.html
│ └── js
│ │ ├── demo01.js
│ │ ├── demo02.js
│ │ ├── demo03.js
│ │ ├── demo04.js
│ │ ├── demo05.js
│ │ ├── demo06.js
│ │ └── demo07.js
├── LS28
│ ├── index.html
│ └── js
│ │ ├── demo09.js
│ │ ├── demo10.js
│ │ ├── demo11.js
│ │ ├── demo12.js
│ │ ├── demo13.js
│ │ ├── demo14.js
│ │ └── demo15.js
├── LS29
│ ├── index.html
│ └── js
│ │ ├── demo01.js
│ │ ├── demo02.js
│ │ ├── demo03.js
│ │ ├── demo04.js
│ │ └── demo05.js
├── LS30
│ ├── index.html
│ └── js
│ │ ├── demo06.js
│ │ ├── demo07.js
│ │ ├── demo08.js
│ │ ├── demo09.js
│ │ └── demo10.js
├── LS31
│ ├── index.html
│ └── js
│ │ ├── demo11.js
│ │ ├── demo12.js
│ │ ├── demo13.js
│ │ ├── demo14.js
│ │ └── demo15.js
├── LS32
│ ├── index.html
│ └── js
│ │ ├── demo01.js
│ │ ├── demo02.js
│ │ ├── demo03.js
│ │ ├── demo04.js
│ │ ├── demo05.js
│ │ ├── demo06.js
│ │ └── demo07.js
├── LS33
│ ├── demo01.js
│ ├── demo02.js
│ ├── demo03.js
│ ├── demo04.js
│ ├── demo05.js
│ ├── demo06.js
│ └── index.html
└── LS34
│ └── index.html
├── materials
├── outline.doc
├── schedule.doc
└── slides
│ ├── ch01.pptx
│ ├── ch02.pptx
│ ├── ch03.pptx
│ ├── ch04.pptx
│ ├── ch05.pptx
│ ├── ch06.pptx
│ ├── ch07.pptx
│ ├── ch08.pptx
│ ├── ch09.pptx
│ ├── ch10.pptx
│ ├── ch11.pptx
│ ├── ch12.pptx
│ ├── ch13.pptx
│ ├── ch14.pptx
│ ├── ch15.pptx
│ ├── ch16.pptx
│ ├── ch17.pptx
│ ├── ch18.pptx
│ ├── ch19.pptx
│ ├── ch20.pptx
│ ├── ch21.pptx
│ ├── ch22.pptx
│ ├── ch23.pptx
│ ├── ch24.pptx
│ ├── ch25.pptx
│ ├── ch26.pptx
│ ├── ch27.pptx
│ ├── ch28.pptx
│ ├── ch29.pptx
│ ├── ch30.pptx
│ ├── ch31.pptx
│ ├── ch32.pptx
│ ├── ch33.pptx
│ ├── ch34.pptx
│ └── cha34.pptx
└── tasks
├── 1.JS 数据结构与算法
├── 1-1.数组
│ ├── 数组任务1.js
│ ├── 数组任务2.js
│ ├── 数组任务3.js
│ └── 数组任务4.js
├── 1-2.链表
│ ├── 链表任务1.js
│ ├── 链表任务2.js
│ ├── 链表任务3.js
│ ├── 链表任务4.js
│ └── 链表任务5.js
├── 1-3.二叉树
│ ├── 二叉树任务1.js
│ ├── 二叉树任务2.js
│ ├── 二叉树任务3.js
│ ├── 二叉树任务4.js
│ └── 二叉树任务5.js
├── 1-4.哈希表
│ ├── 哈希表任务1.js
│ ├── 哈希表任务2.js
│ └── 哈希表任务3.js
└── 1-5.排序
│ ├── 排序任务1.js
│ ├── 排序任务2.js
│ ├── 排序任务3.js
│ ├── 排序任务4.js
│ └── 排序任务5.js
├── 2.JS SICP训练营
└── 2-1.过程与运算
│ ├── 过程与运算任务1.js
│ ├── 过程与运算任务2.js
│ ├── 过程与运算任务3.js
│ ├── 过程与运算任务4.js
│ ├── 过程与运算任务5.js
│ └── 过程与运算任务6.js
└── 3.JS 初级挑战杯
├── 3-1.趣味算法
├── 趣味算法任务1.js
├── 趣味算法任务10.js
├── 趣味算法任务2.js
├── 趣味算法任务3.js
├── 趣味算法任务4.js
├── 趣味算法任务5.js
├── 趣味算法任务6.js
├── 趣味算法任务7.js
├── 趣味算法任务8.js
└── 趣味算法任务9.js
└── 3-2.趣味游戏
├── 趣味游戏任务1.js
├── 趣味游戏任务2.js
├── 趣味游戏任务3.js
├── 趣味游戏任务4.js
└── 趣味游戏任务5.js
/ch01/ch01.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch01/ch01.pdf
--------------------------------------------------------------------------------
/ch02/ch02.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch02/ch02.pdf
--------------------------------------------------------------------------------
/ch03/ch03.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch03/ch03.pdf
--------------------------------------------------------------------------------
/ch04/ch04.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch04/ch04.pdf
--------------------------------------------------------------------------------
/ch05/ch05.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch05/ch05.pdf
--------------------------------------------------------------------------------
/ch06/ch06.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch06/ch06.pdf
--------------------------------------------------------------------------------
/ch07/ch07.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch07/ch07.pdf
--------------------------------------------------------------------------------
/ch08/ch08.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch08/ch08.pdf
--------------------------------------------------------------------------------
/ch09/ch09.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch09/ch09.pdf
--------------------------------------------------------------------------------
/ch10/ch10.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch10/ch10.pdf
--------------------------------------------------------------------------------
/ch11/ch11.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch11/ch11.pdf
--------------------------------------------------------------------------------
/ch12/ch12.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch12/ch12.pdf
--------------------------------------------------------------------------------
/ch13/ch13.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch13/ch13.pdf
--------------------------------------------------------------------------------
/ch14/ch14.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch14/ch14.pdf
--------------------------------------------------------------------------------
/ch15/ch15.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch15/ch15.pdf
--------------------------------------------------------------------------------
/ch16/ch16.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch16/ch16.pdf
--------------------------------------------------------------------------------
/ch17/ch17.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch17/ch17.pdf
--------------------------------------------------------------------------------
/ch18/ch18.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch18/ch18.pdf
--------------------------------------------------------------------------------
/ch19/ch19.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch19/ch19.pdf
--------------------------------------------------------------------------------
/ch20/ch20.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch20/ch20.pdf
--------------------------------------------------------------------------------
/ch21/ch21.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch21/ch21.pdf
--------------------------------------------------------------------------------
/ch22/ch22.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch22/ch22.pdf
--------------------------------------------------------------------------------
/ch23/ch23.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch23/ch23.pdf
--------------------------------------------------------------------------------
/ch24/ch24.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch24/ch24.pdf
--------------------------------------------------------------------------------
/ch25/ch25.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch25/ch25.pdf
--------------------------------------------------------------------------------
/ch26/ch26.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch26/ch26.pdf
--------------------------------------------------------------------------------
/ch27/ch27.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch27/ch27.pdf
--------------------------------------------------------------------------------
/ch28/ch28.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch28/ch28.pdf
--------------------------------------------------------------------------------
/ch29/ch29.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch29/ch29.pdf
--------------------------------------------------------------------------------
/ch30/ch30.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch30/ch30.pdf
--------------------------------------------------------------------------------
/ch31/ch31.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch31/ch31.pdf
--------------------------------------------------------------------------------
/ch32/ch32.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch32/ch32.pdf
--------------------------------------------------------------------------------
/ch33/ch33.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch33/ch33.pdf
--------------------------------------------------------------------------------
/ch34/ch34.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/ch34/ch34.pdf
--------------------------------------------------------------------------------
/lessons/LS01/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LS01 JS用法
6 |
7 |
8 |
9 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/lessons/LS01/js/demo01.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 |
4 | */
5 |
6 | //JavaScript与ECMAScript介绍 参见百度百科
7 | //修改
8 | //https://baike.baidu.com/item/javascript
9 |
10 | //https://baike.baidu.com/item/ECMAScript
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/lessons/LS01/js/demo02.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | /*
5 | console.log("i'm demo");
6 | */
7 |
8 | //demo01中定义,demo02中调用,尽量避免全局方法
9 | // function max (a,b) {
10 | // return a>b?a:b;
11 | // }
12 |
13 |
14 | //避免滥用全局变量,见demo2.js
15 | var x = 10;
16 | document.onclick = function () {
17 | //console.log("x = ",x);
18 | alert("x = "+x);
19 | };
20 |
21 |
22 | /*
23 | //如何避免全局污染,使用IIFE函数立即执行表达式
24 | (function () { // 开始
25 | var x = 10;
26 | document.onclick = function () {
27 | //console.log("x = ",x);
28 | alert("x = "+x);
29 | };
30 | })(); // 结束
31 | */
--------------------------------------------------------------------------------
/lessons/LS01/js/demo03.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | /*
5 | console.log("i'm demo ");
6 | //console.error("demo error");
7 | console.trace();
8 | */
9 | // console.log("max = "+ max(2,3));
10 |
11 |
12 | //(function(){
13 | //避免滥用全局变量
14 | var x = 20;
15 | //}());
16 |
--------------------------------------------------------------------------------
/lessons/LS01/js/demo04.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //基本语法回顾
5 | var x;//变量声明 区分声明与定义(对比其他语言 JS的语言特点,动态类型、弱类型)语句
6 | x = 23;//表达式作为语句时(赋值表达式语句)
7 |
8 | //条件语句
9 | if(x>22){
10 | x+=2;
11 | }else{
12 | console.log("x 不大于 22");
13 | }
14 |
15 | var xx = 234;
16 | if(234 == xx){ //为什么要反写?????
17 | console.log("相等");
18 | }
19 |
20 | //思考
21 | console.log(a);
22 | if(true){
23 | var a = 2;
24 | }
25 | console.log(a);
26 |
27 | console.log(b);
28 | if(false){
29 | var b = 3;
30 | }
31 | console.log(b);
32 |
33 |
34 | //循环语句
35 | for(var i=0;i<3;i++){
36 | console.log("i:",i);
37 | }
38 | console.log(i);//是否会报错,若不报错的话此时i为多少?????
39 |
40 | //函数定义及调用 提问:函数有几种定义方式?????
41 | function max(x,y) {
42 | return x>y?x:y;
43 | }
44 | console.log(max(2,3));
--------------------------------------------------------------------------------
/lessons/LS01/js/demo05.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/9/7.
3 | */
4 | //复合运算符
5 | var a = 3;
6 | a+=5;
7 | console.log(a);
8 |
9 | //标识符规则一下哪个不合法
10 | // _str
11 | // num
12 | // $abc
13 | // 8def
14 |
15 | //保留字回顾 认识多少?????
16 | //arguments break continue typeof instanceof delete等等
17 |
18 | console.log(typeof NaN);//什么类型
19 | console.log(typeof Infinity);
20 |
21 |
--------------------------------------------------------------------------------
/lessons/LS01/js/demo07.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/9/7.
3 | */
4 | //布尔类型与逻辑运算符
5 |
6 | //逻辑与、或的基本理解
7 | console.log(2>1&&4<5);
8 | console.log(true&&(!2));
9 | console.log(false&&("2" == 2));
10 | console.log(false&&false);
11 |
12 | console.log(2>1||4<5);
13 | console.log(true||(!2));
14 | console.log(false||("2" == 2));
15 | console.log(false||false);
--------------------------------------------------------------------------------
/lessons/LS01/js/demo08.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/9/7.
3 | */
4 | //数字类型
5 | console.log(1===1.0);
6 | console.log(Number("xyz"));
7 | console.log(3/0);
8 |
9 |
--------------------------------------------------------------------------------
/lessons/LS01/js/demo09.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/9/7.
3 | */
4 | var a = 10;
5 | console.log(++a);
6 |
7 | var b = 20;
8 | console.log(b++);
--------------------------------------------------------------------------------
/lessons/LS01/js/demo10.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/9/7.
3 | */
4 | //字符串链接
5 | var a = "abc";
6 | var b = "def";
7 | var c = a+b;
8 |
9 | //字符串常用方法,字符串的方法源于String.prototype
10 | var str1 = "aaa".concat("bbb");//返回字符串
11 | var str2 = "abcdef".slice(2);
12 | var str3 = "abcdef".slice(2,5);
13 | var str4 = "abcdef".slice(-2);
14 | var str5 = "abcdef".slice(2,-2);
15 |
16 | var str6 = "abcdef".split("c");//返回数组
17 | var str7 = "abcdef".split("c",1);
18 | var str8 = "abcdef".split("c",2);
19 |
20 | var str9 = "abcdef".charAt(2);
21 | var str10 = "abcdefabcdef".indexOf("d",1);
22 | var str11 = "abcdefabcdef".indexOf("d",4);//从第4个开始找
23 |
24 | var str12 = " abc def \r\n ".trim();//返回已移除前导空格、尾随空格和行终止符的原始字符串
25 |
26 | //substr 与 substring的区别
27 | var str13 = "abcdefghijklmn";
28 | var str14 = str13.substr(2,5);//后一个参数代表长度
29 | console.log(str13,str14);//str13 未受到破坏
30 |
31 | var str15 = str13.substring(2,5);//后一个参数代表第几个end
32 | console.log(str13,str15);//str13 未受到破坏
33 |
--------------------------------------------------------------------------------
/lessons/LS01/js/demo11.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/9/7.
3 | */
4 | //条件语句 switch 贯穿在后续课程中介绍
5 |
6 | //循环语句
7 | for(var i=0;i<10;i++){
8 | console.log("i:",i);
9 | }
10 | console.log("out of for:",i);//此时为多少
11 |
12 | //break和continue
13 | //练习输出0到20之间的奇数
14 |
--------------------------------------------------------------------------------
/lessons/LS01/js/demo12.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/9/7.
3 | */
4 | //函数定义 注意分号
5 | function max(a,b) {
6 | return a>b?a:b;
7 | }
8 | console.log(max(2,3));
9 |
10 | var min = function(a,b){
11 | return ay?x:y;
32 | }(4,5));
33 |
34 | var result = function min(x,y) {
35 | return x
2 |
3 |
4 |
5 | LS02 数据类型、值与变量
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/lessons/LS02/js/demo01.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //类型检测 typeof 一般用于值类型检测
5 | console.log(typeof 123);
6 | console.log(typeof true);
7 | console.log(typeof "abc");
8 | console.log(typeof null);
9 | console.log(typeof undefined);
10 | console.log(typeof {name:"Mike",age:20});
11 |
12 | console.log(typeof function foo(){});
13 |
14 | /*
15 | //课外思考
16 | console.log(typeof Array);
17 | console.log(typeof Function);
18 | console.log(typeof Date);
19 | console.log(typeof Number);//String、Boolean
20 |
21 | console.log(typeof Math);
22 | console.log(typeof JSON);
23 | */
24 |
25 | //类型检测 instanceof (左侧操作数为对象,右侧操作数为原型链中的一个类型时,返回为true)
26 | var a = {name:"Mike",age:20};
27 | console.log(a instanceof Object);
28 |
29 | var b = [12,34,{},""];
30 | console.log(b instanceof Array);//思考console.log(b instanceof Object);
31 |
32 | var Person = function(){
33 | //...
34 | };
35 | var p1 = new Person();
36 | console.log(p1 instanceof Person);//思考console.log(p1 instanceof Object);
37 |
38 |
--------------------------------------------------------------------------------
/lessons/LS02/js/demo02.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | // 基本(原始)数据类型与引用(对象)类型的区别 内存分配方式不同
5 | // 内存的分配方式影响变量的生命周期
6 | // 函数局部变量中的值类型变量与引用类型变量
7 |
8 | function foo() {
9 | var n = 10;
10 | var m = true;
11 | var str = "Hello World"; // str:"Hello World"存在栈中
12 |
13 | // obj的引用存在栈中,{value:"Hello World"}存在堆中,通过栈中的变量名obj(访问地址)访问
14 | var obj = { value: "Hello World" };
15 | };
16 | foo();
17 |
18 | //思考 a和b分配在那个区:
19 | var a = 23;//window.a
20 | var b = 34;//window.b
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/lessons/LS02/js/demo03.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 |
5 | (function () {
6 | //基本(原始)数据类型与引用(对象)类型的区别 赋值方式不同
7 | var str_a = "a"; //
8 | var str_b = str_a; // 原始类型直接访问值,是值赋值
9 | str_b = "b"; // str_b的值为"b",而str_a的值仍然是"a"
10 | console.log(str_a,str_b);
11 |
12 | var obj_a = {v:"a"}; // obj_a存的是引用,引用堆内存中存的对象:{v:"a"};
13 | var obj_b = obj_a; // obj_b存的也是引用,引用了堆内存的值{v:"a"};是引用赋值
14 | obj_b.v = "b"; // 通过obj_b访问(修改)堆内存的变量,这时候堆内存中对象值为:{v:"b"},由于obj_a和obj_b引用的是堆内存中同一个对象值,
15 | // 所以这时候打印都是{v:"b"}
16 | console.log(obj_a,obj_b);
17 |
18 | obj_b = {v:"c"}; // 注意:因为改的是整个对象,这里会在堆内存中创建一个新的对象值:{v:"c"},而现在的obj_b引用的是这个对象,
19 | // 所以这里打印的obj_a依旧是{v:"b"},而obj_b是{v:"c"}(两者在内存中引用的是不同对象了)。
20 | console.log(obj_a,obj_b);
21 | }());
22 |
23 | //注意:是值赋值还是引用赋值取决于变量的类型,而不取决于变量分配在堆区还是栈区
24 | var obj_c = {x1:2,y1:3};//obj_c.x1在堆区还是栈区
25 | var obj_d = {x2:2,y2:3};
26 |
27 | console.log(obj_c.x1 === obj_d.x2);
28 | console.log(obj_c === obj_d);
29 |
30 | console.log({m:1}==={m:1});
31 |
32 | //经典案例
33 | //
34 | var a =123;
35 | function foo1(x){
36 | x = 345;
37 | }
38 | foo1(a);
39 | console.log(a);
40 |
41 | //
42 | var a ={y:123};
43 | function foo2(x){
44 | x.y = 345;
45 | }
46 | foo2(a);
47 |
48 | console.log(a.y);
49 |
50 | //
51 | var a ={y:123};
52 | function foo3(x){
53 | x.y = 345;
54 | x = {y:456};
55 | }
56 | foo3(a);
57 | console.log(a.y);
58 |
59 | //
60 | var a ={y:123};
61 | function foo4(x){
62 | x = {y:456};
63 | x.y = 345;
64 | }
65 | foo4(a);
66 | console.log(a.y);
67 |
--------------------------------------------------------------------------------
/lessons/LS02/js/demo04.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | (function () { //立即执行表达式开始
5 | //基本(原始)数据类型与引用(对象)类型的区别1 判等不同
6 | var a1 = 100;
7 | var b1 = 100;
8 | console.log(a1 == b1);
9 | console.log(a1 === b1);
10 |
11 | //
12 | var a2 = new Number(200);
13 | var b2 = new Number(200);
14 | console.log(a2 == b2);
15 | console.log(a2 === b2);
16 |
17 | //
18 | var a3 = new Number(200);
19 | var b3 = a3;
20 | console.log(a3 == b3);
21 | console.log(a3 === b3);
22 |
23 | b3 = new Number(200);
24 | console.log(a3 === b3);
25 | /*
26 | //思考
27 | var a4 = new Number(200);
28 | var b4 = 200;
29 | console.log(a4 == b4);//思考:是b4转换了,还是a4转换了
30 | console.log(a4 === b4);
31 |
32 | //思考
33 | var a5 = {x:1,y:2};
34 | var b5 = {x:1,y:2};
35 | console.log(a5 === b5);
36 | console.log(a5.x === a5.x);//对象属性如果是基本类型内存分配在哪,比较时是值比较还是引用比较
37 | */
38 | }());//立即执行表达式结束
--------------------------------------------------------------------------------
/lessons/LS02/js/demo05.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | (function () {//立即执行表达式开始
5 |
6 | // 基本(原始)数据类型与引用(对象)类型的区别2 函数参数传递方式不同
7 | // 值传递
8 | var str_a = "Hello World";
9 | function fn_a(arg){
10 | console.log(arg); // #1 --> Hello World
11 | arg = "Hai";
12 | console.log(str_a,arg); // #2 --> Hello World , Hai
13 | };
14 | fn_a(str_a);
15 | console.log(str_a);// #3 这时候str_a:"Hello World"
16 |
17 | //从上面#1处可以看出,传入函数fn_a的是str_a的值
18 | //并且内存中分配了新的空间来保存函数参数和其值(函数运行后自动释放这部分内存)
19 | //所以在#2处打印的是2个不同的字符串。也正是因为传值时候对str_a值进行了值的复制,而这又是原始类型的值,
20 | //所以在#3处的str_a与早先声明的str_a保持一致
21 |
22 |
23 | // 引用传递
24 | var obj_a = {value:1};
25 | function fn_a(arg){
26 | arg.value=3;
27 | };
28 | fn_a(obj_a);
29 | console.log(obj_a);// 这时候obj_a是{value:3}
30 |
31 | function fn_b(arg){
32 | arg={value:2};//创建了一个新的对象,arg指向新对象
33 | };
34 | fn_b(obj_a);
35 | console.log(obj_a);// 这时候obj_a是{value:3}
36 |
37 | // 上面这个问题也可以从内存角度去理解,两个函数都是传址,而这个址引用了obj_a在内存中对应的对象,
38 | // 所以两个函数中的arg起初都是引用和obj_a同一个内存中的对象值,
39 | // 而fn_a中访问的依旧是和obj_a同一个内存对象,所以fn_a修改是成功的,
40 | // 但是在fn_b中重新为arg赋值新的对象,arg指向新对象并不会影响obj_a
41 |
42 | }());//立即执行表达式结束
--------------------------------------------------------------------------------
/lessons/LS02/js/demo06.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 |
5 | var a1 = 20;
6 | var a2 = 23.4;
7 | console.log(parseInt(a2));//如果是非数字,则先转换为字符串,然后在转成整型
8 | console.log(parseFloat("23.456xy"));//同上,结果为23.456
9 | //注意:parseInt和parseFloat都为全局方法,即window全局对象的方法
10 | console.log(parseInt === window.parseInt);
11 | console.log(parseFloat === window.parseFloat);
12 | //思考:函数、对象属性、对象方法之间的关系
13 | //思考:在node.js中全局对象是什么?
14 |
15 |
16 | console.log(Math.ceil(a2));
17 | console.log(Math.floor(a2));
18 | console.log(Math.round(a2));
19 | a3 = 5e2;//指数形式
20 | console.log(a3);
21 | console.log(typeof Math);//输出function 还是 object ?
22 |
23 | //NaN
24 | var x = Number("xis021");//试着转成Number类型
25 | console.log(x);//NaN
26 | isNaN(x);//true
27 | typeof NaN;
28 |
29 | console.log(Math.log(-1));//NaN
30 | console.log(Math.acos(2));//NaN
31 | console.log(NaN === NaN);//false
32 |
33 |
34 | //Infinity与-Infinity
35 | var y1 = 2/0;
36 | console.log(y1);//Infinity
37 | var y2 = -2/0;
38 | console.log(y2);//-Infinity
39 | isFinite(y2);//false,非有限数
40 | isFinite(23);//true,有限数
41 |
42 | //0与-0
43 | var z1 = 1/Infinity;
44 | console.log(z1);//0
45 | var z2 = -1/Infinity;
46 | console.log(z2);//-0
47 |
48 |
49 |
--------------------------------------------------------------------------------
/lessons/LS02/js/demo07.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //JavaScript字符串的编码方式,Unicode字符集和UTF-16编码方式,参考链接:
5 | //http://www.ruanyifeng.com/blog/2014/12/unicode.html
6 |
7 | //字面量
8 | var str = "abc_def_ghi_jkl_mn";
9 |
10 | //转义字符 \n \" \' \\
11 | console.log("abc\ndefghi\\\n\'mn\'");
12 |
13 | //字符串常用操作
14 | var str = "abc_def_ghi_jkl_mn";
15 | // str.split("_");
16 | // str.split("_",2);
17 | // str.concat("_opq");
18 | // str.substr(4,7);
19 | // str.substring(4,7);
20 | // str.slice(2);
21 | // str.slice(2,5);
22 | // str.slice(-2);
23 | // str.slice(2,-2);
24 | // 更多内容参见下一章节
25 |
26 | // str.bold();
27 | // str.link();
28 | // str.fontcolor("red");
29 | // str.fontsize(50);
30 |
31 |
32 | //模式匹配,参加后续正则表达式章节
33 |
--------------------------------------------------------------------------------
/lessons/LS02/js/demo08.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 |
5 | //Bool类型的值只有两个 true、false
6 |
7 | //Undefined 的几种情况
8 | var a;
9 | console.log(a);//undefined
10 | //注意:分清未定义与未声明的区别 undefined与 undeclare
11 | //没有加var 直接使用a是否会报错?
12 |
13 | function foo(x,y) {
14 | console.log(x,y);//1 undefined
15 | }
16 | foo(1);
17 |
18 | function fee() {
19 | //没有返回值的情况
20 | }
21 | var feeReturnValue = fee();
22 | console.log(feeReturnValue);//undefined
23 |
24 |
25 | //null 需要注意的一点
26 | console.log(typeof null);//object
27 |
--------------------------------------------------------------------------------
/lessons/LS02/js/demo09.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 |
5 | //对象类型 简述
6 | var obj = {x:1,y:2};//obj的原型是Object.prototype,并且obj继承的属性和方法都源于这个原型
7 | console.log(obj.__proto__ === Object.prototype);
8 | console.log(Object.prototype);
9 |
10 | var arr = [1,2,3,4,5];//arr的原型是Array.prototype,并且arr继承的属性和方法都源于这个原型
11 | console.log(arr.__proto__ === Array.prototype);
12 | console.log(Array.prototype);
13 | console.log(arr.__proto__.__proto__ === Object.prototype);
14 |
15 | function foo() { //foo的原型是Function.prototype,并且foo继承的属性和方法都源于这个原型
16 | console.log("foo function!");
17 | };
18 | console.log(foo.__proto__ === Function.prototype);
19 | console.log(foo.__proto__.__proto__ === Object.prototype);
20 |
21 | console.log(obj instanceof Object);
22 | console.log(arr instanceof Object);
23 | console.log(foo instanceof Object);
24 | console.log(foo === window.foo);
25 |
26 | //思考:isa的关系
27 |
28 | //所有对象都有属性,如何查看对象的属性,ES5中查看属性相关的几种方法
29 | for(var k in obj){//只能遍历整个原型链上所有可遍历的属性
30 | console.log(k,obj[k]);
31 | }
32 |
33 | console.log(Object.keys(obj));//返回一个数组,包含自身所有可枚举的属性
34 |
35 | console.log("x" in obj);//能够检查整个原型连上的属性,包括不可遍历的属性
36 |
37 |
38 | //注意:以下实例只做了解,具体内容在对象属性特性章节和函数对象章节详细介绍
39 | //函数也是对象,也不例外,函数也有若干属性 查看foo函数都有哪些属性
40 | for(var k in foo){
41 | console.log(k,foo[k]);//没有自身属性,所以没有输出
42 | }
43 | console.log("call" in foo);//true
44 | console.log("apply" in foo);//true
45 | console.log("arguments" in foo);//true
46 |
47 |
--------------------------------------------------------------------------------
/lessons/LS02/js/demo10.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //包装对象
5 | var a = 123;
6 | var b = new Number(a);
7 |
8 | console.log(a == b);
9 | console.log(a === b);//true or false 为什么
10 |
11 | //临时包装对象
12 | var str = "abcde";
13 | console.log(str.length);//5 临时包装成了String对象
14 | str.length = 1;
15 | console.log(str.length,str);//5 "abcde" 临时包装对象并不影响原始值
16 |
17 | var arr = [1,2,3,4];
18 | console.log(arr.length);//4
19 | arr.length = 1;
20 | console.log(arr.length,arr);//1 [1]
--------------------------------------------------------------------------------
/lessons/LS02/js/demo11.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //Part 1
5 | console.log(Boolean(undefined));
6 | console.log(Boolean(null));
7 | console.log(Boolean(0));
8 | console.log(Boolean(NaN));
9 | console.log(Boolean(1));
10 | console.log(Boolean(""));
11 | console.log(Boolean("abc"));
12 | console.log(Boolean({}));
13 |
14 | if(new Boolean(false)){
15 | console.log("执行");
16 | }
17 |
18 | //Part 2
19 | console.log(Number(undefined));
20 | console.log(Number(null));
21 | console.log(Number(true));
22 | console.log(Number(false));
23 | console.log(Number(""));
24 | console.log(Number("abc"));
25 | console.log(Number("123.345xx"));//
26 | console.log(Number("32343,345xx"));
27 | console.log(Number({x:1,y:2}));
28 |
29 | console.log(parseFloat("123.345xx"));
30 | console.log(parseFloat("32343,345xx"));
31 | console.log(parseInt("123.345xx"));
32 | console.log(parseInt("32343,345xx"));
33 |
34 | //Part 3
35 | console.log(String(undefined));
36 | console.log(String(null));
37 | console.log(String(true));
38 | console.log(String(false));
39 | console.log(String(0));
40 | console.log(String(234));
41 | console.log(String({x:1,y:2}));
--------------------------------------------------------------------------------
/lessons/LS02/js/demo12.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | // Part11111111 隐式类型转换
5 | //比较运算符 与 隐式类型转换
6 | var a = 3;
7 | var b = 4;
8 | console.log(typeof (a>b),a>b);
9 | console.log(typeof (a==b),a==b);
10 | console.log(typeof (a
2 |
3 |
4 |
5 | LS02 数据类型、值与变量
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/lessons/LS03/js/demo13.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //Number构造器属性(静态属性)
5 | Number.MAX_VALUE
6 | Number.MIN_VALUE
7 | Number.NaN
8 | Number.NEGATIVE_INFINITY
9 | Number.POSITIVE_INFINITY
10 |
11 | //Number原型方法(Number对象继承的方法)
12 | // Number.prototype.toFixed();
13 | // Number.prototype.toPrecision();
14 | // Number.prototype.toString();
15 | // Number.prototype.toExponential();
16 |
17 | var n1 = 12345.6789;
18 | console.log(n1.toFixed(2));
19 | console.log(n1.toPrecision(2));
20 | console.log(n1.toString());
21 | console.log(n1.toExponential(2));
22 |
23 | //
24 | console.log(NaN === NaN);
25 | console.log(isNaN("12,3"));
26 | console.log(Math.floor(3.8));
27 | console.log(Math.floor(-3.8));
28 | console.log(Math.ceil(3.2));
29 | console.log(Math.ceil(-3.2));
30 | console.log(Math.round(-3.2));
31 | console.log(Math.round(-3.5));
32 | console.log(Math.round(-3.8));
33 |
34 | //其余部分参见《深入理解JS》第11章
35 |
36 |
--------------------------------------------------------------------------------
/lessons/LS04/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LS03
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/lessons/LS04/js/demo01.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //上一章数据类型知识点回顾 Part1~Part3
5 | //Part1
6 | var a = [1,2,3];
7 | var b = a;
8 | console.log(a,b);
9 | b.pop();
10 | console.log(a,b);
11 | b = [4,5,6];
12 | console.log(a,b);
13 |
14 | //Part2
15 | function foo(x) {
16 | x.push(4);
17 | x = [5,6,7];
18 | x.push(8);
19 | //console.log(x);
20 | }
21 | var a = [1,2,3];
22 | foo(a);
23 | console.log(a);
24 |
25 | //Part3
26 | function foo(x) {
27 | x.push(4);
28 | //console.log(x);
29 | x.length = 0;
30 | x.push(5,6,7,8);
31 | //console.log(x);
32 | }
33 | var a = [1,2,3];
34 | foo(a);
35 | console.log(a);
36 |
37 |
38 |
39 |
40 | //字面量
41 | var obj = {x:1,y:2};
42 | var arr = [1,2,3,4,5];
43 |
44 | //关键字知多少 arguments、break、continue...
45 |
46 | //表达式与语句 表达式语句
47 | var o = {x:1,y:2};
48 | a>b;
49 |
50 | // 存在二义性的语句,要避免有二义性的语句
51 | var max = function (x,y) {
52 | return x>y?x:y;
53 | };
54 | // 下述代码是对象还是语句块
55 | {
56 | foo:max(2,3)
57 | }
58 |
59 | // 存在二义性的语句 补充一
60 | var max = function (x,y) {
61 | return x>y?x:y;
62 | };
63 | var x = {
64 | foo:max(2,3)
65 | }
66 |
67 | // 存在二义性的语句 补充二
68 | var max = function (x,y) {
69 | return x>y?x:y;
70 | };
71 | {
72 | console.log(123);
73 | console.log(456);
74 | foo:max(2,3)
75 | }
76 |
77 |
78 |
--------------------------------------------------------------------------------
/lessons/LS04/js/demo02.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //Part1111111111 不同类型的表达式
5 | 23;//其中的23为原始表达式
6 | obj = {x:2};// ={x:2}为对象初始化表达式
7 | arr = [1,2];// =[1,2]为数组初始化表达式
8 | var foo = function(){ // = function(){}为函数定义表达式
9 | console.log("foo");
10 | };
11 | obj.x;//obj.x为属性访问表达式
12 | foo();//foo()为函数调用表达式
13 | 2+3;//2+3为算数运算表达式
14 | 2>3;//2>3为关系运算表达式
15 | 1&&2;//1&&2为逻辑运算表达式
16 |
17 |
18 | //Part222222222 关于语句
19 | 2>3;//表达式语句
20 | //条件语句
21 | var a=2,b=3;
22 | if(a>b){
23 | console.log("a > b");
24 | }else{
25 | console.log("a < b");
26 | }
27 |
28 | //扩展知识在chrome中测试下述代码: var a,b; 与 var a=b; 谁是局部变量,谁是全局变量?
29 | function foo(){
30 | var a=b=3;
31 | }
32 | foo();
33 | console.log("b:",b);//是否报错?输出几?为什么?
34 | console.log("a:",a);//是否报错?
35 |
36 |
37 | //循环语句
38 | for(var i = 0;i<5;i++){
39 | console.log("in for ",i);
40 | }
41 | console.log("out for ",i);
42 |
--------------------------------------------------------------------------------
/lessons/LS04/js/demo03.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //ES5 中没有块作用域
5 | {
6 | var a = 20;
7 | }
8 | console.log("大括号外依然能访问到a:",a);
9 |
10 | for(var i = 0;i<5;i++){
11 | console.log("in for ",i);
12 | }
13 | console.log("out of for ",i);//报错么,输出啥?
14 |
15 | if(true){
16 | var a = 20;
17 | }
18 | console.log(a);
19 |
20 | // 思考:下边的例子是否报错,输出什么,相关知识参考预解析部分
21 | // 你是否能够区分undefined和undeclared
22 | if(false){
23 | var b = 30;
24 | }
25 | console.log(b);
26 |
27 | //C、C++、C#、Java等语言中的块,在线编译网站上查看
28 | /*
29 | #include
30 | using namespace std;
31 | int main()
32 | {
33 | for(int i =0;i<5;i++){
34 | cout<<"i = "<=60:
54 | alert('及格');
55 | break;
56 | case i<60:
57 | alert('不及格');
58 | break;
59 | default:
60 | alert('default');
61 | }
--------------------------------------------------------------------------------
/lessons/LS04/js/demo09.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | var i = 1;//i=2、3、4
5 | switch(i){
6 | case 1:
7 | console.log("case 1");
8 | case 2:
9 | console.log("case 2");
10 | break;
11 | case 3:
12 | console.log("case 3");
13 | //break;
14 | case 4:
15 | console.log("case 4");
16 | default:
17 | console.log("default");
18 | }
19 |
20 |
21 | // 利用switch的穿透性:求某月某日是一年中的第几天?
22 | var year = 2017,
23 | month = 5,
24 | date = 20,
25 | sum = 0;
26 | switch(month-1){
27 | case 11:
28 | sum += 30;
29 | case 10:
30 | sum += 31;
31 | case 9:
32 | sum += 30;
33 | case 8:
34 | sum += 31;
35 | case 7:
36 | sum += 31;
37 | case 6:
38 | sum += 30;
39 | case 5:
40 | sum += 31;
41 | case 4:
42 | sum += 30;
43 | case 3:
44 | sum += 31;
45 | case 2:
46 | sum += year%4==0&&year%100!=0||year%400==0?29:28;
47 | case 1:
48 | sum += 31;
49 | default:
50 | sum += date;
51 | }
52 | console.log(sum);
--------------------------------------------------------------------------------
/lessons/LS04/js/demo10.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 |
5 |
6 | //for ... in 遍历数组
7 | var arr = [2,,"33"];
8 | for(var i in arr){
9 | console.log(i,arr[i]);
10 | }
11 |
12 | //for ... in 遍历对象
13 | var obj = {x:10,y:20,z:"30"};
14 | for(var k in obj){
15 | console.log(k,obj[k],typeof obj[k]);
16 | }
17 | //
18 | var obj1 = {x:1};
19 | var obj2 = Object.create(obj1);
20 | obj2.y = 2;
21 | obj2.z = 3;
22 | for(var k in obj2){
23 | console.log(k,obj2[k]);
24 | }
25 |
26 |
--------------------------------------------------------------------------------
/lessons/LS05/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LS03
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/lessons/LS05/js/demo11.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | var a = 34;
5 | if(a = 45){
6 | console.log("是否会输出?");
7 | }
8 |
9 | var b = 34;
10 | if(45 == b){//为什么要这样写,有什么好处
11 | console.log("是否会输出?");
12 | }
--------------------------------------------------------------------------------
/lessons/LS05/js/demo12.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | console.log("1"+"2"); //"12"
5 | console.log("1"+2); //"12"
6 | console.log(1+{}); //"1[object Object]"
7 | console.log(true+true); //2
8 | console.log("5"-2); //3
9 |
10 | //
11 | var x = "1";
12 | console.log(++x); //2 注意++和--的隐式类型转换
13 | var x = "1";
14 | console.log(x+1);//11
15 | // 思考:+= 是转成字符串类型还是转成数字类型
16 | // 不同情况下转换的类型不同
17 | var x = "1";
18 | console.log(x+=1);
19 | var x = 1;
20 | console.log(x+=1);
21 |
22 | //回顾++i 与 i++
23 | var i=1;
24 | var y = ++i + ++i + ++i;
25 | console.log(y);
26 |
--------------------------------------------------------------------------------
/lessons/LS05/js/demo13.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 |
5 | //下例中有几个是false?(A:0个, B:1个, C:2个, D:3个),运行一下看看
6 | console.log(3===3);
7 | console.log(3==="3");
8 | console.log(3=="3");
9 | console.log(3==new String(3));
10 | console.log(3===new String(3));
11 |
12 | //下例中有几个是false?(A:0个, B:1个, C:2个, D:3个),运行一下看看
13 | var obj1 = new String("xyz");
14 | var obj2 = new String("xyz");
15 | console.log("xyz"===obj1);
16 | console.log(obj1 == obj2);
17 | console.log(obj1 === obj2);
18 | console.log(obj1 == new String("xyz"));
19 |
20 |
21 | //下例中有几个是false?(A:0个, B:1个, C:2个, D:3个),运行一下看看
22 | var obj1 = new String("xyz");
23 | var obj2 = new String("xyz");
24 | console.log("xyz"!=obj1);
25 | console.log(obj1 !== obj2);
26 | console.log(obj1 != obj2);
27 | console.log(obj1 != new String("xyz"));
28 |
29 | //注意 是引用类型转换到基本类型了?还是基本类型转换到引用类型了?
30 | console.log(2 == 2);
31 | console.log(new Number(2) == new Number(2));
32 | console.log(2 == new Number(2));
33 |
34 | //存在二义性的代码,与预期的结果不一致
35 | var obj1 = {x:2,y:[1],z:false};
36 | var obj2 = {x:2,y:[1],z:new Boolean(false)};
37 | //var obj2 = {x:2,y:[1],z:Boolean(new Boolean(false))};
38 | console.log(obj1.z == obj2.z);
39 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/lessons/LS06/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LS03
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/lessons/LS06/js/demo14.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //逻辑与、或的基本理解
5 | console.log(2>1&&4<5);
6 | console.log(true&&(!2));
7 | console.log(false&&("2" == 2));
8 | console.log(false&&false);
9 |
10 | console.log(2>1||4<5);
11 | console.log(true||(!2));
12 | console.log(false||("2" == 2));
13 | console.log(false||false);
--------------------------------------------------------------------------------
/lessons/LS06/js/demo15.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //操作数非布尔类型,&&短路原则
5 | console.log(2&&4);
6 | console.log(0&&4);
7 | console.log({x:2}&&{name:"Jack"});
8 | console.log(null&&"hello");
9 | console.log({}&&"world");
10 |
11 | //操作数非布尔类型,||短路原则
12 | console.log(2||4);
13 | console.log(0||4);
14 | console.log({x:2}||{name:"Jack"});
15 | console.log(null||"hello");
16 | console.log({}||"world");
17 |
18 | //思考 所有对象转换为布尔类型 都为 true
19 | console.log((new Boolean(false))&&234);
20 | console.log((new Boolean(false))||234);
21 |
--------------------------------------------------------------------------------
/lessons/LS06/js/demo16.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/21.
3 | */
4 | var score = 76;
5 | if(score>90){
6 | console.log("优");
7 | }else if(score>75){
8 | console.log("良");
9 | }else if(score>60){
10 | console.log("及格");
11 | }else{
12 | console.log("不及格");
13 | }
14 |
15 | //通过&&和||的组合实现如上功能,注:小括号优先级最高
16 | console.log((score>90&&"优")||(score>75&&"良")||(score>60&&"及格")||"不及格");
--------------------------------------------------------------------------------
/lessons/LS06/js/demo17.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/21.
3 | */
4 | var sum = function(a,b,c){
5 | b = b||4;
6 | c = c||5;
7 | return a+b+c;
8 | };
9 | console.log(sum(1,2,3));
10 | console.log(sum(1,2));
11 | console.log(sum(1));
12 | // console.log(sum(1,0,0));
13 |
14 | //优化改造版本
15 | var sum = function(a,b,c){
16 | if(b!=false){b = b||4;}//(b!=false)&&(b=b||4);
17 | if(c!=false){c = c||5;}//(c!=false)&&(c=c||5);
18 | return a+b+c;
19 | };
20 | console.log(sum(1,2,3));
21 | console.log(sum(1,2));
22 | console.log(sum(1));
23 | console.log(sum(1,0,0));
--------------------------------------------------------------------------------
/lessons/LS07/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LS04
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/lessons/LS07/js/demo01.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //函数定义 函数声明方式
5 | function max(a,b){
6 | return a>b?a:b;
7 | }
8 | max(2,3);
9 |
10 | //函数定义 函数表达式方式 等号右侧可以是匿名函数也可以是非匿名函数
11 | var max = function (a,b){ //匿名函数
12 | return a>b?a:b;
13 | };
14 | max(2,3);
15 |
16 | /*
17 | //略讲:非匿名函数便于调用栈追踪 测试使用匿名和非匿名函数的区别
18 | var foo = function max(a,b){
19 | console.trace();
20 | return console.log(a>b?a:b);
21 | };
22 | foo(2,3);
23 |
24 | foo = function min(a,b){
25 | console.trace();
26 | return console.log(a>b?b:a);
27 | };
28 | foo(2,3);
29 | */
30 |
31 | //函数定义 Function构造函数方式
32 | var max = new Function("a","b","return a>b?a:b");
33 | max(2,3);
34 |
35 | //理解 new Function
36 |
--------------------------------------------------------------------------------
/lessons/LS07/js/demo03.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //实参数大于形参数
5 | function test() {
6 | console.log(arguments);
7 | console.log(test.arguments==arguments,arguments);
8 | // console.log(arguments.length);
9 | // console.log(typeof arguments);
10 | // console.log(arguments instanceof Array);//false
11 | // console.log(arguments instanceof Object);
12 | console.log(Array.prototype.slice.call(arguments));
13 | var s = "";
14 | for (var i = 0; i < arguments.length; i++) {
15 | s += arguments[i];
16 | }
17 | return s;
18 | }
19 | test("hello,", "world!");//"hello,world!"
20 |
21 |
22 | //实参数小于形参数
23 | var sum = function(a,b,c){
24 | b = b||4;
25 | c = c||5;
26 | return a+b+c;
27 | };
28 | console.log(sum(1,2,3));
29 | console.log(sum(1,2));
30 | console.log(sum(1));
31 |
--------------------------------------------------------------------------------
/lessons/LS07/js/demo04.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 |
5 | //值传递
6 | var a = 1;
7 | function foo(x) {
8 | console.trace("a:",a," x:",x);
9 | x = 2;//step 2222
10 | console.trace("a:",a," x:",x);//step 3333
11 | }
12 |
13 | console.trace("a:",a);
14 | foo(a);// step 1111
15 | console.trace("a:",a); // step 4444 a仍为1
16 |
17 |
18 |
19 | //引用传递
20 | var obj = {x:1};
21 | function fee(o){
22 | console.trace("obj.x :",obj.x," o.x :",o.x);
23 | o.x = 3;// step 2222
24 | console.trace("obj.x :",obj.x," o.x :",o.x);// step 3333
25 | }
26 |
27 | console.trace("obj.x :",obj.x);
28 | fee(obj);// step 1111
29 | console.trace("obj.x :",obj.x);//step 4444 obj.x被改写为3
30 |
31 | //打开index.html 学习chrome的Sources调试
32 | document.onclick = function () {//测试Event Listener Breakpoints
33 | alert("click");
34 | //var body = document.getElementsByName("body");
35 | };
--------------------------------------------------------------------------------
/lessons/LS08/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LS04
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/lessons/LS08/js/demo05.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 |
5 | function foo(){}
6 | console.log(foo); //
7 | console.log(typeof foo); //
8 | console.log(foo instanceof Object); //
9 | console.log(foo instanceof Function); //
10 | console.log(foo === window.foo); //
11 |
12 |
13 | console.log(typeof Function);//
14 | console.log(typeof Array); //
15 | console.log(typeof Date); //
16 | console.log(typeof Error); //
17 | console.log(typeof Math); //
18 | console.log(typeof JSON); //
19 |
20 |
21 | //思考:
22 | console.log(typeof new Function());// function or object
23 | console.log(typeof new Array()); // function or object
24 | console.log(typeof new Date()); // function or object
25 |
26 | //补充思考:
27 | console.log(Function instanceof Function);
28 | console.log(Function instanceof Object);
29 |
30 | console.log(Array instanceof Function);
31 | console.log(Array instanceof Object);
32 |
33 | console.log(Date instanceof Function);
34 | console.log(Date instanceof Object);
35 |
36 | console.log(Math instanceof Function);
37 | console.log(Math instanceof Object);
38 |
39 | console.log(JSON instanceof Function);
40 | console.log(JSON instanceof Object);
41 |
42 |
--------------------------------------------------------------------------------
/lessons/LS09/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LS04
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/lessons/LS09/js/demo09.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //词法作用域 与调用形式无关 详细内容参见作用域部分
5 | var name = "Jack";
6 | function echo() {
7 | console.log(name);
8 | }
9 | function foo() {
10 | var name = "Bill";
11 | echo();
12 | }
13 | foo();//Bill or Jack
14 |
15 |
16 |
17 |
18 | //全局变量与局部变量
19 | var x = "outside f1";
20 | var f1 = function () {
21 | //var x = "inside f1";//如果没有这行,则两次输出都为outside
22 | console.log(x);
23 | };
24 | f1();
25 | console.log(x);
26 |
27 |
28 | //若函数内未加var 则相当于创建了全局变量
29 | var f2 = function () {
30 | var y = "局部";
31 | //y = "全局";
32 | console.log(y);
33 | };
34 | f2();
35 | console.log(y);//若函数内有var此行报错,若函数内没有var则此行输出全局变量y值
36 |
37 | //ES5中无块作用域
38 | if(true){
39 | var z = 23;
40 | }
41 | console.log(z);//正常输出
42 |
43 | if(true){
44 | (function () { //IIFE start
45 | var z = 23;
46 | }()); //IIFE end
47 | }
48 | console.log(z);//报错
--------------------------------------------------------------------------------
/lessons/LS09/js/demo10.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | if(true){
5 | var i = 0;
6 | }
7 |
8 | function foo(){
9 | console.log("j:",j);//undefined
10 | var j = 10;
11 | console.log("j:",j);//10
12 | }
13 | foo();
14 |
15 | console.log("i:",i);//0
16 | console.log("j:",j);//报错
17 |
18 | //上边代码等价于
19 | var i;
20 | if(true){
21 | i = 0;
22 | }
23 |
24 | function foo(){
25 | var j;
26 | console.log("j:",j);//undefined
27 | j = 10;
28 | console.log("j:",j);//10
29 | }
30 | foo();
31 |
32 | console.log("i:",i);//0
33 | console.log("j:",j);//报错
--------------------------------------------------------------------------------
/lessons/LS10/index04_2.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Title
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/lessons/LS10/index05.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Title
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/lessons/LS10/js/demo01.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //全局作用
5 | var a = 10,
6 | b = 20;
7 | function fn() {
8 | //fn局部作用域
9 | var a = 100,
10 | c = 200;
11 | //console.log(a,b,c,d);
12 | function bar() {
13 | //bar局部作用域
14 | var a = 500,
15 | d = 600;
16 | console.log(a,b,c,d);
17 | }
18 | bar();
19 | }
20 | fn();
21 | //console.log(a,b,c,d);
22 |
23 |
24 |
--------------------------------------------------------------------------------
/lessons/LS10/js/demo02.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //JS 词法作用域
5 |
6 | var name = "Jack";
7 | function echo() {
8 | console.log(name);
9 | }
10 | echo();
11 |
12 |
13 | //词法作用域 与调用形式无关 实例一
14 | var name = "Jack";
15 | function echo() {
16 | console.log(name);
17 | }
18 | function foo() {
19 | var name = "Bill";
20 | echo();
21 | }
22 | foo();//Bill or Jack
23 |
24 |
25 |
26 | //词法作用域 与调用形式无关 实例二
27 | var name = "Jack";
28 | function echo() {
29 | console.log(name);
30 | }
31 | function foo() {
32 | var name = "Bill";
33 | function fee(){
34 | var name = "Lucy";
35 | echo();
36 | }
37 | fee();
38 | }
39 | foo();//Bill or Jack
40 |
41 |
42 | //通过new Function实例化的函数对象,不一定遵从静态词法作用域
43 | var scope = "g";
44 | function foo(){
45 | var scope = "l";
46 | return new Function("console.log(scope);")
47 | }
48 | foo()();
--------------------------------------------------------------------------------
/lessons/LS10/js/demo03.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //ES5中无块作用域
5 | {
6 | var a = 4;
7 | }
8 | console.log(a);
9 |
10 |
11 | //变量污染、变量共享问题,尤其是异步执行的情况下。如果是两个单独的文件的情况下,更容易造成变量污染
12 | var userId = 123;
13 | document.onclick = function () {
14 | console.log("userId = ",userId);
15 | //alert("userId = "+userId);
16 | };
17 | //一长串代码后,假如看不见上述代码了
18 | var a=2,b=3;
19 | if(a
2 |
3 |
4 |
5 | Title
6 |
39 |
40 |
41 |
54 |
55 |
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/lessons/LS11/index08.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Title
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/lessons/LS11/index09.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Title
6 |
7 |
38 |
39 |
40 |
41 |
42 |
43 |
44 | 导航0
45 | 导航1
46 | 导航2
47 | 导航3
48 |
49 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/lessons/LS11/js/demo06.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 |
5 | //立即执行表达式 常见形式
6 | (function max( x,y){
7 | console.log("the max is",x>y?x:y);
8 | }(2,3));
9 |
10 | (function (x,y){ //可以没有函数名
11 | console.log("the min is",xb?a:b;
32 | }(5,9);
33 |
34 |
35 | !function(x,y){
36 | return x==y?true:false; // === 返回什么
37 | }("5",5);
38 |
39 | //思考 !function(){return 2; }( ); 与 !function(){return 0; }();
--------------------------------------------------------------------------------
/lessons/LS11/js/demo07_1.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/30.
3 | */
4 | /*
5 | //文件内的变量污染问题,尤其是异步执行的情况下
6 | var userId = 123;
7 | document.onclick = function () {
8 | console.log("userId = ",userId);
9 | //alert("userId = "+userId);
10 | };
11 |
12 | //一长串代码后,假如看不见上述代码了
13 | (function () {
14 | var a=2,b=3;
15 | if(a max){
31 | console.log(x);
32 | }
33 | };
34 | (function (f) {
35 | var max = 100;
36 | f(15);
37 | })(fn);
--------------------------------------------------------------------------------
/lessons/LS12/ClosureTest.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | ClosureTest
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/lessons/LS12/index11.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Title
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/lessons/LS12/index16.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Title
6 |
7 |
8 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/lessons/LS12/js/ClosureTest.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/9/27.
3 | */
4 | //将demo12、demo13中的部分代码复制到下边,然后进行断点调试
5 | //加深对闭包的理解
--------------------------------------------------------------------------------
/lessons/LS12/js/demo12.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //Part 11111111111111//////////////////
5 | var tmp = 100;//注意:词法作用域,形成的闭包是否包含此行的变量tmp?
6 | function foo(x) {
7 | var tmp = 3;//注意:词法作用域,思考:若屏蔽此行,会输出什么?foo之外的tmp是否为闭包的一部分?
8 | return function (y) {
9 | console.log(x + y + (++tmp));
10 | }
11 | }
12 | var fee = foo(2); // fee 形成了一个闭包
13 | fee(10);//
14 | fee(10);//
15 | fee(10);//
16 |
17 |
18 | //闭包嵌套,扩展知识(了解即可),思考下述代码中存在几个闭包,设置断点调试
19 | function f1(m){
20 | var z = 100;
21 | function f2(x) {
22 | return function (y) {
23 | console.log(x + y + (++z));//设置断点,查看有几个闭包
24 | }
25 | }
26 | return f2(m);
27 | }
28 | var f3 = f1(2);
29 | f3(10);
30 | f3(10);
31 | //思考有几个闭包,x和z分别属于哪个闭包
32 |
33 |
34 | //Part 2222222222222//////////////////
35 | function foo(x) {
36 | var tmp = 3;
37 | return function (y) {
38 | x.count = x.count ? x.count + 1 : 1;
39 | console.log(x + y + tmp,x.count);
40 | }
41 | }
42 | var age = new Number(2);
43 | var bar = foo(age); //和相关作用域形成了一个闭包
44 | bar(10); //输出什么?
45 | bar(10); //输出什么?
46 | bar(10); //输出什么?
47 |
48 |
49 | // Part 33333333333
50 | function fn() {
51 | var max = 10;//若屏蔽此行,则输出为多少?
52 | return function bar(x) {
53 | if(x > max){
54 | console.log(x);
55 | }else {
56 | console.log(max);
57 | }
58 | }
59 | }
60 | var f1 = fn();
61 | var max = 100;
62 | f1(15);
--------------------------------------------------------------------------------
/lessons/LS12/js/demo13.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //闭包实例 Part 1111111111111111
5 | function counter() {
6 | var n = 0;
7 | return {
8 | count:function () {return ++n;},
9 | reset:function () {n = 0;return n;}
10 | }
11 | }
12 | var c = counter();
13 | var d = counter();
14 | console.log(c.count());
15 | console.log(d.count());
16 | console.log(c.reset());
17 | console.log(c.count());
18 | console.log(d.count());
19 |
20 |
21 |
--------------------------------------------------------------------------------
/lessons/LS12/js/demo16.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/9/26.
3 | */
4 |
5 | //配合index16.html 实现函数相关知识的综合练习(闭包、IIFE、作用域)
6 | window.onload = function () {
7 | var btns = document.getElementsByClassName("btn");
8 | function closureExample(objID) {
9 | var ol = document.getElementById(objID);
10 | // var li = document.createElement("li");//闭包,单例模式
11 | // ol.appendChild(li);//闭包,单例模式
12 | return function () {
13 | var li = document.createElement("li");
14 | ol.appendChild(li);
15 | li.innerHTML = "列表内容";
16 | };
17 | }
18 | var foo = closureExample("orderList");
19 | for(var i=0;i<3;i++){
20 | (function (j) {
21 | btns[j].onclick = function () {
22 | //console.log(new Date());
23 | setTimeout(foo,(3*j+2)*1000);
24 | };
25 | }(i));
26 | }
27 | };
28 |
29 |
--------------------------------------------------------------------------------
/lessons/LS13/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LS06
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/lessons/LS13/js/demo01.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //JS对象
5 | var obj = {
6 | num:10,
7 | str:"Hi",
8 | show:function(){
9 | console.log(this.str);
10 | }
11 | };
12 | console.log(obj.num);//10
13 | console.log(obj.str);//Hi
14 | obj.show(); //Hi
15 |
16 | //练习:写一个JS对象,包括自己的姓名、年龄,和一个方法,调用这个方法
--------------------------------------------------------------------------------
/lessons/LS13/js/demo05.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | var obj = {};
5 | obj.x = 2;//直接添加属性
6 | console.log(obj.x);//通过.访问属性
7 | obj.x = 5;//设置属性
8 | console.log(obj["x"]);//通过[]访问属性
9 | delete obj.x;//删除属性
10 | console.log(obj.x);
11 |
12 | //访问属性的for循环练习
13 | var obj2 = {
14 | id_1:2,
15 | id_2:4,
16 | id_3:6,
17 | id_4:8,
18 | id_5:10
19 | };
20 |
21 | //思考obj3 和 obj4 内容是什么?为什么?
22 | var obj3 = {};
23 | for(var i=0;i<10;i++){
24 | obj3.i = i;
25 | }
26 |
27 | var obj4 = {};
28 | for(var i=0;i<10;i++){
29 | obj4[i] = i;
30 | }
--------------------------------------------------------------------------------
/lessons/LS14/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LS06
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/lessons/LS14/js/demo06.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | var objProto = {
5 | z:3
6 | };
7 |
8 | var obj = Object.create(objProto);
9 | obj.x = 1;
10 | obj.y = 2;
11 |
12 | console.log(obj.x);//1
13 | console.log(obj.y);//2
14 | console.log(obj.z);//3
15 |
16 | console.log(obj.toString);//原型链上有toString属性
17 |
18 | for(var k in obj){//通过for...in遍历所有原型链上的属性
19 | console.log(k,obj[k]);//是否能遍历到toString?
20 | }
--------------------------------------------------------------------------------
/lessons/LS14/js/demo07.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //修改obj属性的特性
5 | var obj = {
6 | x:1,
7 | y:2
8 | };
9 | //Object.defineProperty(obj,"x",{writable:false,value:11,enumerable:false,configurable:true});
10 | Object.defineProperty(obj,"x",{enumerable:false});
11 | for(var k in obj){
12 | console.log(k,obj[k]);
13 | }
14 |
15 | //思考:如果只更改writable特性的话,enumerable特性是否被修改
16 |
17 |
--------------------------------------------------------------------------------
/lessons/LS14/js/demo08.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | var person = {name:"Jack"};
5 | Object.defineProperty(person,"name",{
6 | writable:false,//改成true会如何
7 | configurable:false,//改成true会如何
8 | enumerable:true,
9 | value:"Mike"
10 | });
11 | console.log(person.name);//输出什么?
12 | person.name = "Lucy";
13 | console.log(person.name);//输出什么?
14 | delete person.name;
15 | console.log(person.name);//输出什么?
16 |
17 |
--------------------------------------------------------------------------------
/lessons/LS14/js/demo09.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //Part 111111111111111
5 | var obj = {
6 | x:1,
7 | y:2
8 | };
9 | //直接添加的属性,其所有特性默认都是true
10 | obj.z = 3;
11 | for(var k in obj){
12 | console.log(k,obj[k]);
13 | }
14 |
15 | //Part 2222222222222222
16 |
17 | var obj = {
18 | x:1,
19 | y:2
20 | };
21 | //直接添加的属性,其所有特性默认都是true
22 | obj.z = 3;
23 |
24 | //通过Object.defineProperty方法添加的属性,除了手动修改,其所有特性默认都是false
25 | Object.defineProperty(obj,"w",{value:456,configurable:true});//writable,enumerable没有指定,所以默认为false
26 | for(var k in obj){
27 | console.log(k,obj[k]);
28 | }
29 | //console.log(obj.w);//有w,但上边for...in遍历不到
30 |
31 |
32 | //通过属性特性描述符来查看某一对象属性的特性
--------------------------------------------------------------------------------
/lessons/LS14/js/demo10.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //通过Object.defineProperty来添加和改变的get /set的属性特性
5 | //添加访问器
6 | var obj1={
7 | _name:"Lucy"
8 | };
9 | Object.defineProperty(obj1,"name",{
10 | get:function (){//只定义了get 特性,因此只能读不能写
11 | return this._name;
12 | }
13 | });
14 | console.log(obj1.name);//"Lucy"
15 | obj1.name="jack";//只定义了getter访问器,因此写入失效
16 | console.log(obj1.name);//"Lucy"
17 |
18 | //改变访问器属性特性 注意添加访问器和修改访问器特性的写法的区别
19 | var obj2={
20 | _name:"Lucy",
21 | set name(val){this._name = val;},
22 | get name(){return this._name;}
23 | };
24 | Object.defineProperty(obj2,"name",{
25 | get:function (){
26 | return this._name+"_hihi";
27 | },
28 | set:function (val) {
29 | this._name = val+"_haha";
30 | }
31 | });
32 | console.log(obj2.name);//
33 | obj2.name="jack";
34 | console.log(obj2.name);//
35 |
--------------------------------------------------------------------------------
/lessons/LS14/js/demo11.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | var person = {_name:"Jack"};
5 | Object.defineProperty(person,"name",{
6 | configurable:false,//若为true会如何
7 | enumerable:true,
8 | set:function(val){this._name = val},
9 | get:function(){return this._name}
10 | });
11 | console.log(person.name);
12 | person.name = "Lucy";
13 | console.log(person.name);
14 | delete person.name;//delete person.name;
15 | console.log(person.name);
--------------------------------------------------------------------------------
/lessons/LS14/js/demo12.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //属性特性描述符
5 | var obj = {x:5};
6 | Object.defineProperty(obj,"y",{
7 | configurable:false,
8 | writable:false,
9 | enumerable:true,
10 | value:6
11 | });
12 | Object.defineProperty(obj,"z",{
13 | configurable:false,
14 | value:7
15 | });
16 | Object.getOwnPropertyDescriptor(obj,"x");
17 | //Object.getOwnPropertyDescriptor(obj,"y");
18 | //Object.getOwnPropertyDescriptor(obj,"z");
--------------------------------------------------------------------------------
/lessons/LS14/js/demo14.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //属性特性的继承特点
5 | var o1 = {};
6 | Object.defineProperty(o1,"x",{
7 | value:12,
8 | //writable:true
9 | });//思考configurable和writable是true还是false
10 | o1.x = 34;
11 | console.log(o1.x);
12 |
13 | var o2 = Object.create(o1);
14 | o2.x = 56;//是在o2上添加了新属性x,还是修改了o1的x属性,还是前两者都不是?
15 | console.log(o2.x);//输出多少?若o1的x的writable特性为true又会如何?
16 |
17 | //访问器属性特性的继承特点
18 | var o3 = {_x:21};
19 | Object.defineProperty(o3,"x",{
20 | get:function(){return this._x}
21 | });
22 | o3.x = 34;
23 | console.log(o3.x);//输出21还是34
24 |
25 | var o4 = Object.create(o3);
26 | Object.defineProperty(o4,"x",{
27 | set:function (val) {
28 | this._x = val;
29 | },
30 | get:function () {
31 | return ++this._x;
32 | }
33 | });
34 | o4.x = 56;
35 | console.log(o4.x);//输出多少
36 |
37 |
38 | //全局变量的属性特性是如何的呢?
39 | //{value: 23, writable: true, enumerable: true, configurable: false}
40 | var a = 23;
41 | console.log(Object.getOwnPropertyDescriptor(window,"a"));
42 | delete a;//等效delete window.a;
43 |
44 |
--------------------------------------------------------------------------------
/lessons/LS15/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LS07
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/lessons/LS15/js/demo01.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 |
5 | //测验 使用3种方式来创建对象
6 | var obj1,obj2,obj3;
7 | //obj1通过字面量方式创建,并创建自身属性x
8 | //obj2通过Object静态方法创建,obj2的原型为obj1,并创建自身属性y
9 | //obj3通过构造函数来创建,构造函数为Obj3
10 |
11 | //通过字面量的方式创建 JS对象
12 | var obj = {
13 | num:10,
14 | str:"Hi",
15 | show:function(){
16 | return this.str;
17 | }
18 | };
19 | console.log(obj.num);
20 | console.log(obj.str);
21 | console.log(obj.show());
22 |
23 | //通过Object工场方法创建JS对象,注:JS对象是通过原型链的方式实现的对象继承
24 | var newObj = Object.create(obj);
25 | newObj.age = 23;
26 | console.log(newObj.num);
27 | console.log(newObj.str);
28 | console.log(newObj.show());
29 | console.log(newObj.age);//自有属性
30 |
31 | var empty = {};
32 | var obj2 = Object.create(empty,{
33 | x:{value:1}, y:{value:2,enumerable:true}
34 | });
35 | console.log(obj2);
36 | console.log(obj2.hasOwnProperty("x"));
37 |
38 | //构造函数的方式创建JS对象 此处略讲,详情参照后续面向对象编程 注:JS对象是通过原型链的方式实现的对象继承
39 | function Person(name,age){
40 | this.name = name;
41 | this.age = age;
42 | }
43 | Person.prototype.sayName = function(){
44 | console.log("hello,i'm",this.name,this.age,"years old");
45 | };
46 |
47 | var person1 = new Person("Mike",21);
48 | person1.sayName();
49 |
--------------------------------------------------------------------------------
/lessons/LS15/js/demo02.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | var obj = {
5 | num:10,
6 | str:"Hi",
7 | show:function(){
8 | return this.str;
9 | }
10 | };
11 | //console.log(obj.__proto__);
12 | console.log(obj.__proto__ === Object.prototype);
13 |
14 | var newObj = Object.create(obj);
15 | var newObj2 = Object.create(obj);//思考:多个对象同一个原型的情况
16 | newObj.age = 23;
17 |
18 | console.log(newObj.__proto__ === obj);
19 | console.log(newObj2.__proto__ === obj);
20 |
21 | //JavaScript的继承方式 是对象-对象的继承,对象要实现继承首先要有原型对象
22 | console.log(newObj.__proto__.__proto__);//Object.prototype
23 | console.log(newObj.__proto__.__proto__.__proto__);//null
--------------------------------------------------------------------------------
/lessons/LS15/js/demo03.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | ///////////Part1 原型链综述////////////
5 | var proObj = {
6 | z:3
7 | };
8 |
9 | var obj = Object.create(proObj);
10 | obj.x = 1;
11 | obj.y = 2;
12 |
13 | console.log(obj.x);//1
14 | console.log(obj.y);//2
15 | console.log(obj.z);//3
16 |
17 | console.log("z" in obj);//true
18 | console.log(obj.hasOwnProperty("z"));//false
19 |
20 | ///////////Part2 原型链属性操作////////////
21 | obj.z = 5;
22 |
23 | console.log(obj.hasOwnProperty("z"));
24 | console.log(obj.z);
25 | console.log(proObj.z);
26 |
27 | obj.z = 8;
28 | console.log(obj.z);
29 |
30 | delete obj.z;//true
31 | console.log(obj.z);
32 |
33 | delete obj.z;//true
34 | console.log(obj.z);//still 3
35 |
36 | //如何删除原型上的属性
37 | delete obj.__proto__.z;//或者delete proObj.z;
38 | console.log(obj.z);//此时彻底没有z了
39 |
40 | //注意:hasOwnProperty是原型方法
41 | //调用的主体为obj,先在自身上找该方法,找不到的话去原型链上去找
42 | //区别与Object.keys(obj)这种静态方法
--------------------------------------------------------------------------------
/lessons/LS15/js/demo04.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | function Person(age,name) {
5 | this.name = name;
6 | this.age = age;
7 | }
8 | Person.prototype.sayHi = function () {
9 | console.log("Hi,i'm "+this.name);
10 | };
11 | var p1 = new Person(20,"Jack");
12 | console.log(p1.name);
13 | console.log(p1.age);
14 | p1.sayHi();
--------------------------------------------------------------------------------
/lessons/LS15/js/demo05.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | function Person(name) {
5 | this.name = name;
6 | this.age = 21;
7 | }
8 | Person.prototype.sayHi = function () {
9 | console.log("Hi,i'm ",this.name,this.age,"years old!");
10 | };
11 |
12 | var p1 = new Person("Mike");
13 | console.log(p1.name);
14 | console.log(p1.age);
15 | p1.sayHi();
16 | //name和age属性是定义在p1上了,还是定义在p1的原型上了
17 | //sayHi方法是定义在p1上了,还是定义在p1的原型上了
18 | //分析一下访问和调用的过程是怎样的
19 |
20 |
21 | //分析:属性和方法定义在构造函数中和写在prototype上这两种情况有什么不同?
22 | //没有私有属性情况下,常将方法添加到构造函数的prototype属性上,实现方法共享
23 | //而属性根据情况来确定是定义在构造函数中,还是定义在构造函数的prototype(即实例化对象的原型上)属性上
24 |
25 | console.log(p1.__proto__ === Person.prototype);
26 |
27 |
28 |
--------------------------------------------------------------------------------
/lessons/LS15/js/demo06.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | function MyObj() { }
5 | MyObj.prototype.z = 3;
6 |
7 | var obj = new MyObj();
8 | obj.x = 1;
9 | obj.y = 2;
10 |
11 | console.log(obj.x);//1
12 | console.log(obj.y);//2
13 | console.log(obj.z);//3
14 |
15 | console.log("z" in obj);//true
16 | console.log(obj.hasOwnProperty("z"));//false
17 |
18 | ///////////Part2 原型链属性操作////////////
19 | obj.z = 5;
20 |
21 | obj.hasOwnProperty("z");
22 | console.log(obj.z);
23 | console.log(MyObj.prototype.z);
24 |
25 | obj.z = 8;
26 | console.log(obj.z);
27 |
28 | delete obj.z;//true
29 | console.log(obj.z);
30 |
31 | delete obj.z;//true
32 | console.log(obj.z);//still 3
33 |
34 | //如何删除原型上的属性
35 | delete obj.__proto__.z;//或者delete MyObj.prototype.z;
36 | console.log(obj.z);//此时彻底没有z了
--------------------------------------------------------------------------------
/lessons/LS16/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LS08
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/lessons/LS16/js/demo01.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | function thisTest(){
5 | console.log(this === window);
6 | }
7 | thisTest();
8 |
9 | var a = 10,b = "Hi";
10 | function thisTest2(){
11 | this.a = 20;
12 | delete this.b;
13 | this.c = "新添加属性";
14 | }
15 | thisTest2();
16 | console.log(a,c);
17 | console.log(b);//依然能输出b,为什么,查看window对象b属性的属性特性
18 |
19 | /*
20 | var point = {
21 | x:0,
22 | y:0,
23 | moveTo:function(x,y){
24 | function moveToX(x){
25 | this.x = x;
26 | };
27 | function moveToY(y){
28 | this.y = y;
29 | }
30 | moveToX(x);
31 | moveToY(y);
32 | }
33 | };
34 | */
--------------------------------------------------------------------------------
/lessons/LS16/js/demo02.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | function thisTest() {
5 | "use strict"
6 | console.log(this);
7 | }
8 | thisTest();
9 |
10 | //严格模式检测
11 | //"use strict"
12 | function isStrictMode() {
13 | return this == undefined?true:false;
14 | }
15 | isStrictMode();
--------------------------------------------------------------------------------
/lessons/LS16/js/demo03.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | var point = {
5 | x:0,
6 | y:0,
7 | moveTo:function (x,y) {
8 | this.x = x;
9 | this.y = y;
10 | }
11 | };
12 | point.moveTo(1,1);//this绑定到当前对象,即point对象上
13 | console.log(point);
14 |
15 | //私有属性 闭包
16 | var Person = function(name,age){
17 | var namePrivate = name;
18 | var agePrivate = age;
19 | this.showMe = function(){
20 | console.log(namePrivate,agePrivate);
21 | }
22 | }
23 | var p1 = new Person("Mike",23);
24 | p1.showMe();
25 |
26 |
--------------------------------------------------------------------------------
/lessons/LS16/js/demo04.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | function Point(x,y) {
5 | this.x = x;
6 | this.y = y;
7 | }
8 | var p = new Point(2,3);
9 | console.log(p);
10 |
11 | //思考:直接调用Point方法会是什么样的情况
12 | Point(5,6);//结果是什么情况
13 | console.log(window.x,window.y);
--------------------------------------------------------------------------------
/lessons/LS16/js/demo05.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //call 实例1
5 | objA = {name:"AA",x:1};
6 | objB = {name:"BB",x:5};
7 | objA.test = function () {
8 | console.log(this.name,this.x);
9 | };
10 |
11 | objA.test();//AA 1
12 | objA.test.call(objB);//BB 5
13 |
14 | //call 实例2
15 | var bird = {
16 | name:"polly",
17 | fly:function(m,n){
18 | console.log("i'm:"+this.name+" i can fly ___",m,n);
19 | }
20 | };
21 |
22 | var me = {
23 | name:"QL"
24 | };
25 | bird.fly(5,6);
26 | bird.fly.call(me,7,8);
27 |
--------------------------------------------------------------------------------
/lessons/LS16/js/demo07.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | // Part1 构造函数中函数嵌套 this缺陷
5 | function Point(x,y) {
6 | this.x = x;
7 | this.y = y;
8 | this.moveXY = function (x,y) {
9 | function moveX(x) {
10 | this.x+=x;
11 | }
12 | function moveY(y) {
13 | this.y+=y;
14 | }
15 | moveX(x);
16 | moveY(y);
17 | }
18 | }
19 | var p = new Point(2,3);
20 | p.moveXY(1,1);
21 | console.log(p);//输出为Point{x:2,y:3}没有移动
22 |
23 |
24 |
25 | // Part2 构造函数中函数嵌套 this缺陷 解决方案
26 | function Point(x,y) {
27 | this.x = x;
28 | this.y = y;
29 | this.moveXY = function (x,y) {
30 | var that = this;//此处that为实例化出来的p对象
31 | function moveX(x) {
32 | that.x+=x;//this改为that
33 | }
34 | function moveY(y) {
35 | that.y+=y;//this改为that
36 | }
37 | moveX(x);
38 | moveY(y);
39 | }
40 | }
41 | var p = new Point(2,3);
42 | p.moveXY(1,1);
43 | console.log(p);//输出为Point{x:3,y:4},移动了(1,1)
44 |
45 | //思考:试着通过call/apply方法和bind两种方法解决上边的问题
46 |
47 |
48 | //思考:下述代码
49 | var obj = {
50 | name:"obj",
51 | x:23,
52 | test:function(){
53 | console.log(this.x,this);
54 | }
55 | };
56 | var fun1 = function () {
57 | return function fun2() {
58 | return this.x;//若改为 return this;
59 | }
60 | };
61 | obj.fun3 = fun1;
62 | obj.fun4 = fun1();
63 | console.log(obj.fun3());//输出什么
64 | console.log(obj.fun3()());//输出什么
65 | console.log(obj.fun4());//输出什么
--------------------------------------------------------------------------------
/lessons/LS17/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LS07
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/lessons/LS17/js/demo07.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //通过Object.create静态方法创建的对象的原型共享问题
5 | var superObj = {
6 | x:1,
7 | y:2
8 | };
9 | var subObj_First = Object.create(superObj);
10 | var subObj_Second = Object.create(superObj);
11 | subObj_First.__proto__.x = 5;//若此行写为subObj_First.x = 5;结果又是如何?
12 | console.log(subObj_Second.x);
13 |
--------------------------------------------------------------------------------
/lessons/LS17/js/demo09.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //JS实现继承的形式 一
5 | function Person(name,age){
6 | this.name = name;
7 | this.age = age;
8 | };
9 | Person.prototype.showName = function(){console.log(this.name);};
10 | function Student(name,age,id){
11 | Person.call(this,name,age);
12 | this.id = id;
13 | }
14 | Student.prototype.__proto__ = Person.prototype;
15 | var s1 = new Student("xxx",22,2017001);
16 | var s2 = new Student("www",23,2017002);
17 |
18 |
19 | //JS实现继承的形式 二
20 | function Person(name,age){
21 | this.name = name;
22 | this.age = age;
23 | };
24 | Person.prototype.showName = function(){
25 | console.log(this.name);
26 | };
27 | function Student(name,age,id){
28 | Person.call(this,name,age);
29 | this.id = id;
30 | }
31 | Student.prototype = Object.create(Person.prototype);
32 | // console.log(Person.prototype.constructor); //
33 | // console.log(Student.prototype.constructor); //
34 | Student.prototype.constructor = Student;
35 | var s1 = new Student("xxx",22,2017001);
36 | var s2 = new Student("www",23,2017002);
--------------------------------------------------------------------------------
/lessons/LS17/js/demo10.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //静态方法实例与原型方法实例
5 | var BaseClass = function() {};
6 | BaseClass.prototype.f2 = function () {
7 | console.log("This is a prototype method ");
8 | };
9 | BaseClass.f1 = function(){//定义静态方法
10 | console.log("This is a static method ");
11 | };
12 | BaseClass.f1();//This is a static method
13 | var instance1 = new BaseClass();
14 | instance1.f2();//This is a prototype method
15 |
16 |
17 | //思考下述案例 实例方法 原型方法
18 | var BaseClass = function() {};
19 | BaseClass.prototype.method1 = function(){
20 | console.log("1 This is a method in Base.prototype");
21 | };
22 | var instance1 = new BaseClass();
23 | instance1.method1();
24 |
25 | instance1.method1 = function(){
26 | console.log("2 This is a method in instance1");
27 | };
28 | instance1.method1();//访问的哪一个method1?
29 |
30 |
31 | // 思考下述实例
32 | /*
33 | var BaseClass = function() {
34 | this.method1 = function(){
35 | console.log('1 Defined by the "this" in the instance method');
36 | }
37 | };
38 | var instance1 = new BaseClass();
39 | instance1.method1 = function(){
40 | console.log('2 Defined directly in the instance method');
41 | };
42 | BaseClass.prototype.method1 = function(){
43 | console.log('3 Defined by the prototype instance method ');
44 | };
45 | instance1.method1();//Defined directly in the instance method
46 | */
--------------------------------------------------------------------------------
/lessons/LS18/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LS09
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/lessons/LS18/js/demo02.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | // Part11111111
5 | //增删改查
6 | var a = ["hello"];
7 | a[1] = 3.14;//增:直接添加数组元素,通过方法添加元素参见后续章节
8 | a[2] = "world";
9 | console.log("删除a[2]前的数组a",a);
10 | delete a[2];//删:思考此时数组长度是2还是3?如何彻底删除?直接修改length与pop方法
11 | console.log("删除a[2]后的数组a",a);
12 | a[0] = "XX";//改:修改数组元素a[0]
13 | console.log(a[0]);//查:看数组中的元素,索引从0开始
14 |
15 | //思考
16 | var i=2,b=[];
17 | b[i]=3;
18 | b[i+1]="YY";
19 | b[b[i]] = b[0];
20 | console.log(b);//输出什么?
21 |
22 | // Part22222222
23 | var a = [];
24 | a[-1.23] = true; //创建一个名为“-1,23”的属性
25 | a["100"] = 0; // 数组的第101个元素
26 | a[1.00] = "Hi"; //和a[1]相当
27 | console.log(a.length);
28 | console.log(a);
--------------------------------------------------------------------------------
/lessons/LS18/js/demo03.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | var a1 = [,"abc"];
5 | console.log(a1.length);
6 |
7 | for(var i in a1){
8 | console.log(i,a1[i]);//输出几个元素
9 | }
10 | console.log(0 in a1,1 in a1);
11 |
12 | var a2 = new Array(3);
13 | console.log(a2.length);
14 | console.log(a2);
15 |
16 | //注意:
17 | var a3 = [,,];
18 | console.log(a3.length);
19 |
20 | console.log(["a","b"].length);
21 | console.log(["a","b",].length);
22 | console.log(["a","b",,].length);
--------------------------------------------------------------------------------
/lessons/LS18/js/demo04.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | // 多维数组 实例一 矩形数组和交错数组
5 | var table = new Array(5);
6 | for(var i=0;i
2 |
3 |
4 |
5 | LS09
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/lessons/LS19/js/demo08.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //UTC 协调世界时间 Coordinated Universal Time
5 | //GMT 格林尼治时间 (北京时间是正8时区) Greenwich Mean Time
6 | var date1 = new Date(2017,9,18,12,34,1);//注意:月0-11,日:1-31,时:0-23,分:0-59,秒:0-59,毫秒:0-999
7 | console.log(date1);
8 |
9 | var date2 = new Date(17,9,18,12,34,1);//若years为2位的话自动加1900
10 | console.log(date2);
11 |
12 | var date3 = new Date("2017-08-09");//注意日期的格式 此处的08代表8月还是9月,对比上一个创建形式
13 | console.log(date3);
14 |
15 | //var date4 = new Date(0); //1970-01-01:00:00:00
16 | var date4 = new Date(1000); //1970-01-01:00:00:01
17 | console.log(date4);//逆运算是date4.getTime();
18 |
19 | var date5 = new Date();//new Date(Date.now());
20 | console.log(date5);
21 |
22 | //补充:无效日期
23 | var date6 = new Date(NaN);
24 | console.log(date6);//Invalid Date
25 |
26 | //有无new的区别
27 | var d1 = new Date();
28 | var d2 = Date();
29 | console.log(d1,typeof d1);//object
30 | console.log(d2,typeof d2);//string
31 |
32 | //补充思考
33 | var n1 = new Number("123");
34 | var n2 = Number("123");
35 | console.log(n1,typeof n1);
36 | console.log(n2,typeof n2);
37 |
38 |
--------------------------------------------------------------------------------
/lessons/LS19/js/demo09.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | // Date 方法参考链接
5 | // https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date
6 | //Date静态方法(Date构造器函数对象的方法)GMT 格林尼治时间
7 | console.log(Date.now());//以毫秒为单位返回当前时间(从1970年1月1日00:00:00开始计算)
8 | console.log((new Date()).getTime());
9 |
10 | console.log(Date.parse("1970-01-01"));//dateTimeString字符串转换成毫秒
11 | console.log(Date.parse("1970-01-02"));
12 |
13 | console.log(Date.UTC(2017,9,1));//将给定的日期转换成毫秒,解释为UTC 协调世界时间
14 |
15 |
16 | //Date原型方法 getter和setter相关
17 | var d = new Date("1978-11-25");
18 | console.log(d.getFullYear(),d.getMonth(),d.getDay(),d.getDate(),d.getHours());
19 | console.log(d.getTimezoneOffset());
20 | d.setDate(11);
21 | console.log(d.getFullYear(),d.getMonth(),d.getDay(),d.getDate(),d.getHours());
22 | d.setFullYear(1999,5,3);
23 | console.log(d.getFullYear(),d.getMonth(),d.getDay(),d.getDate(),d.getHours());
24 |
25 | //Date原型方法 转成字符串相关
26 | var d = new Date(2012,3,21,15,7,23,234);
27 | console.log(d.toTimeString(),"___",d.toLocaleTimeString());
28 | console.log(d.toDateString(),"___",d.toLocaleDateString());
29 | console.log(d.toJSON());
30 |
31 | // https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date
32 |
33 |
--------------------------------------------------------------------------------
/lessons/LS19/js/demo10.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //日期格式实例
5 | // YYYY-MM-DDTHH:mm:ss.sssZ
6 | console.log(Date.parse("2010-01-01 11:12:23.111"));
7 | console.log(new Date("2010-01-01 11:12:23.111"));
8 | console.log(new Date().toISOString());
9 |
10 | console.log(Date.parse("2010-01-01T11:12:23.111Z"));
11 | console.log(new Date("2010-01-01T11:12:23.111Z"));
12 | console.log(new Date().toISOString());
13 |
14 | //日期格式(无时间)
15 | console.log(new Date("2001"));
16 | console.log(new Date("2001-02"));
17 | console.log(new Date("2001-02-22"));
18 |
19 | //日期和时间格式
20 | console.log(new Date("1999-11-22T13:17"));
21 | console.log(new Date("1999-11-22T13:17:11"));
22 | console.log(new Date("1999-11-22T13:17:11.111"));
23 | console.log(new Date("1999-11-22T13:17:11.111Z"));
24 |
25 | //时间的比较和运算,内部转换为数字进行比较和运算(从1970年1月1日00:00:00开始计算)
26 | console.log(new Date("1970-01-01").getTime());
27 | console.log(new Date("1970-01-02").getTime());
28 | console.log(new Date("1960-01-02").getTime());
29 | console.log(new Date("1970-01-02") > new Date("1970-01-01"));
30 | console.log(new Date("1970-01-02") - new Date("1970-01-01"));
31 | console.log(new Date((new Date("1970-01-01").getTime())+86400000));
32 |
33 | //时间运算 和 时间综合练习 输出50天后是几月几号,星期几?
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/lessons/LS20/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LS10
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/lessons/LS20/js/demo01.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/10/20.
3 | */
4 | //正则案例 练习 查看编辑器如何使用正则
5 | console.log("moon2xyz".replace(/o/,"ab"));//mabon2xyz
6 | console.log("moon2xyz".replace(/o/g,"ab"));//mababn2xyz
7 | console.log("moon2 ooxyz".replace(/\bo/g,"ab"));//moon2 aboxyz
8 | console.log("moon2xyz".replace(/\dx/,"_"));//moon_yz
9 | console.log("moon2xyz".replace(/[xyz]/g,"ab"));//moon2ababab
10 | console.log("m2on2x2z".replace(/\d[zo]/g,"ab"));//mabn2xab
11 | console.log("m2on2x2z".replace(/2[x-z]/g,""));//m2on
12 |
13 | //将下列文章中 单独的大写C统一改为大写D,要求其他的c不受影响
14 | /*
15 | Chaude and Cold
16 | A patron in Montreal cafe turned on a tap in the washroom and got scalded. "This is an outrage," he complained. "The faucet marked C gave me boiling water."
17 | "But, Monsieur, C stands for chaude - French for hot. You should know that if you live in Montreal."
18 | "Wait a minute," roared the patron. "The other tap is also marked C."
19 | "Of course," said the manager, "It stands for cold. After all, Montreal is a bilingual city."
20 | */
21 |
22 | //正则对象的创建方式一 通过字面量直接创建
23 | var reg1 = /[bcf]at/gi;
24 |
25 | //正则对象的创建方式二 通过RegExp构造函数来实例化正则对象
26 | var reg2 = new RegExp(/[bcf]at/,"gi");//常见形式
27 | var reg3 = new RegExp("[bcf]at","gi");
28 |
29 | console.log("a fAt bat ,a faT cat".match(reg1));//["fAt", "bat", "faT", "cat"]
30 | console.log("a fAt bat ,a faT cat".match(reg2));//["fAt", "bat", "faT", "cat"]
31 | console.log("a fAt bat ,a faT cat".match(reg3));//["fAt", "bat", "faT", "cat"]
32 |
33 | //正则工具
34 | //http://www.iteye.com/news/29859
--------------------------------------------------------------------------------
/lessons/LS20/js/demo02.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/10/23.
3 | */
4 | //在控制台上测试,了解两点
5 | // 一、g全局、i大小写、m换行 修饰符的作用
6 | // 二、正则对象的两种基本使用方式 1.字符串.字符串方法(正则对象) 2.正则对象.正则方法(字符串)
7 | var regExp = /ab/i;
8 | var matchResult = "xxAbcaaBbxyz".match(regExp);
9 | console.log(matchResult);
10 |
11 | var regExp = /ab/gi;
12 | var matchResult = "xxAbcaaBbxyz".match(regExp);
13 | console.log(matchResult);
14 |
15 | var regExp = /a*b/gi; //注意*和.的区别 ,参见在线分析工具 https://regexper.com或https://jex.im/regulex
16 | var matchResult = "xxAbcaaBbxyz".match(regExp);
17 | console.log(matchResult);
18 |
19 | var regExp = /a.b/gi;//注意*和.的区别 ,参见在线分析工具 https://regexper.com或https://jex.im/regulex
20 | var matchResult = "xxAbcaaBbxyz".match(regExp);
21 | console.log(matchResult);
22 |
23 | //test初步了解
24 | var regExp = /a/i;
25 | console.log(regExp.test("ab"));
26 | console.log(regExp.test("ab"));
27 | console.log(regExp.test("ab"));
28 | console.log(regExp.test("ab"));
29 |
30 | var regExp = /a/gi;//思考如果加了g,循环了若干次后是true还是false,这是为什么?test中的lastIndex
31 | console.log(regExp.test("ab"));//true
32 | console.log(regExp.test("ab"));//false 为什么?
33 | console.log(regExp.test("ab"));//true
34 | console.log(regExp.test("ab"));//false 为什么?
35 |
36 | /*
37 | while (regExp.test("aaa")){
38 | console.log(regExp.lastIndex);//每次执行后从哪开始重新匹配?
39 | }
40 | */
--------------------------------------------------------------------------------
/lessons/LS20/js/demo05.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/10/20.
3 | */
4 | //贪婪模式和非贪婪模式
5 | "12345678".replace(/\d{3,6}/,'X');//默认为贪婪模式 X78
6 |
7 | "12345678".replace(/\d{3,6}?/,'X');//设置为非贪婪模式 在量词后加?X45678
8 |
9 | "12345678".replace(/\d{3,6}?/g,'X');//返回什么?
10 |
11 | //正则表达式的分组
12 | console.log("NameNameName_11111".replace(/Name{3}/,"X"));
13 | console.log("NameNameName_11111".replace(/(Name){3}/,"X"));
14 |
15 | console.log("a1b2c3d4e5".replace(/[a-z]\d{3}/,"X"));
16 | console.log("a1b2c3d4e5".replace(/([a-z]\d){3}/,"X"));
17 | console.log("a1b2c3d4e5".replace(/([a-z]\d){3,4}/,"X"));
18 | console.log("a1b2c3d4e5".replace(/([a-z]\d){3,4}?/,"X"));
19 |
20 | // 与分组相关的 或
21 | "abcdefghijk".replace(/abcde|fghijk/g,"X");
22 | "abcdefghijk_abcdehijk_abcfghijk".replace(/abc(de|fg)hijk/g,"X");
23 |
24 | //练习:
25 | //将"xxabccxxdexx"替换为"yyabccxxdeyy"
26 |
27 | //"xx11xx".replace(/(\bxx)|(xx\b)/g,"mm");
28 |
29 |
30 |
--------------------------------------------------------------------------------
/lessons/LS20/js/demo06.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //分组的 反向引用
5 | //如何将2017-10-23转成10/23/2017
6 | "2017-10-23".replace(/(\d{4})-(\d{2})-(\d{2})/,"$2/$3/$1");
7 |
8 | //分组的 忽略分组 (?:)
9 | "2017-10-23".replace(/(?:\d{4})-(\d{2})-(\d{2})/,"$2/$3/$1");
10 |
11 | //注意括号的转义字符,第一个相当于做了分组
12 | console.log(/^(ab)$/.test("(ab)"));
13 | console.log(/^\(ab\)$/.test("(ab)"));
14 |
15 | //正则前瞻,了解即可 判断后边是否满足断言
16 | console.log("a23*4vv".replace(/\w(?=\d)/g,"X"));//XX3*4vv 正项前瞻
17 | console.log("a23*4v8".replace(/\w(?=\d)/g,"X"));//XX3*4X8
18 | console.log("a23*4v8".replace(/\w(?!\d)/g,"X"));//a2X*XvX 负项前瞻
19 |
--------------------------------------------------------------------------------
/lessons/LS20/js/demo07.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | var reg1 = /\w/;
5 | var reg2 = /\w/gi;
6 | console.log(reg1.global,reg1.ignoreCase,reg1.multiline,reg1.lastIndex,reg1.source);
7 | console.log(reg2.global,reg2.ignoreCase,reg2.multiline,reg2.lastIndex,reg2.source);
8 |
9 | //思考reg1的global属性是定义在谁身上,是否可修改,它的属性特性描述符是什么?
10 |
11 | console.log(reg2.lastIndex);
12 | reg2.test("abc23def");
13 | console.log(reg2.lastIndex);
14 | reg2.test("abc23def");
15 | console.log(reg2.lastIndex);
16 |
17 | while (reg2.test("abc23def")){
18 | console.log(reg2.lastIndex);
19 | }
20 |
21 | var reg3 = /\w/gi;
22 | var str = "slfls3r3sfsf";
23 | var returnArray1 = reg3.exec(str);
24 | console.log(reg3.lastIndex,returnArray1);
25 |
26 | var returnArray2 = reg3.exec(str);
27 | console.log(reg3.lastIndex,returnArray2);
28 | /*
29 | var returnArray3;
30 | while (returnArray3 = reg3.exec(str)){
31 | console.log(reg3.lastIndex,returnArray3);
32 | }
33 | */
34 |
35 | //RegExp静态属性
36 | console.log(RegExp.$_);
37 | console.log(RegExp.lastMatch);
--------------------------------------------------------------------------------
/lessons/LS20/js/demo08.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //Part111 RegExp.prototype.test 方法
5 | var regExp = /a/i;
6 | console.log(regExp.test("ab"));
7 | console.log(regExp.test("ab"));
8 | console.log(regExp.test("ab"));
9 | console.log(regExp.test("ab"));
10 |
11 | var regExp = /a/gi;//思考如果加了g,循环了若干次后是true还是false,这是为什么?test中的lastIndex
12 | console.log(regExp.test("ab"));//true
13 | console.log(regExp.test("ab"));//false 为什么?
14 | console.log(regExp.test("ab"));//true
15 | console.log(regExp.test("ab"));//false 为什么?
16 | /*
17 | while (regExp.test("aaa")){
18 | console.log(regExp.lastIndex);//每次执行后从哪开始重新匹配?
19 | }
20 | */
21 |
22 |
23 | //Part222 RegExp.prototype.exec 方法 可以获得更为详细的信息,返回一个有属性的数组,
24 | //属性index表示匹配到的位置
25 | //对于非全局模式下返回第一个匹配的和所有的分组项,正则对象的lastIndex不起作用
26 | var execExp = /\d{1,2}(\d)(\d)/;
27 | var retExp = execExp.exec("12s342dsfsf233s");
28 | console.log(retExp instanceof Array,retExp,execExp.lastIndex);
29 | console.log(retExp instanceof Array,retExp,execExp.lastIndex);
30 |
31 | //对于全局模式下 每检测一次lastIndex增加一次,再次用此正则对象匹配时,匹配的起始点为上一次的lastIndex
32 | var execExp2 = /\d{1,2}(\d)(\d)/g;
33 | var ts = "12s342dsfsf233s";
34 | console.log(execExp2.exec(ts),execExp2.lastIndex);//lastIndex为 6
35 | console.log(execExp2.exec(ts),execExp2.lastIndex);//lastIndex为 14
36 | /*
37 | var ret2;
38 | while (ret2 = execExp2.exec(ts)){
39 | console.log(execExp2.lastIndex);//每次执行后从哪开始重新匹配?
40 | }
41 | */
--------------------------------------------------------------------------------
/lessons/LS20/js/demo09.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/10/20.
3 | */
4 | //String.prototype.search 注意search忽略 全局g
5 | console.log("a1b2c3d4".search(/1/));//返回index 1
6 | console.log("a1b2c3d4".search(/f/));//返回index -1 没找到
7 | console.log("a1b2c3d4".search(/\d/g));//返回index 1 忽略全局
8 | console.log("a1b2c3d4".search(/\d\w/g));//返回index 1 忽略全局
9 |
10 | //String.prototype.match 如果匹配不到返回null 匹配到了返回数组
11 | // 包含的信息有index 原始字符串 有没有g影响很大
12 | console.log("a1b2c3d4".match(/1/));//[ '1', index: 1, input: 'a1b2c3d4' ]
13 | console.log("a1b2c3d4".match(/f/));//null
14 | console.log("a1b2c3d4".match(/\d/));//[ '1', index: 1, input: 'a1b2c3d4' ]
15 | console.log("a1b2c3d4".match(/\d/g));//[ '1', '2', '3', '4' ]
16 |
17 | // String.prototype.replace
18 | console.log("a,b,c,d".replace(",","X"));
19 | console.log("a2b3c4d".replace(/[2-3]/,"X"));
20 | console.log("a2b3c4d".replace(/[2-3]/g,"X"));
21 |
22 | //String.prototype.split
23 | console.log("a,b,c,d".split(","));
24 | console.log("a2b3c4d".split(/\d/));
25 |
26 | "abcdef21313sfsflsf1223jlnsa".match(/[a-h]/);
27 | "abcdef21313sfsflsf1223jlnsa".match(/[a-h]/g);
28 | "abcdef21313sfsflsf1223jlnsa".match(/[123efsa]/g);
29 | "abcdef21313sfsflsf1223jlnsa".match(/[^123efsa]/g);
30 | "abcdef21313sfsflsf1223jlnsa".match(/[1-2a-d]/g);
31 | "hello world Hi you".match(/hello|world/);
32 | "hello world Hi you".match(/hello|world/g);
33 | "world Hi you".match(/hello|world/);
34 | "THat hot hat".match(/h.t/);
35 | "THat hot hat".match(/h.t/g);
36 | "THat hot hat".match(/h.t/gi);
37 |
38 |
--------------------------------------------------------------------------------
/lessons/LS20/正则表达式(思维导图).jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/lessons/LS20/正则表达式(思维导图).jpg
--------------------------------------------------------------------------------
/lessons/LS21/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LS10
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/lessons/LS21/js/demo12.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | window.onload = function () {
5 | window.Foo = function () {
6 | var inputValue = document.getElementById("inputID").value;
7 | try{
8 | var n = parseInt(inputValue);
9 | var a= new Array(n);//定义一个数组 传3试试、再传-5试试
10 | for(var i=0;i
2 |
3 |
4 |
5 | LS11
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/lessons/LS23/NodeJsonTest/NodeJsonTest.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | JSON-Node-测试
6 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
47 |
48 |
--------------------------------------------------------------------------------
/lessons/LS23/NodeJsonTest/NodeJsonTest.js:
--------------------------------------------------------------------------------
1 | var fs = require("fs");
2 | var http = require("http");
3 | var url = require("url");
4 |
5 | http.createServer(function (req, res) {
6 | var getDataObj = url.parse(req.url,true).query;//parse第二参数决定了是否转成对象
7 | //console.log(getDataObj);
8 | var arrayIndex = getDataObj.id-1;
9 | //console.log(typeof arrayIndex,arrayIndex);
10 | fs.readFile("./NodeJsonTest.json", function readData(err, data) {
11 | var jsonArr=JSON.parse(data);
12 | //console.log("jsonArr:",jsonArr[arrayIndex]);
13 |
14 | //res.writeHead(200, {"Content-Type": "text/plain",
15 | res.writeHead(200, {"Content-Type": "application/json",
16 | "Access-Control-Allow-Origin":"*",
17 | "Access-Control-Allow-Methods": "GET, POST"
18 | });
19 |
20 | res.end(JSON.stringify(jsonArr[arrayIndex]));
21 | });
22 |
23 | }).listen(8080,"127.0.0.1");
24 | console.log("start server!");
25 |
26 |
27 | /*
28 | var readableStream = fs.createReadStream("./NoseJsonTest.txt");
29 | var data = "";
30 | readableStream.on("data", function(chunk){
31 | data += chunk;
32 | });
33 | readableStream.on("end", function(){
34 | console.log(data,typeof data);
35 | });
36 | */
--------------------------------------------------------------------------------
/lessons/LS23/NodeJsonTest/NodeJsonTest.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "index": "111111",
4 | "id": "2010015001",
5 | "name": "aaaaa",
6 | "score": "60"
7 | },
8 | {
9 | "index": "222222",
10 | "id": "2010015002",
11 | "name": "bbbbb",
12 | "score": "76"
13 | },
14 | {
15 | "index": "333333",
16 | "id": "2010015003",
17 | "name": "ccccc",
18 | "score": "63"
19 | },
20 | {
21 | "index": "444444",
22 | "id": "2010015004",
23 | "name": "ddddd",
24 | "score": "74"
25 | },
26 | {
27 | "index": "555555",
28 | "id": "2010015005",
29 | "name": "eeeee",
30 | "score": "72"
31 | },
32 | {
33 | "index": "66666",
34 | "id": "2010015006",
35 | "name": "fffff",
36 | "score": "76"
37 | },
38 | {
39 | "index": "77777",
40 | "id": "2010015007",
41 | "name": "ggggg",
42 | "score": "83"
43 | }
44 | ]
--------------------------------------------------------------------------------
/lessons/LS23/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LS11
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/lessons/LS23/js/demo02.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | // JS中一切都是对象(如何理解这句话),任何支持的类型都可以通过对象来表示
5 | // JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串
6 | // JSON 可以以字符串的形式表示 JS基本数据类型变量和对象(引用)类型变量
7 |
8 | var obj1 = "xxx";
9 | var obj2 = 23;
10 | var obj3 = false;
11 | var obj4 = { x: 1, y: 2, a: [1, 3, 5], b: "xyz" };
12 | var obj5 = [123, 345];
13 | var obj6 = [{ z: 3 }, [1, 2]];
14 | var obj7 = {x:true};
15 |
16 | var json1 = '"xxx"';
17 | var json2 = '23';
18 | var json3 = 'false';
19 | var json4 = '{"x":1,"y":2,"a":[1,3,5],"b":"xyz"}';
20 | var json5 = '[123,345]';//注意区别于:'["123","345"]'
21 | var json6 = '[{"z":3},[1,2]]';
22 | var json7 = '{"x":true}';//注意区别于:'{"x":"true"}'
23 |
24 | // 在线测试工具 http://www.json.cn/
25 | //练习:写几个json对象,数组,对象,数字,字符等等
26 | var j1 = '[{"name":"jack","obj":{"x":1,"y":2},"arr":[1,2,"3"]},2]';
27 | var j2 = '{"x":1,"y":"2"}';
28 |
29 | //查看一下 api.github.com 返回的json数据
30 |
31 | //思考:以上实例传递的都是属性,方法如何传递?回顾Function构造函数和创建函数的3种方式
32 | var foo = new Function("x","y","return x>y?x:y;");
33 | foo(2,3);
34 |
35 |
36 | //var jf = '["x","y","return x
2 |
3 |
4 |
5 | 待补充
6 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/lessons/LS25/demo01.js:
--------------------------------------------------------------------------------
1 | //
2 | window.onload = function () {
3 | console.log("window onload");
4 | var div2 = document.getElementById("div2");
5 | //思考:将下述7到11行代码写在window.onload回调函数外会怎样
6 | div2.onclick = function () {
7 | console.log("div2 click");
8 | }
9 | // div2.onmouseover = function () {
10 | // console.log("div2 mouseover");
11 | // }
12 | }
13 | function div1click() {
14 | console.log("div1 click");
15 | //console.log("this:", this);
16 | }
17 |
18 |
--------------------------------------------------------------------------------
/lessons/LS25/demo02.js:
--------------------------------------------------------------------------------
1 | //
2 | window.onload = function (e) {
3 | // console.log("window onload");
4 | // console.log("e:", e);
5 | // console.log(e.target);
6 | var div1 = document.getElementById("div1");
7 | var div2 = document.getElementById("div2");
8 | var eventHandler = function (e) {
9 | // 测试0
10 | console.log(e.type);
11 | console.log(e.target);//思考target和this此时是否一样?
12 | //所有情况都一样么?有没有某种情况不一样呢?后边讲事件流时再告诉你
13 |
14 | // 测试1
15 | // console.log(e.clientX,e.clientY);
16 | // console.log(this, "-----", e.target.id);
17 |
18 | // 测试2
19 | // console.log(e);
20 | // console.log(e.__proto__);
21 | // console.log(e.__proto__.__proto__);
22 | // console.log(e.__proto__.__proto__.__proto__);
23 | // console.log(e.__proto__.__proto__.__proto__.__proto__);
24 |
25 | // 测试3
26 | // for(var k in e){
27 | // console.log(k,e[k]);
28 | // }
29 | // for(var k in e.__proto__){
30 | // console.log(k);
31 | // }
32 | // for(var k in e.__proto__.__proto__){
33 | // console.log(k);
34 | // }
35 | // for(var k in e.__proto__.__proto__.__proto__){
36 | // console.log(k);
37 | // }
38 | }
39 | div1.onclick = eventHandler;
40 | div2.onclick = eventHandler;
41 |
42 | //自定义事件监听、事件分发
43 | // document.addEventListener("xx",function(){console.log("11")});
44 | // document.dispatchEvent(new Event("xx"));
45 | }
46 |
47 |
--------------------------------------------------------------------------------
/lessons/LS25/demo04.js:
--------------------------------------------------------------------------------
1 |
2 | window.onload = function (e) {
3 | var div1 = document.getElementById("div1");
4 | var div2 = document.getElementById("div2");
5 |
6 | div1.addEventListener("click",function (e) {
7 | console.log("div1 click");
8 | e.stopPropagation();
9 | },false);//第3个参数可以不写,默认为false
10 |
11 | div2.addEventListener("click",function (e) {
12 | console.log("div2 click");
13 | },false);
14 |
15 | document.addEventListener("click",function (e) {
16 | console.log("document click");
17 | },false);
18 |
19 | document.body.addEventListener("click",function (e) {
20 | console.log("body click");
21 | },true);
22 | }
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/lessons/LS25/demo06.js:
--------------------------------------------------------------------------------
1 | //再谈事件对象与事件流
2 | window.onload = function (e) {
3 | var div1 = document.getElementById("div1");
4 | var div2 = document.getElementById("div2");
5 |
6 | div1.addEventListener("click",function (e) {
7 | console.log("div1 click--red");
8 | console.log("target:",e.target);
9 | console.log("this:",this);
10 | console.log(e.bubbles,e.cancelable,e.cancelBubble);
11 | //e.stopPropagation();
12 | },false);//改成true会怎样
13 |
14 | div2.addEventListener("click",function (e) {
15 | console.log("div2 click--yellow");//
16 | this.style.backgroundColor='black';
17 | //和this.hidden = true;//e.target.hidden = true;有什么区别?为什么?
18 | //this.hidden = true;
19 |
20 | //e.stopPropagation();
21 | },false);//改成true会怎样
22 |
23 | div3.addEventListener("click",function (e) {
24 | console.log("div3 click--blue");
25 | //e.stopPropagation();
26 | },false);//改成true会怎样
27 |
28 | /*
29 | document.addEventListener("click",function (e) {
30 | console.log("document click");
31 | },false);//若第3个可选参数为true的话会怎样,理解冒泡和捕获的顺序
32 | //第3个参数默认是false使用的是冒泡方式,若改为true的话则为捕获方式
33 |
34 | document.body.addEventListener("click",function (e) {
35 | console.log("body click");
36 | },false);//若第3个可选参数为true的话会怎样,理解冒泡和捕获的顺序
37 | */
38 |
39 |
40 | //阻止默认事件行为
41 | document.getElementById("aId").addEventListener("click",function (e) {
42 | e.preventDefault();//阻止默认事件,阻止了链接跳转
43 | console.log("a click");
44 | });
45 | }
46 |
--------------------------------------------------------------------------------
/lessons/LS25/index01.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 事件及事件对象
7 |
8 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/lessons/LS25/index02.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Html事件响应
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/lessons/LS25/index03.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Html事件响应
7 |
8 |
9 |
10 |
11 |
12 |
13 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/lessons/LS25/index04.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 事件流
7 |
8 |
9 |
10 |
11 |
12 |
13 |
17 |
18 |
19 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/lessons/LS25/index05.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 事件流-阻止冒泡-阻止默认响应
7 |
8 |
9 |
10 |
11 |
12 |
13 |
17 |
18 |
19 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/lessons/LS25/index06.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 事件流-阻止冒泡-阻止默认响应
7 |
8 |
9 |
10 |
11 |
12 |
13 |
17 |
18 |
19 |
25 | 百度
26 |
27 |
28 |
--------------------------------------------------------------------------------
/lessons/LS25/style.css:
--------------------------------------------------------------------------------
1 | #div1{
2 | width: 200px;
3 | height: 200px;
4 | background-color: red;
5 | margin: 0px;
6 | padding: 0px;
7 | }
8 |
9 | #div2{
10 | width: 100px;
11 | height: 100px;
12 | background-color: yellow;
13 | padding: 0px;
14 | margin: 50px;
15 | position: absolute;
16 | }
17 |
18 | #div3{
19 | width: 50px;
20 | height: 50px;
21 | background-color: blue;
22 | padding: 0px;
23 | margin: 25px;
24 | position: absolute;
25 | }
26 |
--------------------------------------------------------------------------------
/lessons/LS26/NodeAjaxTest/NodeAjaxTest01.js:
--------------------------------------------------------------------------------
1 | var http = require("http");
2 | var url = require("url");
3 |
4 | http.createServer(function (req, res) {
5 | //console.log(Object.keys(req),"___",Object.keys(res));
6 | //console.log("req.url:",req.url);
7 | // var getDataObj = url.parse(req.url,true).query;//parse函数中第二个参数为true的话返回一个对象
8 | var getDataStr = url.parse(req.url).query;//parse函数中第二个参数为true的话返回一个对象
9 |
10 | res.writeHead(200, {
11 | "Content-Type": "text/plain",
12 | // res.writeHead(200, {"Content-Type": "application/json",
13 | "Access-Control-Allow-Origin":"*", //在后端支持跨域访问的设置,响应头中的设置
14 | "Access-Control-Allow-Methods": "GET, POST"
15 | });
16 | setTimeout(function () {
17 | res.end("你好,我已收到你发的信息:"+getDataStr);
18 | },20000*Math.random());
19 | //res.end("你的输入信息是:"+getDataStr);
20 | }).listen(8080,"127.0.0.1");
21 | console.log("start server!");
--------------------------------------------------------------------------------
/lessons/LS26/NodeAjaxTest/NodeAjaxTest02.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Title
6 |
7 |
8 |
9 |
10 |
11 |
12 |
45 |
46 |
--------------------------------------------------------------------------------
/lessons/LS26/NodeAjaxTest/NodeJsonTest.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | JSON-Node-测试
6 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
47 |
48 |
--------------------------------------------------------------------------------
/lessons/LS26/NodeAjaxTest/NodeJsonTest.js:
--------------------------------------------------------------------------------
1 | var fs = require("fs");
2 | var http = require("http");
3 | var url = require("url");
4 |
5 | http.createServer(function (req, res) {
6 | var getDataObj = url.parse(req.url,true).query;//parse第二参数决定了是否转成对象
7 | //console.log(getDataObj);
8 | var arrayIndex = getDataObj.id-1;
9 | //console.log(typeof arrayIndex,arrayIndex);
10 | fs.readFile("./NodeJsonTest.json", function readData(err, data) {
11 | var jsonArr=JSON.parse(data);
12 | //console.log("jsonArr:",jsonArr[arrayIndex]);
13 |
14 | //res.writeHead(200, {"Content-Type": "text/plain",
15 | res.writeHead(200, {"Content-Type": "application/json",
16 | "Access-Control-Allow-Origin":"*",
17 | "Access-Control-Allow-Methods": "GET, POST"
18 | });
19 |
20 | res.end(JSON.stringify(jsonArr[arrayIndex]));
21 | });
22 |
23 | }).listen(8080,"127.0.0.1");
24 | console.log("start server!");
25 |
26 |
27 | /*
28 | var readableStream = fs.createReadStream("./NoseJsonTest.txt");
29 | var data = "";
30 | readableStream.on("data", function(chunk){
31 | data += chunk;
32 | });
33 | readableStream.on("end", function(){
34 | console.log(data,typeof data);
35 | });
36 | */
--------------------------------------------------------------------------------
/lessons/LS26/NodeAjaxTest/NodeJsonTest.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "index": "111111",
4 | "id": "2010015001",
5 | "name": "aaaaa",
6 | "score": "60"
7 | },
8 | {
9 | "index": "222222",
10 | "id": "2010015002",
11 | "name": "bbbbb",
12 | "score": "76"
13 | },
14 | {
15 | "index": "333333",
16 | "id": "2010015003",
17 | "name": "ccccc",
18 | "score": "63"
19 | },
20 | {
21 | "index": "444444",
22 | "id": "2010015004",
23 | "name": "ddddd",
24 | "score": "74"
25 | },
26 | {
27 | "index": "555555",
28 | "id": "2010015005",
29 | "name": "eeeee",
30 | "score": "72"
31 | },
32 | {
33 | "index": "66666",
34 | "id": "2010015006",
35 | "name": "fffff",
36 | "score": "76"
37 | },
38 | {
39 | "index": "77777",
40 | "id": "2010015007",
41 | "name": "ggggg",
42 | "score": "83"
43 | }
44 | ]
--------------------------------------------------------------------------------
/lessons/LS26/NodePackDemo/Person.js:
--------------------------------------------------------------------------------
1 | function Person(name,age) {
2 | this.name = name;
3 | this.age = age;
4 | }
5 | Person.prototype.show = function(){
6 | console.log("i'm",this.name,",i'm ",this.age,"years old!")
7 | }
8 | module.exports = Person;
9 |
10 | //任务:创建一个Student.js文件
11 | //创建一个Student模块,实现导出、导入和模块使用
--------------------------------------------------------------------------------
/lessons/LS26/NodePackDemo/test01.js:
--------------------------------------------------------------------------------
1 | //
2 | var a = "a";
3 | var b = 123;
4 | var foo = function () {
5 | console.log(a,b);
6 | return 0;
7 | }
8 | module.exports.a = a;
9 | module.exports.b = b;
10 | module.exports.c = foo;
11 |
--------------------------------------------------------------------------------
/lessons/LS26/NodePackDemo/test02.js:
--------------------------------------------------------------------------------
1 | // var test01 = require("./test01");
2 | // console.log(test01.a);
3 | // console.log(test01.b);
4 | // console.log(test01.c());
5 |
6 | var Person = require("./Person");
7 | var p = new Person("jack",23);
8 | p.show();
--------------------------------------------------------------------------------
/lessons/LS26/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LS12
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/lessons/LS26/js/demo01.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //理解JS中的相关概念的理解(线程、异步、阻塞、并行)
5 | //Part111111111111 异步的案例
6 | //情形一 平时作业
7 | // 老师 (JS单线程):留作业 - ************ - 老师判作业
8 | // 学生1(IO 线程):****** - 学生完成作业 - **********
9 | // 学生2(IO 线程):****** - 学生完成作业 - **********
10 | // 学生3(IO 线程):****** - 学生完成作业 - **********
11 |
12 |
13 | // 情形二 银行营业厅 (一个专员的情景,后端是同步处理的情况下)
14 | // 许多客户(许多前端用户) 营业员(后端服务)
15 | // 客户1 取号 |( 其他事务 )| 完成业务
16 | // 客户2 取号 | ( 其他事务 ) |完成业务
17 | // 客户3 取号| ( 其他事务 ) |完成业务
18 |
19 | // 专员1 -- |处理业务1-----| |处理业务2-----| |处理业务3-----|
20 |
21 |
22 | //情形三 银行营业厅 多个专员时 (后端是同步处理多线程情况下,线程是有限的)
23 | // 许多客户(许多前端用户) 营业员(后端服务)
24 | // 客户1 取号 |( 其他事务 )| 完成业务
25 | // 客户2 取号 | ( 其他事务 )|完成业务
26 | // 客户3 取号| ( 其他事务 ) |完成业务
27 |
28 | // 专员1 -- |处理业务1-----| |处理业务3-----|
29 | // 专员2 -- |处理业务2-----|
30 |
31 |
32 | //情形四 银行营业厅 (后端的是单线程异步事件驱动的形式)
33 | // 客户1 取号 | ( 其他事务 ) | 完成业务
34 | // 客户2 取号 | ( 其他事务 ) |完成业务
35 | // 客户3 取号| ( 其他事务 ) |完成业务
36 |
37 | // 客服 |受理| |分发| |通知|
38 |
39 | // 业务员1 -- |处理业务1-----|
40 | // 业务员2 -- |处理业务2-----|
41 | // 业务员3 -- |处理业务3-----|
42 |
43 | //Part2222222222 思考企业组织结构,总经理发布任务后就去忙别的了,是异步的
44 | // 副总经理将任务分发后也去忙自己的去路,也是异步的
45 | // 总经理 ---副总经理1 --助理11
46 | // --助理12
47 | // --助理13
48 | // ---副总经理2 --助理21
49 | // --助理22
50 | // --助理23
51 |
52 | //Part3333333333 思考车站售票窗口排队等候的人是同步还是异步,阻塞还是非阻塞
53 |
54 | //Part4444444444一个线程是否可以同时完成两个任务,如何理解任务的并发
55 | //一个人,同时画一个圆和一个矩形
56 |
--------------------------------------------------------------------------------
/lessons/LS26/js/demo03.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //发布订阅 实例/////////////////////
5 |
6 | var Subject = function(){
7 | var _observer = [];
8 | this.attach = function(observer){
9 | _observer.push(observer);
10 | };
11 | this.detach = function(){
12 | _observer.pop();
13 | };
14 | this.notify = function(msg){
15 | for(var i=0;i<_observer.length;i++){
16 | _observer[i].update(msg);
17 | }
18 | };
19 | this.print = function(){
20 | console.log(_observer.length);
21 | console.log(_observer);
22 | };
23 | };
24 | var Observer = function(name){
25 | this.update = function(msg){
26 | console.log('i am '+name+',and i get the message: '+msg);
27 | };
28 | };
29 | var sub = new Subject()
30 | sub.attach(new Observer('a'));
31 | sub.attach(new Observer('b'));
32 | sub.notify('hello');
33 | //sub.print();
34 |
35 | setTimeout(function(){
36 | var c = new Observer('c');
37 | sub.detach();
38 | sub.attach(c);
39 | sub.notify('world');
40 | //sub.print();
41 | },5000);
42 |
43 | //Promise 参见ES6部分///////////////////////
44 |
--------------------------------------------------------------------------------
/lessons/LS26/js/demo04-ajax.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //XMLHttpRequest Get 请求
5 | //后端代码参见参见NodeAjaxTest01.js
6 | //实例一
7 | var xhr = new XMLHttpRequest();
8 | xhr.onreadystatechange = function () {
9 | //console.log(xhr.readyState,xhr.status);
10 | if (xhr.readyState == 4) {
11 | //表示服务器的相应代码是200;正确返回了数据
12 | if (xhr.status == 200) {
13 | var message = xhr.responseText;
14 | console.log(message);
15 | }
16 | }
17 | };
18 | xhr.open("get", "http://127.0.0.1:8080?getInfo=MyGetInformation", true);
19 | //xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");//post需增加
20 | xhr.send();
21 |
22 |
23 |
24 |
25 | // 域名检测
26 | // http://panda.www.net.cn/cgi-bin/check.cgi?area_domain=qq.com
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/lessons/LS26/js/demo04-node.js:
--------------------------------------------------------------------------------
1 | var http = require("http");
2 | var url = require("url");
3 |
4 | http.createServer(function (req, res) {
5 | //console.log(Object.keys(req),"___",Object.keys(res));
6 | //console.log("req.url:",req.url);
7 | // var getDataObj = url.parse(req.url,true).query;//parse函数中第二个参数为true的话返回一个对象
8 | var getDataStr = url.parse(req.url).query;//parse函数中第二个参数为true的话返回一个对象
9 |
10 | res.writeHead(200, {
11 | "Content-Type": "text/plain",
12 | // res.writeHead(200, {"Content-Type": "application/json",
13 | "Access-Control-Allow-Origin":"*", //在后端支持跨域访问的设置,响应头中的设置
14 | "Access-Control-Allow-Methods": "GET, POST"
15 | });
16 | setTimeout(function () {
17 | res.end("你好,我已收到你发的信息:"+getDataStr);
18 | },20000*Math.random());
19 | //res.end("你的输入信息是:"+getDataStr);
20 | }).listen(8080,"127.0.0.1");
21 | console.log("start server!");
22 |
--------------------------------------------------------------------------------
/lessons/LS27/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LS13
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/lessons/LS27/js/demo01.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 |
5 | //例1 通过var定变量 ES5中没有块作用域{ }外可以访问{ }内变量
6 | {
7 | var a = 23;
8 | }
9 | console.log(a);//由于没有块作用域,a可以正常输出
10 |
11 | //例2
12 | for(var i=0;i<5;i++){
13 | //do somethings
14 | }
15 | console.log("i:",i);//此处i依然存在
16 |
17 |
18 | //例3 通过var声明的变量,由于没有块作用域,容易造成变量污染
19 | var userId = 123;
20 | document.onclick = function () {
21 | console.log("userId = ",userId);
22 | //alert("userId = "+userId);
23 | };
24 |
25 | //一长串代码后,假如忘记上边定义了userID,容易重复定义造成变量污染
26 | var a=2,b=3;
27 | if(a
2 |
3 |
4 |
5 | LS13
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/lessons/LS28/js/demo11.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //字符串也可以解构赋值
5 | const [a, b, c, d, e] = 'hello';//相当于将'hello'转成了["h","e","l","l","o"]后解构
6 | console.log(a); // "h"
7 | console.log(b); // "e"
8 | console.log(c); // "l"
9 | console.log(d); // "l"
10 | console.log(e); // "o"
11 |
12 | //类似数组的对象都有一个length属性,因此还可以对这个属性解构赋值。
13 | let {length : len} = 'hello';
14 | console.log(len); // 5
15 |
16 |
17 | //解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。
18 | let {toString: s1} = 123;
19 | console.log(s1); //
20 | //s1 === Number.prototype.toString // true
21 |
22 | let {toString: s2} = true;
23 | console.log(s2); //
24 | //s2 === Boolean.prototype.toString // true
25 |
26 | //上面代码中,数值和布尔值的包装对象都有toString属性,因此变量s都能取到值。
27 |
28 | //解构赋值的规则是,只要等号右边的值不是对象,就先将其转为对象。
29 | // 由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错。
30 | // let { prop: x } = undefined; // TypeError
31 | // let { prop: y } = null; // TypeError
32 |
33 |
--------------------------------------------------------------------------------
/lessons/LS28/js/demo12.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | function add([x, y]){
5 | return x + y;
6 | }
7 | add([1, 2]); // 3
8 |
9 | /////
10 | [[1, 2], [3, 4]].map(function([a, b]){return a + b;});
11 | // [ 3, 7 ]
12 | //箭头函数表示形式 [[1, 2], [3, 4]].map(([a, b]) => a + b);
13 |
14 | /////
15 | //函数参数的解构也可以使用默认值,下例中用了两次的解构赋值
16 | function move1({x = 0, y = 0} = {}) {
17 | return [x, y];
18 | }
19 | console.log(move1({x: 3, y: 4})); // [3, 4]
20 | console.log(move1({x: 3})); // [3, 0]
21 | console.log(move1({})); // [0, 0]
22 | console.log(move1()); // [0, 0]
23 |
24 | ///////
25 | //注意,下面的写法会得到不一样的结果。
26 | function move2({x, y} = { x: 0, y: 0 }) {
27 | return [x, y];
28 | }
29 | console.log(move2({x: 3, y: 8})); // [3, 8]
30 | console.log(move2({x: 3})); // [3, undefined]
31 | console.log(move2({})); // [undefined, undefined]
32 | console.log(move2()); // [0, 0]
33 | //上面代码是为函数move的参数指定默认值,而不是为变量x和y指定默认值,所以会得到与前一种写法不同的结果。
34 |
35 |
36 | //undefined就会触发函数参数的默认值
37 | [1, undefined, 3].map(function(x = 'yes') {return x;});
38 | // [ 1, 'yes', 3 ]
39 | //箭头函数表示形式 [1, undefined, 3].map((x = 'yes') => x);
40 |
--------------------------------------------------------------------------------
/lessons/LS28/js/demo13.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | // 1 交换变量的值
5 | var [x,y] = ["a","b"];
6 | [x, y] = [y, x];
7 | console.log(x,y);//b,a
8 | //上面代码交换变量x和y的值,这样的写法不仅简洁,而且易读,语义非常清晰。
9 |
10 | // 2 从函数返回多个值
11 | // 函数只能返回一个值,如果要返回多个值,只能将它们放在数组或对象里返回。
12 | // 有了解构赋值,取出这些值就非常方便
13 |
14 | // 返回一个数组
15 | function example() {
16 | return [1, 2, 3];
17 | }
18 | var [a, b, c] = example();
19 |
20 | // 返回一个对象,解构所有属性
21 | function example() {
22 | return {
23 | foo: 1,
24 | bar: 2
25 | };
26 | }
27 | var { foo, bar } = example();
28 |
29 | // 3 函数参数的定义
30 | //解构赋值可以方便地将一组参数与变量名对应起来。
31 | // 参数是一组有次序的值
32 | function f([x, y, z]) {
33 | console.log(x);
34 | console.log(y);
35 | console.log(z);
36 | }
37 | f([1, 2, 3]);
38 |
39 | // 参数是一组无次序的值
40 | function f({x, y, z}) {
41 | console.log(x);
42 | console.log(y);
43 | console.log(z);
44 | }
45 | f({z: 3, y: 2, x: 1});
--------------------------------------------------------------------------------
/lessons/LS28/js/demo14.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | // 4 提取JSON数据
5 | //解构赋值对提取JSON对象中的数据,尤其有用。
6 | var jsonData = {
7 | id: 42,
8 | status: "OK",
9 | data: [867, 5309]
10 | };
11 | let { id, status, data: number } = jsonData;
12 | console.log(id, status, number);
13 | // 42, "OK", [867, 5309]
14 | //上面代码可以快速提取JSON数据的值。
15 |
16 | //5 函数参数的默认值
17 | jQuery.ajax = function (url, {
18 | async = true,
19 | beforeSend = function () {},
20 | cache = true,
21 | complete = function () {},
22 | crossDomain = false,
23 | global = true,
24 | // ... more config
25 | }) {
26 | // ... do stuff
27 | };
28 | //指定参数的默认值,就避免了在函数体内部再写var foo = config.foo || 'default foo';这样的语句。
29 |
30 | //6 遍历Map结构 Map相关内容参见Map Set章节
31 | // 任何部署了Iterator接口的对象,都可以用for...of循环遍历。
32 | // Map结构原生支持Iterator接口,配合变量的解构赋值,获取键名和键值就非常方便。
33 | var map = new Map();
34 | map.set('first', 'hello');
35 | map.set('second', 'world');
36 | for (let [key, value] of map) {
37 | console.log(key + " is " + value);
38 | }
39 | // first is hello
40 | // second is world
41 | //如果只想获取键名,或者只想获取键值,可以写成下面这样。
42 | // 获取键名
43 | for (let [key] of map) {
44 | // ...
45 | }
46 | // 获取键值
47 | for (let [,value] of map) {
48 | // ...
49 | }
50 |
51 | // 7 输入模块的指定方法
52 | //加载模块时,往往需要指定输入那些方法。解构赋值使得输入语句非常清晰。
53 | const { SourceMapConsumer, SourceNode } = require("source-map");
54 |
--------------------------------------------------------------------------------
/lessons/LS28/js/demo15.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //
5 | // 以下三种解构赋值不得使用圆括号。
6 | //(1)变量声明语句中,不能带有圆括号。
7 | // 全部报错
8 | var [(a)] = [1];
9 | var {x: (c)} = {};
10 | var ({x: c}) = {};
11 | var {(x: c)} = {};
12 | var {(x): c} = {};
13 | var { o: ({ p: p }) } = { o: { p: 2 } };
14 | //上面三个语句都会报错,因为它们都是变量声明语句,模式不能使用圆括号
15 |
16 | //(2)函数参数中,模式不能带有圆括号
17 | //函数参数也属于变量声明,因此不能带有圆括号。
18 | // 报错
19 | function f([(z)]) { return z; }
20 |
21 | //(3)赋值语句中,不能将整个模式,或嵌套模式中的一层,放在圆括号之中
22 | // 全部报错
23 | ({ p: a }) = { p: 42 };
24 | ([a]) = [5];
25 | //上面代码将整个模式放在圆括号之中,导致报错。
26 | // 报错
27 | [({ p: a }), { x: c }] = [{}, {}];
28 | //上面代码将嵌套模式的一层,放在圆括号之中,导致报错。
29 |
30 | //可以使用圆括号的情况:赋值语句的非模式部分,可以使用圆括号。
31 | [(b)] = [3]; // 正确
32 | ({ p: (d) } = {}); // 正确
33 | [(parseInt.prop)] = [3]; // 正确
34 | // 上面三行语句都可以正确执行,它们的圆括号都不属于模式的一部分。
35 | // 第一行语句中,模式是取数组的第一个成员,跟圆括号无关
36 | // 第二行语句中,模式是p,而不是d
37 | // 第三行语句与第一行语句的性质一致
38 | // 即括号扩的是值而不是模式时可以使用括号,但建议能不用括号的尽量不用,避免产生歧义
--------------------------------------------------------------------------------
/lessons/LS29/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LS14
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/lessons/LS29/js/demo01.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | // ES6为字符串添加了遍历器接口,使得字符串可以被for...of循环遍历
5 | for (let codePoint of 'foo') {
6 | console.log(codePoint)
7 | }
8 | // "f"
9 | // "o"
10 | // "o"
11 |
12 | for (let key in 'foo') {
13 | console.log(key);
14 | }
15 |
16 | //提供新的方法用于查找、判断和生成字符串
17 | var s = 'Hello world!';
18 | s.startsWith('Hello'); // true
19 | s.endsWith('!'); // true
20 | s.includes('o'); // true
21 |
22 | //第二个参数,表示开始搜索的位置
23 | var s = 'Hello world!';
24 | s.startsWith('world', 6); // true
25 | s.endsWith('Hello', 5); // true
26 | s.includes('Hello', 6); // false
27 |
28 | //repeat方法返回一个新字符串,表示将原字符串重复n次。
29 | 'x'.repeat(3); // "xxx"
30 | 'hello'.repeat(2); // "hellohello"
31 | 'na'.repeat(0); // ""
32 | //参数如果是小数,会被取整。
33 | 'na'.repeat(2.9); // "nana"
34 | //如果repeat的参数是负数或者Infinity,会报错。
35 | 'na'.repeat(Infinity);
36 | // RangeError
37 | 'na'.repeat(-1);
38 | // RangeError
--------------------------------------------------------------------------------
/lessons/LS29/js/demo02.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //在ES5中,RegExp构造函数的参数有两种情况。
5 | //第一种情况是,参数是字符串,这时第二个参数表示正则表达式的修饰符(flag)。
6 | var regex = new RegExp('xyz', 'i');
7 | // 等价于
8 | var regex = /xyz/i;
9 | //第二种情况是,参数是一个正则表示式,这时会返回一个原有正则表达式的拷贝。
10 | var regex = new RegExp(/xyz/i);
11 | // 等价于
12 | var regex = /xyz/i;
13 | //但是,ES5不允许此时使用第二个参数,添加修饰符,否则会报错。
14 | var regex = new RegExp(/xyz/, 'i');
15 | // Uncaught TypeError: Cannot supply flags when constructing one RegExp from another
16 |
17 | //ES6改变了这种行为。如果RegExp构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符。
18 | // 而且,返回的正则表达式会忽略原有的正则表达式的修饰符,只使用新指定的修饰符。
19 | new RegExp(/abc/ig, 'i').flags// "i"
20 |
21 |
22 | //(粘连sticky)修饰符
23 | var s = 'aaa_aa_a';
24 | var r1 = /a+/g;
25 | var r2 = /a+/y;
26 | r1.exec(s); // ["aaa"]
27 | r2.exec(s); // ["aaa"]
28 | r1.exec(s); // ["aa"]
29 | r2.exec(s); // null
30 | //上面代码有两个正则表达式,一个使用g修饰符,另一个使用y修饰符。
31 | // 这两个正则表达式各执行了两次,第一次执行的时候,两者行为相同,剩余字符串都是_aa_a。
32 | //由于g修饰没有位置要求,所以第二次执行会返回结果,而y修饰符要求匹配必须从头部开始,所以返回null。
33 |
34 | var r = /hello\d/y;
35 | r.sticky // true
36 |
37 | // ES5的source属性
38 | // 返回正则表达式的正文
39 | /abc/ig.source
40 | // "abc"
41 |
42 | // ES6的flags属性
43 | // 返回正则表达式的修饰符
44 | /abc/ig.flags
45 | // 'gi'
46 |
--------------------------------------------------------------------------------
/lessons/LS30/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LS14
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/lessons/LS30/js/demo06.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | ////////////////////////////////
5 | var f = function (v) {
6 | return v + 1;
7 | };
8 | f(2);//返回3
9 |
10 | //使用箭头函数,上述代码等效如下,只有一个参数和一条语句
11 | var f = v => v + 1; //单参数可以不用(),单语句可以不用return关键字
12 | //var f = (v) => {return v + 1;};
13 | f(2);//返回3
14 |
15 |
16 | ///////////////////////////////
17 | //没有参数和有多个参数的情况下,需要使用小括号来表示参数,如果有多条语句则需要有大括号表示函数体
18 | var f = () => 5;
19 | // 等同于
20 | var f = function () {
21 | return 5
22 | };
23 |
24 | var foo = (num1, num2) => {
25 | if (num1 > num2) {
26 | return num1 * 2;
27 | } else {
28 | return num2 * 2;
29 | }
30 | };
31 | //foo(2,3);
32 | //foo(3,2);
33 | // 等同于 ES5的写法
34 | var foo = function (num1, num2) {
35 | if (num1 > num2) {
36 | return num1 * 2;
37 | } else {
38 | return num2 * 2;
39 | }
40 | };
41 | //foo(2,3);
42 | //foo(3,2);
43 |
44 | ///////////////////////////////////
45 | var max = function (a, b) {
46 | return a > b ? a : b;
47 | };
48 |
49 | //箭头函数可以与变量解构结合使用
50 | const full = ({ first, last }) => last + ' ' + first;
51 | full({first:"Ming",last:"Li"});
52 |
53 | // 等同于
54 | function full({ first, last }) {
55 | return last + ' ' + first;
56 | }
57 | full({first:"Ming",last:"Li"});
58 |
59 |
--------------------------------------------------------------------------------
/lessons/LS30/js/demo08.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | // ES5 中实现函数参数默认值的方法
5 | var sum = function(a,b,c){
6 | b = b||4;
7 | c = c||5;
8 | return a+b+c;
9 | };
10 | console.log(sum(1,2,3));//1+2+3
11 | console.log(sum(1,2));//1+2+5
12 | console.log(sum(1));//1+4+5
13 | console.log(sum(1,0,0));//本应为1+0+0,但此处为1+4+5,代码有问题需优化,优化如下
14 |
15 | //优化改造版本
16 | var sum = function(a,b,c){
17 | if(b!=false){b = b||4;}//(b!=false)&&(b=b||4);
18 | if(c!=false){c = c||5;}//(c!=false)&&(c=c||5);
19 | return a+b+c;
20 | };
21 | console.log(sum(1,2,3));//1+2+3
22 | console.log(sum(1,2));//1+2+5
23 | console.log(sum(1));//1+4+5
24 | console.log(sum(1,0,0));//1+0+0
25 |
26 |
27 | // ES6 中实现函数参数默认值的方法 ,使用babble查看ES5的写法
28 | var sum = function(a,b=4,c=5){
29 | return a+b+c;
30 | };
31 | console.log(sum(1,2,3));//1+2+3
32 | console.log(sum(1,2));//1+2+5
33 | console.log(sum(1));//1+4+5
34 | console.log(sum(1,0,0));//1+0+0
35 |
36 | //默认值案例
37 | function fetch(url, { body = '', method = 'GET', headers = {} } = {}) {
38 | console.log(url);
39 | console.log(body);
40 | console.log(method);
41 | console.log(headers);
42 | }
43 |
44 | fetch('http://example.com')
45 |
46 | //回顾解构赋值传参时,默认参数案例
--------------------------------------------------------------------------------
/lessons/LS30/js/demo09.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | // Part 11111
5 | function foo(x=5){
6 | let x = 1;//报错
7 | const x = 2;//报错
8 | var x = 3;//正常
9 | }
10 | foo();
11 |
12 |
13 | // Part 222222
14 | //默认值顺序,参数一般有顺序,有默认值的参数应该是尾参数
15 | //否则无法使有默认值的用默认值,没有默认值的用传递的参数
16 | function f(x = 1,y) {
17 | return [x,y];
18 | }
19 | f();//[1,undefined]
20 | f(2);//[2,undefined]
21 | //f(,3);//报错,无法使x用1,y用3
22 |
23 |
24 | //所以有默认值的参数在最后
25 | function f(x,y = 1) {
26 | return [x,y];
27 | }
28 | f();//[undefined, 1]
29 | f(2);//[2, 1] 这样就可以x为传递的参数,y为默认的值
--------------------------------------------------------------------------------
/lessons/LS30/js/demo10.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | // Part1111111111111
5 | // ES5中 实参数大于形参数量时,可以通过arguments来获得所有参数
6 | function test() {
7 | console.log(arguments);//console.log(test.arguments);
8 | }
9 | test("a","b","c");//
10 |
11 | //...Rest 相当于合并若干参数为一个数组,主要用于函数定义时,代替 arguments,组解决arguments的弊端
12 | function f(...y){
13 | console.log(y);
14 | }
15 | f("a","b","c");//输出 ["a","b","c"]
16 |
17 | function add(...values) {
18 | let sum = 0;
19 | for (var val of values) {
20 | sum += val;
21 | }
22 | return sum;
23 | }
24 | add(2, 5, 3) // 10
25 |
26 | //比arguments使用更加灵活,比如只想看从第二个开始之后的参数
27 | function f(x,...y){
28 | console.log(x,y);
29 | }
30 | f("a","b","c","d");//输出 "a",["b","c","d"]
31 | //思考:f("a",["b","c","d"]);//输出 "a",[["b","c","d"]]
32 | f("a");//输出 "a",[]
33 | f();//输出 undefined,[]
34 | //思考function f(x,...y,z){console.log(y);}//此时y输出是什么
35 |
36 |
37 | // Part2222222222222
38 | //...Spread 扩展操作符 相当于解数组为分散的参数,主要用于函数调用时,...Rest的逆运算
39 | function f(x,...y){
40 | console.log(x,y);
41 | }
42 | f("a",...["b","c"]);//等价于f("a","b","c");
43 | f("a");//输出 "a",[]
44 | f();//输出 undefined,[]
45 |
46 |
47 | //Part333333333333 扩展知识 call与apply的转换 两者之间的区别 课通过...Rest和...Spread转换
48 | function abc(...v){
49 | console.log(v)
50 | }
51 | o1 = {};
52 | abc.call(o1,...[1,2,3]);//等效于 abc.apply(o1,[1,2,3]);
53 |
54 | //函数定义和调用时的 合并元素为数组(...Rest) 与 拆分数组为各个元素(...Spread)
55 |
56 |
57 |
--------------------------------------------------------------------------------
/lessons/LS31/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LS14
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/lessons/LS32/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LS15
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/lessons/LS32/js/demo04.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //Part11111111111111111111111111111111111111111111111
5 | //类的prototype属性相当于实例的原型,所有在类中定义的方法,都会被实例继承。
6 | //如果在一个方法前,加上static关键字,
7 | //就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。
8 | class Foo {
9 | static classMethod() {
10 | return 'hello';
11 | }
12 | }
13 | Foo.classMethod(); // 'hello'
14 | var foo = new Foo();
15 | foo.classMethod();// TypeError: foo.classMethod is not a function
16 | // 上面代码中,Foo类的classMethod方法前有static关键字,表明该方法是一个静态方法,
17 | // 可以直接在Foo类上调用(Foo.classMethod()),而不是在Foo类的实例上调用。
18 | // 如果在实例上调用静态方法,会抛出一个错误,表示不存在该方法
19 | // 注意,如果静态方法包含this关键字,这个this指的是类,而不是实例。
20 |
21 | class Foo {
22 | static bar () {
23 | this.baz();
24 | }
25 | static baz () {
26 | console.log('hello');
27 | }
28 | baz () {
29 | console.log('world');
30 | }
31 | }
32 | Foo.bar(); // hello
33 | // 上面代码中,静态方法bar调用了this.baz,这里的this指的是Foo类,
34 | // 而不是Foo的实例,等同于调用Foo.baz。
35 | // 另外,从这个例子还可以看出,静态方法可以与非静态方法重名。
36 |
37 |
38 | //思考下边的例子
39 | class Foo {
40 | static baz () {
41 | console.log('hello');
42 | }
43 | baz () {
44 | console.log('world');
45 | Foo.baz();//
46 | }
47 | static fun1(o){
48 | // this.fun2();//报错
49 | o.fun2();
50 | }
51 | fun2(){
52 | console.log("fun2")
53 | }
54 | }
55 | var a = new Foo();
56 | a.baz();//world hello
57 |
58 | Foo.fun1(a);//fun2
59 |
60 |
--------------------------------------------------------------------------------
/lessons/LS32/js/demo05.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by qile on 2017/8/14.
3 | */
4 | //静态属性指的是 Class 本身的属性,即Class.propName,而不是定义在实例对象(this)上的属性。
5 | class Foo {
6 | }
7 | Foo.prop = 1;
8 | Foo.prop // 1
9 | //上面的写法为Foo类定义了一个静态属性prop。
10 | //目前,只有这种写法可行,因为 ES6 明确规定,Class 内部只有静态方法,没有静态属性。
11 |
12 | /*
13 | // 以下两种写法都无效
14 | class Foo {
15 | // 写法一
16 | prop: 2
17 |
18 | // 写法二
19 | static prop: 2
20 | }
21 |
22 | Foo.prop // undefined
23 | */
24 |
25 | //目前有一个静态属性的提案,对实例属性和静态属性都规定了新的写法
26 | class MyClass {
27 | static myStaticProp = 42;
28 | constructor() {
29 | console.log(MyClass.myStaticProp); // 42
30 | }
31 | }
32 | // 同样的,这个新写法大大方便了静态属性的表达,ES6暂不支持
33 | // 老写法
34 | class Foo {
35 | // ...
36 | }
37 | Foo.prop = 1;
38 |
39 | // 新提案的写法 ES6暂不支持
40 | class Foo {
41 | static prop = 1;
42 | }
43 | // 上面代码中,老写法的静态属性定义在类的外部。整个类生成以后,再生成静态属性。
44 | // 这样让人很容易忽略这个静态属性,也不符合相关代码应该放在一起的代码组织原则。
45 | // 另外,新写法是显式声明(declarative),而不是赋值处理,语义更好
--------------------------------------------------------------------------------
/lessons/LS33/demo04.js:
--------------------------------------------------------------------------------
1 |
2 | //Promise静态方法 Promise.resolve
3 |
4 | //Promise.resolve参数3种情况
5 | //Promise.resolve(value); //返回的Promise对象状态为fulfilled(例外:错误对象),并且将该value传递给对应的then方法
6 | //Promise.resolve(promise); //直接返回这个Promise对象
7 | //Promise.resolve(thenable); //返回的Promise对象的最终状态由then方法执行决定
8 |
9 | //
10 | Promise.resolve("Success").then(function (value) {
11 | console.log(value); // "Success"
12 | }, function (value) {});
13 |
14 | var promise1 = Promise.resolve([1, 2, 3]);
15 | promise1.then(function (value) {
16 | console.log(value);
17 | });
18 |
19 | //
20 | Promise.resolve(new Promise((resolve,reject)=>{
21 | setTimeout(reject,2000,"bbb");
22 | })).then(
23 | (val)=>{console.log("val:",val)},
24 | (err)=>{console.log("err:",err)}
25 | )
26 |
27 | //
28 | var original = Promise.resolve('xxxxx');
29 | var cast = Promise.resolve(original);
30 | cast.then(function (value) {
31 | console.log('value: ' + value);
32 | });
33 | console.log('original === cast ? ' + (original === cast));
34 |
35 |
36 | ////Promise静态方法 Promise.reject
37 | //Promise.reject()
38 | var p = Promise.reject("reject reason");
39 | p.then(
40 | (v)=>{console.log("v:",v)},
41 | (e)=>{console.log("e:",e)}
42 | )
43 |
44 |
--------------------------------------------------------------------------------
/lessons/LS33/demo05.js:
--------------------------------------------------------------------------------
1 | //Promise静态方法 Promise.all
2 | const p1 = new Promise((resolve, reject) => {
3 | resolve('hello');
4 | }).then(result => result);
5 |
6 | const p2 = new Promise((resolve, reject) => {
7 | resolve('world');//若都是resolve,则返回所有Promise对象成功时的传值
8 | //reject("error!");//若有reject,则返回reject传的值
9 | }).then(result => result);
10 |
11 | Promise.all([p1, p2]) //数组里若不是Promise对象的话,会调用resolve转成Promise对象
12 | .then(result => console.log("xx",result))
13 | .catch(e => console.log("yy",e));
14 |
15 | //Promise静态方法 Promise.race
16 | var p1 = new Promise((resolve,reject)=>{setTimeout(resolve,Math.random()*5000,"aaa")});
17 | var p2 = new Promise((resolve,reject)=>{setTimeout(reject,Math.random()*5000,"bbb")});
18 | var p3 = Promise.race([p1,p2]).then(
19 | (val)=>{console.log("val:",val)},
20 | (err)=>{console.log("err:",err)}
21 | );
22 |
23 |
--------------------------------------------------------------------------------
/lessons/LS33/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 待补充
6 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/lessons/LS34/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 待补充
6 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/materials/outline.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/outline.doc
--------------------------------------------------------------------------------
/materials/schedule.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/schedule.doc
--------------------------------------------------------------------------------
/materials/slides/ch01.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch01.pptx
--------------------------------------------------------------------------------
/materials/slides/ch02.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch02.pptx
--------------------------------------------------------------------------------
/materials/slides/ch03.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch03.pptx
--------------------------------------------------------------------------------
/materials/slides/ch04.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch04.pptx
--------------------------------------------------------------------------------
/materials/slides/ch05.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch05.pptx
--------------------------------------------------------------------------------
/materials/slides/ch06.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch06.pptx
--------------------------------------------------------------------------------
/materials/slides/ch07.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch07.pptx
--------------------------------------------------------------------------------
/materials/slides/ch08.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch08.pptx
--------------------------------------------------------------------------------
/materials/slides/ch09.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch09.pptx
--------------------------------------------------------------------------------
/materials/slides/ch10.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch10.pptx
--------------------------------------------------------------------------------
/materials/slides/ch11.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch11.pptx
--------------------------------------------------------------------------------
/materials/slides/ch12.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch12.pptx
--------------------------------------------------------------------------------
/materials/slides/ch13.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch13.pptx
--------------------------------------------------------------------------------
/materials/slides/ch14.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch14.pptx
--------------------------------------------------------------------------------
/materials/slides/ch15.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch15.pptx
--------------------------------------------------------------------------------
/materials/slides/ch16.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch16.pptx
--------------------------------------------------------------------------------
/materials/slides/ch17.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch17.pptx
--------------------------------------------------------------------------------
/materials/slides/ch18.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch18.pptx
--------------------------------------------------------------------------------
/materials/slides/ch19.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch19.pptx
--------------------------------------------------------------------------------
/materials/slides/ch20.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch20.pptx
--------------------------------------------------------------------------------
/materials/slides/ch21.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch21.pptx
--------------------------------------------------------------------------------
/materials/slides/ch22.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch22.pptx
--------------------------------------------------------------------------------
/materials/slides/ch23.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch23.pptx
--------------------------------------------------------------------------------
/materials/slides/ch24.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch24.pptx
--------------------------------------------------------------------------------
/materials/slides/ch25.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch25.pptx
--------------------------------------------------------------------------------
/materials/slides/ch26.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch26.pptx
--------------------------------------------------------------------------------
/materials/slides/ch27.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch27.pptx
--------------------------------------------------------------------------------
/materials/slides/ch28.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch28.pptx
--------------------------------------------------------------------------------
/materials/slides/ch29.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch29.pptx
--------------------------------------------------------------------------------
/materials/slides/ch30.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch30.pptx
--------------------------------------------------------------------------------
/materials/slides/ch31.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch31.pptx
--------------------------------------------------------------------------------
/materials/slides/ch32.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch32.pptx
--------------------------------------------------------------------------------
/materials/slides/ch33.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch33.pptx
--------------------------------------------------------------------------------
/materials/slides/ch34.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/ch34.pptx
--------------------------------------------------------------------------------
/materials/slides/cha34.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/edu2act/course-javascript-advanced/2787c7abb468f6fdaf2aea267122570e146d339e/materials/slides/cha34.pptx
--------------------------------------------------------------------------------
/tasks/1.JS 数据结构与算法/1-1.数组/数组任务1.js:
--------------------------------------------------------------------------------
1 | /////任务一/////
2 | // 请实现find_data_index_from_array函数,该函数的需求如下:
3 | // 在数组data_array中查找一个元素(data),找到后返回它的index(也就是他是数组中的第几个数据)。
4 | // 如果该元素不存在于数组中,则返回-1
5 |
6 | function find_data_index_from_array( data_array, data )
7 | {
8 | //在这里写入代码
9 | var index;
10 | for(var i=0;i data)
33 | {
34 | binary_tree_node.left = this._insert_data_to_tree(binary_tree_node.left, data);//递归调用
35 | }
36 | return binary_tree_node;
37 | };
38 |
39 | //测试代码如下
40 | var bt = new BinaryTree();
41 | bt.insert_data_to_tree(5);
42 | bt.insert_data_to_tree(8);
43 | bt.insert_data_to_tree(3);
44 | bt.insert_data_to_tree(2);
45 | bt.insert_data_to_tree(4);
46 | bt.insert_data_to_tree(7);
47 | bt.insert_data_to_tree(6);
48 | bt.insert_data_to_tree(9);
49 | console.log(bt);
50 |
51 |
52 |
--------------------------------------------------------------------------------
/tasks/1.JS 数据结构与算法/1-3.二叉树/二叉树任务3.js:
--------------------------------------------------------------------------------
1 | /////任务三/////
2 | // 本节通过上一节学习的向二叉树中插入数据来创建一棵二叉树。将一个数组传入到函数中,
3 | // 然后按照数组index的顺序不断插入根节点来完成二叉树的创建。
4 | // 请在create_tree_from_array中添加创建二叉树的代码,函数的参数是要生成二叉树的数组,函数返回二叉树对象。
5 |
6 | function BinaryTreeNode(data, left, right)
7 | {
8 | this.data = data;
9 | this.left = left;
10 | this.right = right;
11 | return this;
12 | }
13 | function BinaryTree()
14 | {
15 | this.root = null;
16 | }
17 | BinaryTree.create_tree_from_array = function(data)
18 | {
19 | var binary_tree = new BinaryTree();
20 | //在这里写入代码
21 | for(var i=0;i data)
38 | {
39 | binary_tree_node.left = this._insert_data_to_tree(binary_tree_node.left, data);//递归调用
40 | }
41 | return binary_tree_node;
42 | };
43 | //测试代码
44 | var bt = BinaryTree.create_tree_from_array([5,8,3,2,4,7,6,9]);
45 | console.log(bt);
--------------------------------------------------------------------------------
/tasks/1.JS 数据结构与算法/1-4.哈希表/哈希表任务1.js:
--------------------------------------------------------------------------------
1 | /////任务一/////
2 | // 本课学习的是哈希表的一种,他是由数组组成,每个数组元素指向一个用于存储数组。
3 | // 请在create_hash_table中添加代码,函数的参数为哈希表,函数返回哈希表对象。
4 | function HashTable() {
5 | this.table = null;
6 | }
7 |
8 | HashTable.create_hash_table = function(hash_size)
9 | {
10 | //在这里写入代码
11 | var ht = new HashTable();
12 | ht.table = new Array(hash_size);
13 | for(var i=0;i= 0 && temp < this.desc_sort[j]){
25 | this.desc_sort[j+1] = this.desc_sort[j];
26 | j--;
27 | }
28 | this.desc_sort[j+1] = temp;
29 | }
30 | return this;
31 | };
32 | //测试代码
33 | var arrSort = new ArraySort([7,5,3,4,1,9,2,6,8]);
34 | // var arrSort = new ArraySort("753419268");
35 | console.log(arrSort.desc_sort);
36 | arrSort.insert_sort();
37 | console.log(arrSort.desc_sort);
--------------------------------------------------------------------------------
/tasks/1.JS 数据结构与算法/1-5.排序/排序任务2.js:
--------------------------------------------------------------------------------
1 | /////任务二/////
2 | // 本课学习冒泡排序,他的工作原理如下:
3 | // 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
4 | // 走访数列的工作是重复地进行直到没有再需要交换后完成排序。
5 | // 在bubble_sort中添加代码,函数返回排序对象,排序结果存放在desc_sort中,
6 | // 按照升序(从小到大)排序。
7 | function ArraySort(data)
8 | {
9 | this.desc_sort = data.concat();
10 | return this;
11 | }
12 | ArraySort.prototype.bubble_sort = function ()
13 | {
14 | for(var i = 0 ; i= 1) {
25 | this._sort_gap_length(this.desc_sort,gap);
26 | gap = (gap-1)/3;
27 | }
28 | return this;
29 | };
30 | ArraySort.prototype._sort_gap_length = function(sort_data,gap)
31 | {
32 | for (var i = gap; i < this.desc_sort.length; i++) {
33 | for (var j = i; j >= gap && this.desc_sort[j] < this.desc_sort[j-gap];
34 | j -= gap) {
35 | this._swap_data(sort_data, j, j-gap);
36 | }
37 | }
38 | };
39 | ArraySort.prototype._swap_data = function (swap_data,i,j) {
40 | var temp = swap_data[i];
41 | swap_data[i] = swap_data[j];
42 | swap_data[j] = temp;
43 | };
44 | //测试代码
45 | var arrSort = new ArraySort([7,5,3,4,1,9,2,6,8]);
46 | // var arrSort = new ArraySort("753419268");
47 | console.log(arrSort.desc_sort);
48 | arrSort.shell_sort();
49 | console.log(arrSort.desc_sort);
--------------------------------------------------------------------------------
/tasks/1.JS 数据结构与算法/1-5.排序/排序任务5.js:
--------------------------------------------------------------------------------
1 | /////任务五/////
2 | // 本课学习快速排序,快速排序使用分治法策略来把一个串行分为两个子串行,工作原理如下:
3 | // 1.从数列中挑出一个元素,称为 "基准",
4 | // 2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。
5 | // 在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
6 | // 3.递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。
7 | // 在quick_sort中添加代码,函数返回排序对象,排序结果存放在desc_sort中,按照升序(从小到大)排序。
8 | function ArraySort(data)
9 | {
10 | this.desc_sort = data.concat();
11 | return this;
12 | }
13 | ArraySort.prototype.quick_sort = function()
14 | {
15 | this.desc_sort = this._quick_sort(this.desc_sort);
16 | return this;
17 | };
18 | ArraySort.prototype._quick_sort = function(sort_data)
19 | {
20 | if (sort_data.length == 0) return [];
21 | var left_data = [], right_data = [];
22 | var start_data = sort_data[0];
23 |
24 | for (var i = 1; i < sort_data.length; i++) {
25 | if (sort_data[i] < start_data) {
26 | left_data.push(sort_data[i]);
27 | }
28 | else {
29 | right_data.push(sort_data[i]);
30 | }
31 | }
32 | return this._quick_sort(left_data).concat(start_data,this._quick_sort(right_data));
33 | };
34 | //测试代码
35 | var arrSort = new ArraySort([7,5,3,4,1,9,2,6,8]);
36 | // var arrSort = new ArraySort("753419268");
37 | console.log(arrSort.desc_sort);
38 | arrSort.quick_sort();
39 | console.log(arrSort.desc_sort);
40 |
--------------------------------------------------------------------------------
/tasks/2.JS SICP训练营/2-1.过程与运算/过程与运算任务1.js:
--------------------------------------------------------------------------------
1 | //任务一
2 | // 在factorial函数中填入代码,实现n的的阶乘。 所谓n的阶乘就是,1 X 2 X 3 .... X ( n -1 ) X n
3 | //
4 | // 举例来说
5 | // 1的阶乘是 1
6 | // 2的阶乘是 1 X 2 = 2
7 | // 3的阶乘是 1 X 2 X 3 = 6
8 | function factorial(n){
9 | var result = n;
10 | for(var i=n-1;i>0;i--){
11 | result*=i
12 | }
13 | return result;
14 | }
15 | //思考0的阶乘是多少,上述代码是否还正确?如何修改?
16 |
17 | var factorial = function(n){
18 | if (n <= 0)
19 | return 1;
20 | else
21 | return n * func(n - 1);
22 | //return n * arguments.callee(n - 1);
23 | };
24 | console.log(factorial(4));
25 |
26 | //优点,可以是匿名函数
27 | (function(n){
28 | if (n <= 0)
29 | return 1;
30 | else
31 | return n * arguments.callee(n - 1);
32 | }(4));
--------------------------------------------------------------------------------
/tasks/2.JS SICP训练营/2-1.过程与运算/过程与运算任务3.js:
--------------------------------------------------------------------------------
1 | //任务三//
2 | // 假定有1美分,5美分,10美分,25美分,50美分的零钱无限多,试把任意钱换成零钱,
3 | // 写一个函数计算有多少种换法。
4 | // 请将代码写在count_change函数里,返回有多少种换算方法。
5 | // 该函数有一个参数,传入的是一个数字,单位是美分,比如,1美元,传入的是100美分。
6 |
7 | function count_change(amount,n){
8 | var m = n || 5;
9 | if(amount === 0) return 1;
10 | if(amount < 0 || n === 0) return 0;
11 | return count_change(amount, m - 1) + count_change(amount - value_of_currency(m), m);
12 | }
13 |
14 | function value_of_currency(n){
15 | if (n === 1) return 1;
16 | if (n === 2) return 5;
17 | if (n === 3) return 10;
18 | if (n === 4) return 25;
19 | if (n === 5) return 50;
20 | }
21 | count_change(123);
22 |
--------------------------------------------------------------------------------
/tasks/2.JS SICP训练营/2-1.过程与运算/过程与运算任务4.js:
--------------------------------------------------------------------------------
1 | // 任务四
2 | // 写一个f函数,满足下面的需求:
3 | // 如果 n < 3,那么f(n) = n
4 | // 如果 n >= 3, 那么 f(n) = f(n-1)+2f(n-2)+3f(n-3)
5 |
6 | //使用断点调试测试下述代码
7 | function f(n){
8 | if(n<3){
9 | return n;
10 | }else{
11 | return f(n-1)+2*f(n-2)+3*f(n-3);
12 | }
13 | }
--------------------------------------------------------------------------------
/tasks/2.JS SICP训练营/2-1.过程与运算/过程与运算任务6.js:
--------------------------------------------------------------------------------
1 | //任务5//
2 | // 实现gcd函数,用欧几里得法求两个参数的最大公约数 这一算法基于下面的观察,
3 | // 如果r是a和b的余数,那么a和b的公约数正好也是b和r的公约数,因此我们可以借助等式
4 | // gcd(a,b) = gcd(b,r)
5 | // 把一个gcd的计算问题连续的归约到越来越小的整数对的gcd的计算问题。例如
6 | // gdc(206,40) = gcd(40,6)= gcd(6,4) = gcd(4,2) = gcd(2,0) = 2
7 | // 可以证明,从任意两个正整数开始,反复执行这种归约,最终会产生一对数,其中的第二个是0,
8 | // 此时最大公约数就是另一个数。
9 | // 这个算法被称为欧几里得算法
10 |
11 | function gcd(num1, num2){
12 | if(num2 === 0) return num1;
13 | return gcd(num2,num1%num2);
14 | }
--------------------------------------------------------------------------------
/tasks/3.JS 初级挑战杯/3-1.趣味算法/趣味算法任务1.js:
--------------------------------------------------------------------------------
1 | //任务一//
2 | // 本节我们通过著名的"百钱百鸡"问题学习用js写算法
3 | // 一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,现在要用一百钱买一百只鸡,请问公鸡、母鸡、小鸡各多少只?
4 | // 声明一个数组变量arr_result,统计所有的满足条件的方案,并将这些方案以对象的形式存到变量arr_result中,数组中对象的格式如下:
5 | //
6 | // {cock:10,hen:10,chicken:10}
7 | // //cock、hen、chicken分别为公鸡、母鸡、小鸡,表示对象的三个键
8 | // //键对应的数值,分别为不同种类鸡的个数
9 | // 根据以上描述完成函数hundred_hundred_chickens()
10 |
11 | /*
12 | //C 语言实现
13 | #include
14 | void main()
15 | {
16 | int a,b,c;
17 | for(a=0;a<20;a++) //公鸡可能的只数
18 | for(b=0;b<(100-5*a)/3;b++) //母鸡可能的只数
19 | { c=100-a-b; //总数为100时,小鸡的只数
20 | if(c%3==0 && a*5+b*3+c/3==100) //若小鸡只数是3的倍数,且总价为100
21 | printf("a=%d\tb=%d\tc=%d\n",a,b,c);
22 | }
23 | getch();
24 | return 0;
25 | }
26 | */
27 | function hundred_hundred_chickens()
28 | {
29 | var arr_result = [];
30 | for(var a=0;a<20;a++){//公鸡可能的只数
31 | for(var b=0;b<(100-5*a)/3;b++)//母鸡可能的只数
32 | {
33 | var c=100-a-b;//总数为100时,小鸡的只数
34 | if(c%3==0 && a*5+b*3+c/3==100){//若小鸡只数是3的倍数,且总价为100
35 | //console.log(a,b,c);
36 | arr_result.push({cock:a,hen:b,chicken:c});
37 | }
38 | }
39 | }
40 | return arr_result;
41 | }
42 | hundred_hundred_chickens();
--------------------------------------------------------------------------------
/tasks/3.JS 初级挑战杯/3-1.趣味算法/趣味算法任务2.js:
--------------------------------------------------------------------------------
1 | //任务二//
2 | // 本节写一个算法,题目是:借书方案知多少
3 | // 问题描述:小明有5本新书,要借给A、B、C这三位学生,
4 | // 若每人每次只能借一本(不允许任何两个人同时借一本书),则可以有多少种不同的借法?
5 | // 声明数组变量arr_result,统计所有满足条件的借法,
6 | // 将这些借法以对象的形式存到变量arr_result中,数组中对象的格式如下:
7 | // {A:1,B:2,C:3}
8 | // //A、B、C分别为A、B、C三位同学,表示对象的三个键
9 | // //键对应的数值,分别为这三个同学借得第几本书(值为:1-5)
10 | // 根据以上描述完成函数borrow_books_schema()
11 |
12 | function borrow_books_schema()
13 | {
14 | var arr_result = [];
15 | let a,b,c;
16 | let count = 0;
17 | for(a = 1;a <= 5;a++) //a,b,c,分别从一号书借到五号书
18 | {
19 | for(b = 1;b <= 5;b++)
20 | {
21 | for(c = 1;c <= 5;c++)
22 | {
23 | if(0 != (a - b) * (b - c) * (c - a))
24 | {
25 | count++;
26 | arr_result.push({A:a,B:b,C:c})
27 | }
28 | }
29 | }
30 | }
31 | return arr_result;
32 | }
--------------------------------------------------------------------------------
/tasks/3.JS 初级挑战杯/3-1.趣味算法/趣味算法任务4.js:
--------------------------------------------------------------------------------
1 | //任务四//
2 | // 本节完成"抓交通肇事犯"的算法
3 | // 一辆卡车违反交通规则,撞人后逃跑。现场有三个人目击该事件,但是都没记住车牌号,只是记下车牌号的一些特征
4 | // 甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但是与前两位不同;丙是数学家,他说:四位数的车号刚好是一个整数的平方
5 | // 声明一个变量car_number,根据以上三个目击者的描述,计算出肇事车牌号,赋值给变量car_number
6 | // 根据以上描述完成函数catch_traffic_accidents_make(),函数的返回值为变量car_number
7 |
8 | function catch_traffic_accidents_make()
9 | {
10 | var car_number;
11 | var i,j,k,c;
12 | for(i=1;i<=9;i++) //i:车号前二位的取值
13 | for(j=0;j<=9;j++) //j:车号后二位的取值
14 | if(i!=j) //判断二位数字是否相异
15 | {
16 | k=i*1000+i*100+j*10+j; //计算出可能的整数
17 | //console.log(k);
18 | for(c=31;c<100;c++){ //判断该数是否为另一整数的平方
19 | if(c*c==k){
20 | car_number = k;
21 | }
22 | }
23 | }
24 | return car_number;
25 | }
26 | catch_traffic_accidents_make();
--------------------------------------------------------------------------------
/tasks/3.JS 初级挑战杯/3-1.趣味算法/趣味算法任务5.js:
--------------------------------------------------------------------------------
1 | //任务五//
2 | // 用js完成"兔子产子问题",计算每个月兔子的总个数
3 | // 有一对兔子,从出生后的第3个月起每个月都生一对兔子。
4 | // 小兔子长到第3个月后每个月又生一对兔子,假设所有的兔子都不死,
5 | // 问30个月内每个月的兔子总数分别为多少?
6 | // 声明数组变量arr_rabbit_count,根据上面的描述,
7 | // 计算出这30个月内,每个月兔子的总个数,并把它保存到数组变量arr_rabbit_count中
8 | // 数组arr_rabbit_count中第一个元素对应的是第一个月兔子的数量 第n个元素对应着第n个月兔子的数量
9 | // 根据以上描述完成函数number_of_rabbit_child(),返回值为数组arr_rabbit_count
10 |
11 | //完成下述代码
12 | function number_of_rabbit_child()
13 | {
14 | //var arr_rabbit_count = [1,1];
15 |
16 | var rabbitNum = 1;
17 | function getRabbitLiveMoth(){
18 |
19 | }
20 |
21 | for(var month=2;month<30;month++ ){
22 | if(month > 0 && month < 3){
23 | //arr_rabbit_count.push(1);
24 | return rabbitNum;
25 | } else {
26 | return getRabbitNum(month - 1) + getRabbitNum(month - 2);
27 | }
28 | }
29 | //return arr_rabbit_count;
30 | }
31 |
32 | /*
33 | public int getRabbitNum(int month) {
34 | int rabbitNum = 1;
35 | if(month > 0 && month < 3){
36 | return rabbitNum;
37 | } else {
38 | return getRabbitNum(month - 1) + getRabbitNum(month - 2);
39 | }
40 | }
41 | */
--------------------------------------------------------------------------------
/tasks/3.JS 初级挑战杯/3-1.趣味算法/趣味算法任务6.js:
--------------------------------------------------------------------------------
1 | //任务六//
2 | // 本节练习用js完成"牛顿迭代法求方程根"的算法
3 | // 编写用牛顿迭代法求方程根的函数。方程为 a*x*x*x+b*x*x+c*x+d=0,
4 | // 系数为a,b,c,d,这四个系数为函数的参数。求x在1附近的一个实根。
5 | // 函数f(x)=a*x*x*x+b*x*x+c*x+d,f(x)的导数为f'(x),f'(x)=3*a*x*x+2*b*x+c
6 | // 牛顿迭代法的公式是:x = x0 - f(x0)/f'(x0),设定迭代到|x-x0|<=0.00001时结束
7 | // 根据以上描述完成函数roots_newton_solve_equation(a,b,c,d),
8 | // 参数为:方程式的系数,返回值为:方程式的根
9 |
10 | function roots_newton_solve_equation(a,b,c,d)
11 | {
12 | let x1=1,x,f,f1;
13 | //迭代
14 | do
15 | { x=x1;
16 | f=((a*x+b)*x+c)*x+d;//原函数
17 | f1=(3*a*x+2*b)*x+c;//求导之后的函数
18 | x1=x-f/f1;
19 | } while(Math.abs(x1-x)>=0.00000001);
20 | return x1;
21 | }
22 |
23 | /*
24 | describe('practice-1-6', function () {
25 | it("根据牛顿迭代法求方程的根", function () {
26 | var root_x1 = roots_newton_solve_equation(2,-4,3,-6);
27 | console.info('root_x1:'+root_x1);
28 | expect(root_x1.toFixed(2)).toBe("2.00");
29 |
30 | var root_x2 = roots_newton_solve_equation(4,-2,3,-8);
31 | console.info('root_x2'+root_x2);
32 | expect(root_x2.toFixed(2)).toBe("1.22");
33 |
34 | var root_x3 = roots_newton_solve_equation(2,-5,3,-3);
35 | console.info('root_x3'+root_x3);
36 | expect(root_x3.toFixed(2)).toBe("2.13");
37 | });
38 | });
39 | */
40 |
--------------------------------------------------------------------------------
/tasks/3.JS 初级挑战杯/3-1.趣味算法/趣味算法任务7.js:
--------------------------------------------------------------------------------
1 | //任务七//
2 | // 本节练习完成"最佳存款方案"的算法
3 | // 假设银行整存零取的月息为0.63%。现在某人手中有一笔钱,
4 | // 他打算在今后的5年中的每年年底取出1000元,到第5年时刚好取完,请算出他存钱时应存入多少?
5 | // 由上面描述可以得到如下结果:
6 | //
7 | // 第5年年初的存款 = 1000/(1 + 12*0.0063)
8 | // 完成函数best_deposit_scheme(),函数返回值为:存入的钱
9 | function best_deposit_scheme()
10 | {
11 | let i;
12 | let money = 0.0;
13 | for(i = 0; i < 5; i++)
14 | {
15 | money = (money + 1000) / (1 + 12 * 0.0063);
16 | }
17 | //console.log("%0.2f \n",money);
18 | return money;
19 | }
20 |
21 |
22 | // (function main()
23 | // {
24 | // let i;
25 | // let money = 0.0;
26 | // for(i = 0; i < 5; i++)
27 | // {
28 | // money = (money + 1000) / (1 + 12 * 0.0063);
29 | // }
30 | // console.log("%0.2f \n",money);
31 | // return 0;
32 | // }());
--------------------------------------------------------------------------------
/tasks/3.JS 初级挑战杯/3-1.趣味算法/趣味算法任务8.js:
--------------------------------------------------------------------------------
1 | // 任务八//
2 | function bubble_sort(arr_number)
3 | {
4 | for(var i = 0 ; i