diff --git a/.gitbook/assets/727989-20161118220935607-577282845.jpg b/.gitbook/assets/727989-20161118220935607-577282845.jpg
new file mode 100644
index 0000000..9c50361
Binary files /dev/null and b/.gitbook/assets/727989-20161118220935607-577282845.jpg differ
diff --git a/.gitbook/assets/JavaScript.png b/.gitbook/assets/JavaScript.png
new file mode 100644
index 0000000..23e63e7
Binary files /dev/null and b/.gitbook/assets/JavaScript.png differ
diff --git a/.gitbook/assets/array_todo.png b/.gitbook/assets/array_todo.png
new file mode 100644
index 0000000..c5dcef6
Binary files /dev/null and b/.gitbook/assets/array_todo.png differ
diff --git a/.gitbook/assets/event_all.jpg b/.gitbook/assets/event_all.jpg
new file mode 100644
index 0000000..df0fa3f
Binary files /dev/null and b/.gitbook/assets/event_all.jpg differ
diff --git a/.gitbook/assets/import.png b/.gitbook/assets/import.png
new file mode 100644
index 0000000..3ff69de
Binary files /dev/null and b/.gitbook/assets/import.png differ
diff --git a/.gitbook/assets/import2.png b/.gitbook/assets/import2.png
new file mode 100644
index 0000000..014274d
Binary files /dev/null and b/.gitbook/assets/import2.png differ
diff --git a/.gitbook/assets/onerror.png b/.gitbook/assets/onerror.png
new file mode 100644
index 0000000..fd610c1
Binary files /dev/null and b/.gitbook/assets/onerror.png differ
diff --git a/.gitbook/assets/performance.png b/.gitbook/assets/performance.png
new file mode 100644
index 0000000..b35b006
Binary files /dev/null and b/.gitbook/assets/performance.png differ
diff --git a/.gitbook/assets/sort.png b/.gitbook/assets/sort.png
new file mode 100644
index 0000000..749e549
Binary files /dev/null and b/.gitbook/assets/sort.png differ
diff --git a/.gitbook/assets/uploaderror.png b/.gitbook/assets/uploaderror.png
new file mode 100644
index 0000000..d1840c4
Binary files /dev/null and b/.gitbook/assets/uploaderror.png differ
diff --git "a/.gitbook/assets/\345\261\217\345\271\225\345\277\253\347\205\247 2017-12-05 \344\270\213\345\215\21010.19.57.png" "b/.gitbook/assets/\345\261\217\345\271\225\345\277\253\347\205\247 2017-12-05 \344\270\213\345\215\21010.19.57.png"
new file mode 100644
index 0000000..e98e43b
Binary files /dev/null and "b/.gitbook/assets/\345\261\217\345\271\225\345\277\253\347\205\247 2017-12-05 \344\270\213\345\215\21010.19.57.png" differ
diff --git "a/.gitbook/assets/\345\261\217\345\271\225\345\277\253\347\205\247 2017-12-07 \344\270\213\345\215\2104.28.13.png" "b/.gitbook/assets/\345\261\217\345\271\225\345\277\253\347\205\247 2017-12-07 \344\270\213\345\215\2104.28.13.png"
new file mode 100644
index 0000000..477923d
Binary files /dev/null and "b/.gitbook/assets/\345\261\217\345\271\225\345\277\253\347\205\247 2017-12-07 \344\270\213\345\215\2104.28.13.png" differ
diff --git "a/.gitbook/assets/\346\241\214\351\235\242 \345\256\275\345\261\217.png" "b/.gitbook/assets/\346\241\214\351\235\242 \345\256\275\345\261\217.png"
new file mode 100644
index 0000000..d818c07
Binary files /dev/null and "b/.gitbook/assets/\346\241\214\351\235\242 \345\256\275\345\261\217.png" differ
diff --git a/.idea/JSlearn.iml b/.idea/JSlearn.iml
deleted file mode 100644
index 24643cc..0000000
--- a/.idea/JSlearn.iml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/dictionaries/Jonathan_Zhang.xml b/.idea/dictionaries/Jonathan_Zhang.xml
deleted file mode 100644
index 13fba25..0000000
--- a/.idea/dictionaries/Jonathan_Zhang.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/.idea/jsLibraryMappings.xml b/.idea/jsLibraryMappings.xml
deleted file mode 100644
index d23208f..0000000
--- a/.idea/jsLibraryMappings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index 0a380d3..0000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
- false
-
- false
- false
-
-
-
-
-
-
-
-
-
-
-
- AngularJS
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index 5440188..0000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
deleted file mode 100644
index 94a25f7..0000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
deleted file mode 100644
index 32f49d8..0000000
--- a/.idea/workspace.xml
+++ /dev/null
@@ -1,1023 +0,0 @@
-
-
-
-
-
-<<<<<<< Updated upstream
-=======
-
->>>>>>> Stashed changes
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<<<<<<< Updated upstream
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-=======
-
-
-
-
-
-
-
-
-
->>>>>>> Stashed changes
-
-
-
-
-<<<<<<< Updated upstream
-
-
-
-
-
-=======
-
-
-
-
-
->>>>>>> Stashed changes
-
-
-
-
-
-
-
-
-<<<<<<< Updated upstream
-
-
-=======
-
-
->>>>>>> Stashed changes
-
-
-
-
-
-
-
-
-<<<<<<< Updated upstream
-
-
-
-
-
-
-
-
-
-
-
-
-=======
-
-
->>>>>>> Stashed changes
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<<<<<<< Updated upstream
-
-
-
-
-
-
-=======
-
->>>>>>> Stashed changes
-
-
-
-
-
-
- true
- DEFINITION_ORDER
-
-
-
-
-
-<<<<<<< Updated upstream
-
-
-
-=======
-
-
->>>>>>> Stashed changes
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- project
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- project
-
-
- true
-
-
-
- DIRECTORY
-
- false
-
-
-
-
-
-
-
-
-
- 1495170979120
-
-
- 1495170979120
-
-
-
-<<<<<<< Updated upstream
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-=======
-
-
-
-
->>>>>>> Stashed changes
-
-
-
-
-<<<<<<< Updated upstream
-
-
-
-
-
-
-=======
-
-
-
-
-
-
-
->>>>>>> Stashed changes
-
-
-
-
-
-<<<<<<< Updated upstream
-
-=======
-
->>>>>>> Stashed changes
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<<<<<<< Updated upstream
-
-
-
-
-
-
-
-
-
-
-=======
-
->>>>>>> Stashed changes
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<<<<<<< Updated upstream
-
-
-
-
-
-
-
-
-
-
-
-=======
-
-
-
-
-
-
-
-
-
-
-
-
-
->>>>>>> Stashed changes
-
-
-
-
-
-<<<<<<< Updated upstream
-
-
-=======
-
-
-
->>>>>>> Stashed changes
-
-
-
-
-
-<<<<<<< Updated upstream
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-=======
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
->>>>>>> Stashed changes
-
-
-
-
-
\ No newline at end of file
diff --git a/01/README.md b/01/README.md
new file mode 100644
index 0000000..c51e7fb
--- /dev/null
+++ b/01/README.md
@@ -0,0 +1,6 @@
+# 01-JavaScrpit-基础知识
+
+
+
+
+
diff --git a/01/bian-liang-lei-xing-he-ji-suan.md b/01/bian-liang-lei-xing-he-ji-suan.md
new file mode 100644
index 0000000..3690324
--- /dev/null
+++ b/01/bian-liang-lei-xing-he-ji-suan.md
@@ -0,0 +1,180 @@
+# 变量类型和计算
+
+## 变量类型和计算(1)
+
+* JS中使用typeof能得到的哪些类型
+* 何时使用`===`何时使用`==`
+* JS中有哪些内置函数
+* JS变量按照`存储方式`区分为哪些类型,并描述其特点
+* 如何理解`JSON`
+
+### 值类型
+
+* 从内存来说值类型是把每一个值存储在变量类型的每一个位置
+
+```javascript
+var a = 100;
+var b = a;
+a = 200
+console.log(b);//100
+```
+
+### 引用类型
+
+* 把a赋值\*-成一个对象,a的位置是通过指针指向一个位置
+* 把b赋值成a,其实是定义一个b,b的指针指向了那个对象位置
+* 也就是有两份`age:20`的对象
+* 对象的引用,就相当于复写一个对象,这两个对象之间相互独立
+* 引用类型:对象、数组、函数
+
+```javascript
+var a ={age:20};
+var b = a;
+b.age = 21;
+console.log(a.age); //21
+```
+
+* typeof运算符
+
+```javascript
+typeof undefined //undefined
+typeof 'abc' // String
+typeof 123 //number
+typeof true //boolean
+typeof {} //object
+typeof [] //object
+typeof null //object
+typeof console.log //funciton
+```
+
+### 变量计算-强制类型转换
+
+* 字符串拼接
+
+```javascript
+var a = 100 + 10;//110
+var b = 100 + '10';//10010
+```
+
+* == 运算符
+
+```javascript
+100 == '100' //true
+0 == '' //true
+null == undefined //true
+```
+
+* if语句
+
+```javascript
+var a = true;
+if(a){
+ //....
+}
+var b = 100;
+if (b) {
+ //....
+}
+var c = '';
+if (c) {
+ //...
+}
+```
+
+* 逻辑运算
+
+```javascript
+console.log(10 && 0); //0
+console.log('' || 'abc'); //abc
+console.log(!window.acb); //true
+
+//判断一个变量会被当做true还是false
+var a = 100;
+console.log(!!a);//true
+```
+
+## 变量类型和计算(2)
+
+### JS中使用typeof能得到的类型
+
+```javascript
+//问题:JS中使用typeof能得到哪些类型
+typeof undefined //undefined
+typeof 'abc' // String
+typeof 123 //number
+typeof true //boolean
+typeof {} //object
+typeof [] //object
+typeof null //object
+typeof console.log //funciton
+```
+
+* 总结来说typeof可以得到
+
+ `undefined、String、number、boolean`
+
+ 可以区分值类型,但对于引用类型无法很细的区分,只能区分函数。
+
+* 尤其是
+
+ `typeof null object`
+
+ 它是一个引用类型
+
+### 何时使用===和==
+
+```javascript
+//问题:何时使用===何时使用==
+
+if (obj.a == null) {
+ //这里相当于 obj.a === null || obj.a === undefined,简写形式
+ //这是jquery源码中推荐的写法
+}
+```
+
+### JS中的内置函数
+
+```javascript
+//问题:JS中有哪些内置函数----数据封装类对象
+//作为构造函数的作用
+Object
+Array
+Boolean
+Number
+String
+Function
+Date
+RegExp
+Error
+```
+
+### JS按照存储方式区分变量类型
+
+```javascript
+//JS 变量按照存储方式区分为哪些类型,并描述其特点
+
+//值类型
+var a = 10;
+var b = a;
+a = 11;
+console.log(b); // 10
+
+//引用类型
+var obj1 = {x:100}
+var obj2 = obj1;
+obj1.x = 200;
+console.log(obj2.x); // 200
+```
+
+* ES中,引用类型是一种数据结构,用于将数据和功能组织在一起
+
+## 变量类型和计算(3)-理解JSON
+
+```javascript
+//问题:如何理解JSON
+//JSON只不过是一个JS对象
+//JSON也是一个数据格式
+JSON.stringify({a:10,b:20});
+JSON.parse('{"a":10."b":20}')
+```
+
diff --git a/01/bian-liang-sheng-ming.md b/01/bian-liang-sheng-ming.md
new file mode 100644
index 0000000..97f5491
--- /dev/null
+++ b/01/bian-liang-sheng-ming.md
@@ -0,0 +1,2 @@
+# 变量声明
+
diff --git a/01/lei-xing-zhuan-huan.md b/01/lei-xing-zhuan-huan.md
new file mode 100644
index 0000000..27d2cf9
--- /dev/null
+++ b/01/lei-xing-zhuan-huan.md
@@ -0,0 +1,23 @@
+# 类型转换
+
+* 数据类型
+* 显式类型转换
+* 隐式类型转换
+
+## 数据类型
+
+最新的ECMAScript标准定义了7种数据类型
+
+基本数据类型
+
+* Undefined
+* Null
+* Boolean
+* Number
+* String
+* Symbol
+
+复杂数据类型
+
+* Object
+
diff --git a/01/shu-ju-lei-xing.md b/01/shu-ju-lei-xing.md
new file mode 100644
index 0000000..47d8190
--- /dev/null
+++ b/01/shu-ju-lei-xing.md
@@ -0,0 +1,6 @@
+# 基本数据类型
+
+JavaScript\(ES6\)中,现在有6种基本数据类型
+
+Undefined、Null、Boolean、Number、String、Symbol
+
diff --git a/01/shu-ju-lei-xing/README.md b/01/shu-ju-lei-xing/README.md
new file mode 100644
index 0000000..47d8190
--- /dev/null
+++ b/01/shu-ju-lei-xing/README.md
@@ -0,0 +1,6 @@
+# 基本数据类型
+
+JavaScript\(ES6\)中,现在有6种基本数据类型
+
+Undefined、Null、Boolean、Number、String、Symbol
+
diff --git a/01/shu-ju-lei-xing/boolean.md b/01/shu-ju-lei-xing/boolean.md
new file mode 100644
index 0000000..fe3aad8
--- /dev/null
+++ b/01/shu-ju-lei-xing/boolean.md
@@ -0,0 +1,2 @@
+# Boolean
+
diff --git a/01/shu-ju-lei-xing/null.md b/01/shu-ju-lei-xing/null.md
new file mode 100644
index 0000000..12fcbc0
--- /dev/null
+++ b/01/shu-ju-lei-xing/null.md
@@ -0,0 +1,2 @@
+# Null
+
diff --git a/01/shu-ju-lei-xing/number.md b/01/shu-ju-lei-xing/number.md
new file mode 100644
index 0000000..caff8b5
--- /dev/null
+++ b/01/shu-ju-lei-xing/number.md
@@ -0,0 +1,2 @@
+# Number
+
diff --git a/01/shu-ju-lei-xing/string.md b/01/shu-ju-lei-xing/string.md
new file mode 100644
index 0000000..7e21f87
--- /dev/null
+++ b/01/shu-ju-lei-xing/string.md
@@ -0,0 +1,2 @@
+# String
+
diff --git a/01/shu-ju-lei-xing/symbol.md b/01/shu-ju-lei-xing/symbol.md
new file mode 100644
index 0000000..a9d7677
--- /dev/null
+++ b/01/shu-ju-lei-xing/symbol.md
@@ -0,0 +1,2 @@
+# Symbol
+
diff --git a/01/shu-ju-lei-xing/undefined.md b/01/shu-ju-lei-xing/undefined.md
new file mode 100644
index 0000000..44c3acc
--- /dev/null
+++ b/01/shu-ju-lei-xing/undefined.md
@@ -0,0 +1,2 @@
+# Undefined
+
diff --git a/01/zuo-yong-yu.md b/01/zuo-yong-yu.md
new file mode 100644
index 0000000..6fee475
--- /dev/null
+++ b/01/zuo-yong-yu.md
@@ -0,0 +1,243 @@
+# 作用域
+
+## 作用域
+
+**执行上下文**
+
+```javascript
+console.log(a); // undefined
+var a = 100;
+
+fn('zhangsan') // 'zhangsan' 20
+function fn(name) {
+ age = 20;
+ console.log(name, age);
+ var age;
+}
+```
+
+* 范围:一段<script>或者一个函数
+* 全局:变量定义、函数声明
+* 函数:变量定义、函数声明、this、arguments
+* 注意⚠️“函数声明”和“函数表达式”的区别
+
+```javascript
+fn()
+function fn() {
+ //声明
+}
+
+fn1()
+var fn1 = function () {
+ //表示
+}
+var a = 100; //类似于这个
+
+//全局声明
+
+console.log(a);
+var a = 100;
+
+fn('zhangsan')
+function fn(name) {
+ console.log(this);
+ age = 20;
+ console.log(name,age);
+ var age;
+
+ bar(100);
+
+ function bar(num) {
+ console.log(num);
+ }
+}
+```
+
+**作用域**
+
+* 没有块级作用域
+* 只有函数和全局作用域
+
+```javascript
+//无块级作用域
+if(true){
+ var name = 'zhangsan';
+}
+console.log(name);
+
+//函数和全局作用域
+var a = 100;
+function fn() {
+ var a = 200;
+ console.log('fn',a);
+}
+console.log('global',a);
+fn();
+```
+
+**如何理解作用域**
+
+* 自由变量
+* 作用域链,即自由变量的查找
+* 闭包的两个场景
+
+```javascript
+var x=10;
+function foo() {
+ alert(x);
+}
+function bar() {
+ var x=20;
+ foo();
+}
+bar();
+```
+
+* 生命周期
+* 作用范围
+
+### 变量作用域
+
+* 静态作用域
+* 动态作用域
+
+#### 静态作用域
+
+* 被称为词法作用域
+* 由程序定义位置决定
+
+```javascript
+var x=10;
+function foo() {
+ alert(x);
+}
+function bar() {
+ var x=20;
+ foo();
+}
+bar();
+```
+
+| | 全局作用域 |
+| :--- | :--- |
+| x | 10 |
+| foo | |
+| bar | |
+
+| | foo作用域 |
+| :--- | :--- |
+| - | - |
+
+| | bar作用域 |
+| :--- | :--- |
+| x | 20 |
+
+#### 动态作用域
+
+* 程序运行时刻
+* 栈操作
+
+| x:20 |
+| :--- |
+| bar: |
+| foo: |
+
+## JS变量作用域
+
+* JS使用**静态作用域**
+* JS没有**块级作用域\(全局作用域、函数作用域\)\(ES5\)**
+* ES5中使用词法环境管理静态作用域
+
+```javascript
+var x = 10;
+function foo() {
+ var z = 30;
+ function bar(q) {
+ return x + y + q;
+ }
+ return bar;
+}
+var bar = foo(20);
+bar(40);
+```
+
+* 环境记录
+ * 形式参数
+ * 函数声明
+ * 变量
+* 对外部词法环境的引用(outer)
+* 初始化
+
+[](https://github.com/TYRMars/JSLearn/blob/master/02/img/chushihua01.png)
+
+* 执行
+
+[](https://github.com/TYRMars/JSLearn/blob/master/02/img/environment_02.png)
+
+### 作用域链
+
+```javascript
+var a = 100;
+function fn() {
+ var b = 200;
+
+ //作用域没有定义变量,即“自由变量”
+ console.log(a);
+ console.log(b);
+}
+fn();
+
+var a = 100;
+function F1() {
+ var b = 200;
+ function F2() {
+ var c = 300;
+ console.log(a);//a是自由变量。形成一个链式结构,向父级去查找
+ console.log(b);//b是自由变量
+ console.log(c);//
+ }
+}
+```
+
+**对变量提升的理解**
+
+* 变量定义
+* 函数声明(注意和函数表达式的区别)
+
+**创建10个<a>标签 点击的时候弹出来对应的序号**
+
+* 错误写法
+
+```javascript
+//这是一个错误的写法!!!
+var i,a;
+for (var i = 0; i < 10; i++) {
+ a = document.createElement('a');
+ a.innerHTML = i + '
';
+ a.addEventListener('click',function (e) {
+ e.preventDefault();
+ alert(i)
+ })
+ document.body.appendChild(a);
+}
+//输出为如下: "9"
+```
+
+* 正确写法
+
+```javascript
+//这是一个正确写法!!!
+var i;
+for (i = 0; i < 10; i++) {
+ (function(i){
+ var a = document.createElement('a');
+ a.innerHTML = i + '
';
+ a.addEventListener('click',function (e) {
+ e.preventDefault();
+ alert(i);
+ })
+ document.body.appendChild(a);
+ })(i)
+}
+```
+
diff --git a/02/README.md b/02/README.md
new file mode 100644
index 0000000..bc51777
--- /dev/null
+++ b/02/README.md
@@ -0,0 +1,4 @@
+# 02-JavaScrpit-引用类型
+
+引用类型的值(对象)是引用类型的实例。在ES种,引用类型是一种数据结构,将数据和功能组织在一起。
+
diff --git a/02/arraylei-xing.md b/02/arraylei-xing.md
new file mode 100644
index 0000000..54170d0
--- /dev/null
+++ b/02/arraylei-xing.md
@@ -0,0 +1,18 @@
+# Array类型
+
+声明方式有两种
+
+一种使用Array的构造函数
+
+```js
+var list = new Array();
+```
+
+一种使用语法糖形式
+
+```js
+var list = [];
+```
+
+
+
diff --git a/02/arraylei-xing/README.md b/02/arraylei-xing/README.md
new file mode 100644
index 0000000..f7a5cfd
--- /dev/null
+++ b/02/arraylei-xing/README.md
@@ -0,0 +1,16 @@
+# Array类型
+
+声明方式有两种
+
+一种使用Array的构造函数
+
+```javascript
+var list = new Array();
+```
+
+一种使用语法糖形式
+
+```javascript
+var list = [];
+```
+
diff --git a/02/arraylei-xing/cao-zuo-fang-fa.md b/02/arraylei-xing/cao-zuo-fang-fa.md
new file mode 100644
index 0000000..c17cb62
--- /dev/null
+++ b/02/arraylei-xing/cao-zuo-fang-fa.md
@@ -0,0 +1,8 @@
+# 操作方法
+
+* 删除:可以删除任意数量的项,只需指定两个参数:删除的第一项的位置和要删除的项数。
+* 插入:可以向指定位置插入任意数量的项,只需提供3个参数:起始位置、0(要删除的项数)和要插入的项。
+* 替换:可以向指定位置插入任意数量的项,同时删除任意数量的项,只需指定3个参数:起始位置、要删除的项数和要插入的任意数量的项。
+
+splice\(\)
+
diff --git a/02/arraylei-xing/die-dai-fang-fa.md b/02/arraylei-xing/die-dai-fang-fa.md
new file mode 100644
index 0000000..6b223c6
--- /dev/null
+++ b/02/arraylei-xing/die-dai-fang-fa.md
@@ -0,0 +1,2 @@
+# 迭代方法
+
diff --git a/02/arraylei-xing/dui-lie-fang-fa.md b/02/arraylei-xing/dui-lie-fang-fa.md
new file mode 100644
index 0000000..10bfd12
--- /dev/null
+++ b/02/arraylei-xing/dui-lie-fang-fa.md
@@ -0,0 +1,14 @@
+# 队列方法
+
+队列采用的先进先出的策略
+
+从队尾推入元素采用`pop()`,从队列首部推出采用`shift()`。
+
+```javascript
+{
+ let arrays = [1,2,3,4,5];
+ arrays.push(5,6);
+ arrays.shift();
+}
+```
+
diff --git a/02/arraylei-xing/gui-bing-fang-fa.md b/02/arraylei-xing/gui-bing-fang-fa.md
new file mode 100644
index 0000000..5286867
--- /dev/null
+++ b/02/arraylei-xing/gui-bing-fang-fa.md
@@ -0,0 +1,2 @@
+# 归并方法
+
diff --git a/02/arraylei-xing/jian-ce-shu-zu.md b/02/arraylei-xing/jian-ce-shu-zu.md
new file mode 100644
index 0000000..8b64771
--- /dev/null
+++ b/02/arraylei-xing/jian-ce-shu-zu.md
@@ -0,0 +1,18 @@
+# 检测数组
+
+第一种`instanceof Array` 来检测数组
+
+```javascript
+if(value instanceof Array){
+ //数组操作
+}
+```
+
+第二种使用`Array.isArray()`来检测数组
+
+```text
+if(Array.isArray(value)){
+ //数组操作
+}
+```
+
diff --git a/02/arraylei-xing/wei-zhi-fang-fa.md b/02/arraylei-xing/wei-zhi-fang-fa.md
new file mode 100644
index 0000000..f04f8c5
--- /dev/null
+++ b/02/arraylei-xing/wei-zhi-fang-fa.md
@@ -0,0 +1,4 @@
+# 位置方法
+
+* indexOf\(\)
+
diff --git a/02/arraylei-xing/zhan-fang-fa.md b/02/arraylei-xing/zhan-fang-fa.md
new file mode 100644
index 0000000..92562bb
--- /dev/null
+++ b/02/arraylei-xing/zhan-fang-fa.md
@@ -0,0 +1,20 @@
+# 栈方法
+
+通过使用Array.push方法,实现栈的推入操作
+
+```javascript
+{
+ let array = [1,2,3,4];
+ array.push(5);
+}
+```
+
+通过使用Array.pop方法,实现栈的推出操作
+
+```javascript
+{
+ let array = [1,2,3,4];
+ array.pop();
+}
+```
+
diff --git a/02/arraylei-xing/zhong-pai-xu-fang-fa.md b/02/arraylei-xing/zhong-pai-xu-fang-fa.md
new file mode 100644
index 0000000..bafcbeb
--- /dev/null
+++ b/02/arraylei-xing/zhong-pai-xu-fang-fa.md
@@ -0,0 +1,29 @@
+# 重排序方法
+
+重排序方法:`reverse()`和`sort()`。
+
+## reverse
+
+对数组进行反转操作
+
+```javascript
+{
+ let array = [1,2,3,4];
+ array.reverse()//array = [4,3,2,1]
+}
+```
+
+## sort
+
+对数组进行排序
+
+```javascript
+{
+ let array = [1,2,5,10];
+ array.sort()
+ console.log(array)
+}
+```
+
+
+
diff --git a/02/arraylei-xing/zhuan-huan-fang-fa.md b/02/arraylei-xing/zhuan-huan-fang-fa.md
new file mode 100644
index 0000000..53f057b
--- /dev/null
+++ b/02/arraylei-xing/zhuan-huan-fang-fa.md
@@ -0,0 +1,15 @@
+# 转换方法
+
+```javascript
+{
+ let color = ['red','blue','green'];
+ console.info(color.toString());
+ console.log(color.valueOf());
+ console.log(color);
+}
+```
+
+通过试验可以看到
+
+
+
diff --git "a/02/code/\351\227\255\345\214\205.html" "b/02/code/\351\227\255\345\214\205.html"
new file mode 100644
index 0000000..eefd090
--- /dev/null
+++ "b/02/code/\351\227\255\345\214\205.html"
@@ -0,0 +1,89 @@
+
+
+
+
+ 闭包
+
+
+
+
+
+
diff --git a/02/datelei-xing.md b/02/datelei-xing.md
new file mode 100644
index 0000000..7e4a6b1
--- /dev/null
+++ b/02/datelei-xing.md
@@ -0,0 +1,2 @@
+# Date类型
+
diff --git a/02/functionlei-xing.md b/02/functionlei-xing.md
new file mode 100644
index 0000000..4fbcc97
--- /dev/null
+++ b/02/functionlei-xing.md
@@ -0,0 +1,2 @@
+# Function类型
+
diff --git a/02/img/Global Environment test1.xmind b/02/img/Global Environment test1.xmind
new file mode 100644
index 0000000..cb33f36
Binary files /dev/null and b/02/img/Global Environment test1.xmind differ
diff --git a/02/img/chushihua01.png b/02/img/chushihua01.png
new file mode 100644
index 0000000..36e519f
Binary files /dev/null and b/02/img/chushihua01.png differ
diff --git a/02/img/environment_02.png b/02/img/environment_02.png
new file mode 100644
index 0000000..5b0ee58
Binary files /dev/null and b/02/img/environment_02.png differ
diff --git a/02/img/global Environment run.xmind b/02/img/global Environment run.xmind
new file mode 100644
index 0000000..49dea37
Binary files /dev/null and b/02/img/global Environment run.xmind differ
diff --git a/02/maplei-578b28-es6.md b/02/maplei-578b28-es6.md
new file mode 100644
index 0000000..722f691
--- /dev/null
+++ b/02/maplei-578b28-es6.md
@@ -0,0 +1,2 @@
+# Map类型\(ES6\)
+
diff --git a/02/objectlei-xing.md b/02/objectlei-xing.md
new file mode 100644
index 0000000..c549006
--- /dev/null
+++ b/02/objectlei-xing.md
@@ -0,0 +1,19 @@
+# Object类型
+
+Object创建实例的方式有两种
+
+第一种
+
+```javascript
+var person = new Object();
+person.name = "TYRMars";
+```
+
+第二种
+
+```javascript
+var person = {
+ name:"TYRMars"
+}
+```
+
diff --git a/02/rexexplei-xing.md b/02/rexexplei-xing.md
new file mode 100644
index 0000000..5a2c229
--- /dev/null
+++ b/02/rexexplei-xing.md
@@ -0,0 +1,2 @@
+# RexExp类型
+
diff --git a/02/setlei-578b28-es6.md b/02/setlei-578b28-es6.md
new file mode 100644
index 0000000..80cbc10
--- /dev/null
+++ b/02/setlei-578b28-es6.md
@@ -0,0 +1,2 @@
+# Set类型\(ES6\)
+
diff --git a/03/README.md b/03/README.md
new file mode 100644
index 0000000..8ce553c
--- /dev/null
+++ b/03/README.md
@@ -0,0 +1,98 @@
+# 03-JavaScrpit-面向对象程序设计
+
+## 03-JavaScript-面向对象程序设计
+
+
+
+## 理解对象
+
+* ECMAScript对于对象的定义:无序属性的集合,其属性可以包含基本值、对象或者函数
+* JavaScript每个对象都是基于一个引用类型创建的。
+* 引用类型可以是原生类型也可以是自己定义的类型。
+
+## 原型规则和示例
+
+* 5条原型规则
+* 原型规则是学习原型链的基础
+
+#### 第1条
+
+* 所有的引用类型\(数组、对象、函数\),都具有对象特质、即可自由扩展属性\(除了“NULL”以外\)
+
+```javascript
+var obj = {}; obj.a = 100;
+var arr = []; arr.a = 100;
+function fn(){
+ fn.a=100;
+}
+```
+
+#### 第2条
+
+* 所有的引用类型\(数组、对象、函数\),都有一个`__proto__`\(隐式原型\)属性,属性值是一个普通的对象
+
+```javascript
+console.log(obj.__proto__);
+console.log(arr.__proto__);
+console.log(fn.__proto__);
+```
+
+#### 第3条
+
+* `prototype`解释为JavaScript开发函式库及框架
+* 所有的函数,都有一个`prototype`(显示原型)属性,属性值也是一个普通对象。
+
+```javascript
+console.log(fn.prototype);
+```
+
+#### 第4条
+
+* 所有引用类型(数组、对象、函数),`__proto__`属性值指向它的构造函数的`prototype`属性值
+
+```javascript
+console.log(obj.__proto__ === Object.prototype);
+```
+
+#### 第5条
+
+* 当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去它的`__proto__`\(即它的构造函数`prototype`\)中寻找
+
+```javascript
+//构造函数
+function Foo(name,age){
+ this.name = name;
+}
+Foo.prototype.alertName = function () {
+ alert(this.name);
+}
+//创建示例
+var f = new Foo('zhangsan')
+f.printName = function () {
+ console.log(this.name);
+}
+//测试
+f.printName();
+f.alertName();
+```
+
+#### 循环对象自身属性
+
+```javascript
+var item;
+for (item in f) {
+ //高级浏览器已经在for in 中屏蔽了来自原型的属性
+ //但是这里建议大家还是加上这个判断,保证程序的健壮性
+ if(f.hasOwnProperty(item)) {
+ console.log(item);
+ }
+}
+```
+
+### instanceof
+
+* 用于判断`引用类型`属于哪个`构造函数`的方法
+* `f instanceof Foo` 的判断逻辑是:
+* `f`的`__proto__`一层一层往上走,是否能对应到`Foo.prototype`
+* 再试着判断f instanceof Object
+
diff --git a/03/code/oop.html b/03/code/oop.html
new file mode 100644
index 0000000..c346ef6
--- /dev/null
+++ b/03/code/oop.html
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/03/code/proto.html b/03/code/proto.html
new file mode 100644
index 0000000..e547543
--- /dev/null
+++ b/03/code/proto.html
@@ -0,0 +1,22 @@
+
+
+
+
+ 原型链
+
+
+
+
+
diff --git a/03/gou-zao-han-shu.md b/03/gou-zao-han-shu.md
new file mode 100644
index 0000000..c7e28c4
--- /dev/null
+++ b/03/gou-zao-han-shu.md
@@ -0,0 +1,56 @@
+# 构造函数
+
+* 如何准确判断一个变量数组类型
+* 写一个原型链继承的例子
+* 描述new一个对象的过程
+* zepto\(或其他框架\)源码中如何使用原型链
+
+## 知识点
+
+* 构造函数
+* 构造函数-扩展
+* 原型规则和示例
+* 原型链
+* instanceof
+
+## 构造函数
+
+* 自己的想法
+
+`普通的函数就像是按步骤执行的动作,而构造函数更像是可更改零件的木偶,普通函数可以直接调用,但是构造函数需要new。因为构造函数也是函数,所以可以直接被调用,但是它的返回值为undefined,此时构造函数里面的this对象等于全局this对象`
+
+* 扩展
+
+`实例和对象的区别,从定义上来讲:1、实例是类的具象化产品,2、而对象是一个具有多种属性的内容结构。`
+
+```javascript
+function Foo(name,age){
+ this.name = name;
+ this.age = age;
+ this.class = 'class-1';
+ // return this //默认有这一行
+}
+var f = new Foo('zhangsan',20); //实例化对象
+// var f1 = new Foo('lisi',22) //创建多个对象
+```
+
+## 构造函数-扩展
+
+`var a = {}`其实是`var a = new Object()`的语法糖
+
+`var a = []`其实是`var a = new Array()`的语法糖
+
+`function Foo(){...}`其实是`var Foo = new Function(...)`
+
+使用`instanceof`判断一个函数是否是一个变量的构造函数
+
+如果想判断一个变量是否为“数组”:变量`instanceof Array`
+
+## 如何准确判断一个变量是数组类型
+
+```javascript
+var arr = [];
+arr instanceof Array; //true
+typeof arr //object typeof是无法判断是否是数组
+```
+
diff --git a/03/img/opp_Child3.png b/03/img/opp_Child3.png
new file mode 100644
index 0000000..e85d648
Binary files /dev/null and b/03/img/opp_Child3.png differ
diff --git a/03/img/opp_Child4.png b/03/img/opp_Child4.png
new file mode 100644
index 0000000..24b4683
Binary files /dev/null and b/03/img/opp_Child4.png differ
diff --git a/03/img/opp_Child5.png b/03/img/opp_Child5.png
new file mode 100644
index 0000000..63f045d
Binary files /dev/null and b/03/img/opp_Child5.png differ
diff --git a/03/img/prototype.png b/03/img/prototype.png
new file mode 100644
index 0000000..eabb74e
Binary files /dev/null and b/03/img/prototype.png differ
diff --git a/03/ji-cheng.md b/03/ji-cheng.md
new file mode 100644
index 0000000..427fb98
--- /dev/null
+++ b/03/ji-cheng.md
@@ -0,0 +1,262 @@
+# 继承
+
+* 类与实例
+ * 类的声明
+ * 生成实例
+* 类与继承
+ * 如何实现继承
+ * 继承的几种方式
+
+## 类的声明
+
+* 类声明 构造函数
+
+```javascript
+function Animal1() {
+ this.name = 'animal';
+}
+```
+
+* ES6中class的声明
+
+```javascript
+class Animal2 {
+ constructor() {
+ this.name = 'animal';
+ }
+}
+```
+
+### 1.构造函数方式进行继承
+
+```javascript
+function Parent1() {
+ this.name = 'parent1';
+}
+function Child1() {
+ Parent1.call(this);
+ this.type = 'child1';
+}
+console.log(new Child1());
+```
+
+* 但是如果要继承原型对象上的方法是没办法继承的
+
+```javascript
+// 借助构造函数
+function Parent1() {
+ this.name = 'parent1';
+}
+//
+Parent1.prototype.say = function () {
+ console.log('say');
+}
+//但是如果要继承原型对象上的方法是没办法继承的
+function Child1() {
+ Parent1.call(this);
+ this.type = 'Child1';
+}
+console.log(new Child1());
+```
+
+### 2.借助原型链实现继承
+
+```javascript
+function Parent2() {
+ this.name = 'parent2';
+}
+function Child2() {
+ this.type = 'child2';
+}
+Child2.prototype = new Parent2();//让child2的原型赋值为Parent2的实例
+console.log(new Child2());
+```
+
+* s1与s2之间不相互隔离
+* 原型链中共用
+
+```javascript
+function Parent2() {
+ this.name = 'parent2';
+ this.num = [1,2,3];
+}
+function Child2() {
+ this.type = 'child2';
+}
+Child2.prototype = new Parent2();//让child2的原型赋值为Parent2的实例
+var s1 = new Child2();
+var s2 = new Child2();
+console.log(s1.play,s2.play);
+```
+
+### 3.组合方式
+
+```javascript
+function Parent3() {
+ this.name = 'Parent3';
+ this.play = [1,2,3];
+}
+function Child3() {
+ Parent3.call(this);
+ this.type = 'child3';
+}
+Child3.prototype = new Parent3();//Child3的原型对象指向Parent3的实例
+console.log(new child3);
+```
+
+* 父类构造函数执行了多次,没有必要的重复执行
+
+### 4.组合方式改进1
+
+```javascript
+function Parent4() {
+ this.name = 'parent4';
+}
+function Child4() {
+ Parent4.call(this);
+ this.type = 'child4';
+}
+Child4.prototype = Parent4.prototype;
+var s5 = new Child4();
+var s6 = new Child4();
+console.log(s5,s6);
+```
+
+* `instanceof`和`constructor`
+
+```text
+console.log(s5 instanceof Child4,s5 instanceof Parent4);
+```
+
+* 如何区分是子类实例化的还是父类实例化的
+
+### 5.组合方式改进2
+
+* 主要是在继承的时候让 子类的原型对象 =
+
+ `Object.Create(父类构造函数的原型对象)`
+
+* 再通过改变子类的原型对象的constructor,因为此时的constructor的指向是父类原型对象的构造函数
+
+```javascript
+function Parent5() {
+ this.name = 'Parent5';
+ this.play = [1,2,3];
+}
+function Child5() {
+ Parent5.call(this);
+ this.type = 'Child5'
+}
+Child5.prototype = Object.create(Parent5.prototype);
+//通过Object.create()创建一个新的对象,传入的原型对象是Parent.prototype
+console.log('组合继承改进2',new Child5);
+//改变constructor的指向
+function Parent6() {
+ this.name = 'Parent6';
+ this.play = [1,2,3];
+}
+function Child6() {
+ Parent6.call(this);
+ this.type = 'Child6'
+}
+Child6.prototype = Object.create(Parent6.prototype);
+Child6.prototype.constructor = Child6;
+console.log('组合继承改进2-constructor',new Child6);
+```
+
+### 6.原型式继承
+
+```javascript
+//原型式继承
+function object_oop(o) {
+ function F() {
+ }
+ F.prototype = o;
+ return new F();
+}
+var person = {
+ name:"zhangjianan",
+ friends:["yueyue","red"]
+};
+var OnePerson = object_oop(person);
+console.log('原型式继承',OnePerson);
+OnePerson.name = "Goge";
+console.log('原型式继承',OnePerson);
+var TwoPerson = object_oop(person);
+TwoPerson.friends.push("red");
+console.log('原型式继承',OnePerson,TwoPerson);
+//ES5原型式继承
+var ThreePerson = Object.create(person,{
+ name: {
+ value:"XIXI"
+ }
+})
+console.log(ThreePerson);
+var FourPerson = Object.create(ThreePerson,{
+ name:{
+ value:[1,2,3,4]
+ }
+})
+console.log('原型式继承',FourPerson);
+```
+
+* **ES5中主要使用Object.create\(\)去创建对象**
+
+### 贴近实际开发原型链继承的例子
+
+```javascript
+function Elem(id) {
+ this.elem = document.getElementById(id);
+}
+
+Elem.prototype.html = function (val) {
+ var elem = this.elem;
+ if (val) {
+ elem.innerHTML = val;
+ return this; // 链式操作
+ }else {
+ return elem.innerHTML;
+ }
+}
+
+Elem.prototype.on = function (type, fn) {
+ var elem = this.elem ;
+ elem.addEventListener(type, fn) ;
+}
+
+var div1 = new Elem('div1');
+//console.log(div1.html());
+div1.html('tyrmars
+')
+div1.on('click',function () {
+ alert('click')
+})
+```
+
+### 写一个原型链继承的例子
+
+```javascript
+//动物
+function Animal(){
+ this.eat = function () {
+ console.log('animal eat');
+ }
+}
+//狗🐶
+function Dog(){
+ this.bark = function () {
+ console.log('dog bark');
+ }
+}
+Dog.prototype = new Animal();
+//哈士奇
+var hashiqi = new Dog();
+//如果要真正写,就要写更贴近实战的原型链
+```
+
+* 推荐 阮一峰老师👨🏫的两篇文章:
+
+[Javascript 面向对象编程(一):封装](http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html)
+
+[Javascript继承机制的设计思想](http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html)
+
diff --git a/03/new.md b/03/new.md
new file mode 100644
index 0000000..6fb3ae3
--- /dev/null
+++ b/03/new.md
@@ -0,0 +1,60 @@
+# New
+
+创建一个新对象
+
+* this指向这个新对象
+* 执行代码,即对this赋值
+* 返回this 🔙
+* new运算符使用
+
+```javascript
+function Foo(name,age){
+ this.name = name ;
+ this.age = age ;
+ //return this //默认有这一行
+}
+var f = new Foo('zhangsan',20);
+//var f1 = new Foo('list',22) //创建多个对象
+```
+
+* 自制new运算符
+
+```javascript
+var new2 = function (func) {
+ var o = Object.create(func.prototype);
+ var k = func.call(o);
+ if (typeof k === 'object') {
+ return k
+ }else{
+ return o
+ }
+}
+
+// 加强版
+function objectFactory() {
+ let newObject = null;
+ let constructor = Array.prototype.shift.call(arguments);
+ let result = null;
+ // 判断参数是否是一个函数
+ if (typeof constructor !== "function") {
+ console.error("type error");
+ return;
+ }
+ // 新建一个空对象,对象的原型为构造函数的 prototype 对象
+ newObject = Object.create(constructor.prototype);
+ // 将 this 指向新建对象,并执行函数
+ result = constructor.apply(newObject, arguments);
+ // 判断返回对象
+ let flag = result && (typeof result === "object" || typeof result === "function");
+ // 判断返回结果
+ return flag ? result : newObject;
+}
+
+function new_todo() {
+ this.name = 'zhang';
+}
+
+var o6 =new2(new_todo);
+console.log(o6)
+```
+
diff --git a/03/object.create.md b/03/object.create.md
new file mode 100644
index 0000000..3b82713
--- /dev/null
+++ b/03/object.create.md
@@ -0,0 +1,12 @@
+# Object.create
+
+将传入的对象作为原型
+
+```javascript
+function create(obj) {
+ function F() {}
+ F.prototype = obj
+ return new F()
+}
+```
+
diff --git a/03/oid/README.md b/03/oid/README.md
new file mode 100644
index 0000000..e9a81bc
--- /dev/null
+++ b/03/oid/README.md
@@ -0,0 +1,321 @@
+# 03 JavaScrpit-异步与单线程
+
+* [03-01](https://github.com/TYRMars/JSLearn/tree/master/03#03-01) `异步和单线程-什么是异步`
+* [03-02](https://github.com/TYRMars/JSLearn/tree/master/03#03-02) `异步和单线程-单线程`
+* [03-03](https://github.com/TYRMars/JSLearn/tree/master/03#03-03) `其他知识点-日期和Math`
+* [03-04](https://github.com/TYRMars/JSLearn/tree/master/03#03-04) `其他知识点-数组和对象的API`
+
+## 03-01
+### 异步和单线程-什么是异步
+
+* 同步和异步的区别是什么?分别举一个同步和异步的例子
+* 一个关于setTimeout的笔试题
+* 前端使用异步的场景有哪些
+
+#### 异步知识点
+
+* 什么是异步(对比同步)
+* 前端使用异步的场景
+* 异步与单线程
+
+#### 什么是异步
+
+```JavaScript
+console.log(100); // step1
+setTimeout(function () {
+ console.log(200); // step3
+},1000);
+console.log(300); // step2
+```
+
+#### 对比同步
+
+```JavaScript
+console.log(100);
+alert(200) // 1秒钟后点击确认
+console.log(300);
+```
+
+#### 何时需要异步
+
+* 在可能发生等待的情况
+* 等待过程中不能像alert一样阻塞程序运行
+* 因此,所有的`所有的等待情况`都需要异步
+
+#### 前端使用异步的场景
+
+* 定时任务:`setTimeout,setInverval`
+* 网络请求:`ajax请求`,`动态
加载`
+
+```JavaScript
+//ajax请求
+console.log('start');
+$.get('./data1.json',function (data1) {
+ console.log(data1);
+})
+console.log('end');
+//
加载示例
+console.log('start');
+var img = document.createElement('img');
+img.onload = function () {
+ console.log('loaded');
+}
+img.src = '/xxx.png';
+console.log('end');
+```
+
+* 事件绑定
+
+## 03-02
+### 异步和单线程-单线程
+
+```JavaScript
+console.log(100); // step1
+setTimeout(function () {
+ console.log(200); // step3
+});
+console.log(300); // step2
+```
+
+* 从上面代码中理解单线程
+ * 执行第一行,打印100
+ * 执行setTimeout后,传入setTimeout的函数会被暂存起来,不会立即执行(单线程的特点,不能同时干两件事)
+ * 执行最后一行打印300
+ * 待所有程序执行完,处于空闲状态时,会立马看有没有暂存起来的要执行
+ * 发现暂存起来的`setTimeout`中的函数无需等待时间,就立即来过来执行
+
+
+#### 解答:异步与单线程
+
+* 同步和异步的区别是什么?分别举一个同步和异步的例子
+ * 同步会阻塞代码执行,而异步不会
+ * `alert`是同步,`setTimeout`是异步
+* 一个关于setTimeout的笔试题
+* 可以说`setTimeout`是等待页面加载完毕后,在进行加载
+
+
+```JavaScript
+console.log(1);
+setTimeout(function () {
+ console.log(2);
+},0)
+console.log(3);
+setTimeout(function () {
+ console.log(4);
+},1000)
+console.log(5);
+```
+* 前端使用异步的场景有哪些
+ * 定时任务:`setTimeout,setInverval`
+ * 网络任务:`ajax`请求,动态`
`加载
+ * 事件绑定
+
+## 03-03
+### 其他知识点-日期和Math
+#### 获取 2017-06-10 格式的日期
+
+```JavaScript
+Date.now(); // 获取当前时间毫秒数
+var dt = new Date();
+dt.getTime() // 获取毫秒数
+dt.getFullYear() // 年
+dt.getMonth() // 月(0-11)
+dt.getDate() // 日(0-31)
+dt.getHours() // 小时(0-23)
+dt.getMinutes() // 分钟(0-59)
+dt.getSeconds() // 秒 (0-59)
+```
+
+#### 获取随机数,要求时长度一致的字符串格式
+* `Math` 获取随机数 `Math.random()`
+
+## 03-04
+### 其他知识点-数组和对象的API
+#### 写一个能遍历对象和数组的通用forEach函数
+##### 数组API
+* `forEach` 便利所有元素
+
+```JavaScript
+var arr = [1,2,3];
+arr.forEach(function (item,index) {
+ //遍历数组所有元素
+ console.log(index,item);
+})
+```
+
+* `every` 判断所有元素是否都符合条件
+
+```JavaScript
+var arr = [1,2,3];
+var result = arr.every(function (item,index) {
+ if (item<4) {
+ //用于判断所有的数组元素,都满足一个条件
+ return true;
+ }
+})
+console.log(result);
+```
+
+* `some` 判断是否有至少一个元素符合条件
+
+```JavaScript
+var arr = [1,2,3];
+var result = arr.some(function (item,index) {
+ // 用来判断所有的数组元素,只要有一个满足条件即可
+ if (item<2) {
+ return true;
+ }
+})
+console.log(result);
+```
+
+* `sort` 排序
+
+```JavaScript
+var arr = [1,4,2,3,5]
+var arr2 = arr.sort(function (a,b) {
+ //从小到大排序
+ return a - b;
+ //从大到小排序
+ //return b - a
+})
+console.log(arr2);
+```
+
+* `map` 对元素重新组装,生成新数组
+
+```JavaScript
+var arr = [1,2,3,4]
+var arr2 = arr.map(function functionName(item,index) {
+ //将元素重新组装,并返回
+ return '' + item + '';
+})
+console.log(arr2);
+```
+
+* `filter` 过滤符合条件的元素
+
+```JavaScript
+var arr = [1,2,3];
+var arr2 = arr.filter(function (item,index) {
+ //通过某一个条件过滤数组
+ if(item >= 2){
+ return true;
+ }
+})
+console.log(arr2);
+```
+
+##### 对象API
+
+```JavaScript
+var obj = {
+ x: 100,
+ y: 200,
+ z: 300
+}
+var key
+for (key in obj) {
+ // 注意这里的hasOwnProperty,请查看原型链
+ if (obj.hasOwnProperty(key)) {
+ console.log(key,obj[key]);
+ }
+}
+```
+
+* 举个例子
+
+```html
+
+
+
+
+ Register
+
+
+
+
+
+
+```
+
+#### 问题解答
+* 获取2017-06-10格式的日期
+
+```JavaScript
+function formatDate(dt) {
+ if (!dt) {
+ dt = new Date();
+ }
+ var year = dt.getFullYear();
+ var month = dt.getMonth() + 1;
+ var date = dt.getDate();
+ if (month < 10) {
+ //强制转换类型
+ month = '0' + month;
+ }
+ if (date < 10) {
+ //强制转换类型
+ date = '0' + date;
+ }
+ //强制转换类型
+ return year + '-' + month + '-' + date;
+}
+var dt = new Date();
+var formatDate = formatDate(dt);
+console.log(formatDate);
+```
+
+* 获取随机数,要求是长度一致的字符串格式
+
+```JavaScript
+var random = Math.random();
+var random = random + '0000000000'; //后面加上10个0
+var random = random.slice(0,10);
+console.log(random);
+```
+
+* 写一个能遍历对象和数组的通用forEach函数
+
+```JavaScript
+//do
+var arr = [1,2,3];
+//注意,这里的参数的顺序换了,为了和对象的遍历格式一致
+forEach(arr,function (index,item) {
+ console.log(index.item);
+})
+
+var obj = {x:100,y:200};
+forEach(obj,function (key,value) {
+ console.log(key,value);
+})
+
+//init
+function forEach(obj,fn) {
+ var key;
+ if (obj instanceof Array) {
+ //准确判断是不是一个数组
+ obj.forEach(function (index.item) {
+ fn(index,item);
+ })
+ }else {
+ //不是数组就是对象
+ for (key in obj){
+ fn(key,obj[key]);
+ }
+ }
+}
+```
diff --git a/03/yuan-xing-lian.md b/03/yuan-xing-lian.md
new file mode 100644
index 0000000..e59dce0
--- /dev/null
+++ b/03/yuan-xing-lian.md
@@ -0,0 +1,25 @@
+# 原型链
+
+```javascript
+//构造函数
+function Foo(name,age){
+ this.name = name;
+}
+Foo.prototype.alertName = function (){
+ alert(this.name);
+}
+//创建示例
+var f = new Foo('zhangsan');
+f.printName = function () {
+ console.log(this.name);
+}
+//测试
+f.printName();
+f.alertName();
+f.toString(); // 要去f.__proto__.__proto__中查找
+```
+
+## 原型链视图
+
+
+
diff --git a/04/README.md b/04/README.md
new file mode 100644
index 0000000..3280210
--- /dev/null
+++ b/04/README.md
@@ -0,0 +1,2 @@
+# 04-JavaScrpit-函数表达式与函数式编程
+
diff --git a/04/bi-bao.md b/04/bi-bao.md
new file mode 100644
index 0000000..77a5c36
--- /dev/null
+++ b/04/bi-bao.md
@@ -0,0 +1,60 @@
+# 闭包
+
+闭包主要就是提升函数中变量的作用域,首先要理解[作用域](../01/zuo-yong-yu.md)
+
+* 函数作为返回值
+
+```javascript
+function F1() {
+ var a = 100;
+ //返回一个函数(函数作为返回值)
+ return function () {
+ console.log(a);//自由变量,父作用域中查找
+ }
+}
+//f1得到一个函数
+var f1 = F1();
+var a = 200;
+f1();
+```
+
+* 函数作为参数传递
+
+```javascript
+function F1() {
+ var a = 100;
+ return function () {
+ console.log(a); //自由变量,父作用域中查找
+ }
+}
+var f1 = F1();
+function F2(fn) {
+ var a = 200;
+ fn();
+}
+F2(f1);
+```
+
+* 实际开发中闭包的应用,主要作用于封装变量,收敛权限
+
+```javascript
+//闭包实际应用中主要作用于封装变量,收敛权限
+function isFirstLoad() {
+ var _list = [];
+ return function (id) {
+ if(_list.indexOf(id) >= 0){
+ return false;
+ }else {
+ _list.push(id);
+ return true;
+ }
+ }
+}
+
+// 应用
+var firstLoad = isFirstLoad()
+firstLoad(10) // true
+firstLoad(10) // false;
+firstLoad(20) // true
+```
+
diff --git a/04/chun-du-3001-bu-bian-xing-he-geng-gai-zheng-ce.md b/04/chun-du-3001-bu-bian-xing-he-geng-gai-zheng-ce.md
new file mode 100644
index 0000000..a56e694
--- /dev/null
+++ b/04/chun-du-3001-bu-bian-xing-he-geng-gai-zheng-ce.md
@@ -0,0 +1,2 @@
+# 纯度、不变性和更改政策
+
diff --git a/04/di-gui.md b/04/di-gui.md
new file mode 100644
index 0000000..d896a2c
--- /dev/null
+++ b/04/di-gui.md
@@ -0,0 +1,2 @@
+# 递归
+
diff --git a/04/gao-jie-han-shu.md b/04/gao-jie-han-shu.md
new file mode 100644
index 0000000..553bf73
--- /dev/null
+++ b/04/gao-jie-han-shu.md
@@ -0,0 +1,2 @@
+# 高阶函数
+
diff --git a/04/han-shu-ji-ben-ying-yong.md b/04/han-shu-ji-ben-ying-yong.md
new file mode 100644
index 0000000..a764773
--- /dev/null
+++ b/04/han-shu-ji-ben-ying-yong.md
@@ -0,0 +1,200 @@
+# 函数基本应用
+
+* 函数声明与函数表达式、对象实例化的区别
+
+```javascript
+ add1(1,1);
+ add2(1,2);
+ add3(1,3);
+ function add1(i, j){
+ console.log(i+j);
+ }
+ var add2 = function(i, j){
+ console.log(i+j);
+ }
+ var add3 = new Function("i", "j", "console.log(i+j);");
+```
+
+* 对象实例化与函数声明与函数表达式的区别
+
+```javascript
+ (function(){
+ var i = 10;
+ function add(j) {
+ console.log(i+j);
+ debugger;
+ }
+ add(1);
+ })();
+
+ (function(){
+ var i = 10;
+ var add = new Function("j", "console.log(i+j);debugger;");
+ add(1);
+ })();
+```
+
+* bind的使用
+
+```javascript
+ function Point(x, y){
+ this.x = x;
+ this.y = y;
+ }
+ Point.prototype.move = function(x, y) {
+ this.x += x;
+ this.y += y;
+ }
+ var p = new Point(0,0);
+ var circle = {x:1, y:1, r:1};
+ var circleMove = p.move.bind(circle, 2, 1);
+ circleMove();
+```
+
+* 构造函数
+
+```javascript
+ function Car(type,color){
+ this.type = type;
+ this.color = color;
+ this.status = "stop";
+ this.light = "off";
+ }
+ Car.prototype.start = function(){
+ this.status = "driving";
+ this.light = "on";
+ console.log(this.type + " is " + this.status);
+ }
+ Car.prototype.stop = function(){
+ this.status = "stop";
+ this.light = "off";
+ console.log(this.type + " is " + this.status);
+ }
+ var audi = new Car("audi", "silver");
+ var benz = new Car("benz", "black");
+ var ferrari = new Car("ferrari", "yellow");
+```
+
+* 函数调用模式
+
+```javascript
+ function add(i, j){
+ return i+j;
+ }
+ var myNumber = {
+ value: 1,
+ double: function(){
+ var helper = function(){
+ this.value = add(this.value,this.value);
+ }
+ helper();
+ }
+ }
+```
+
+* arguments转数组
+
+```javascript
+ function add(i, j) {
+ var args = Array.prototype.slice.apply(arguments);
+ args.forEach(function(item){
+ console.log(item);
+ })
+ }
+ add(1,2,3);
+```
+
+* arguments.callee使用
+
+```javascript
+ console.log(
+ (function(i){
+ if (i==0) {
+ return 1;
+ }
+ return i * arguments.callee(i-1);
+ })(5)
+ );
+```
+
+* 递归
+
+```javascript
+ function factorial(i){
+ if (i==0) {
+ return 1;
+ }
+ return i*factorial(i-1);
+ }
+```
+
+* 普通递归函数跟记忆函数调用次数对比
+
+```javascript
+ var factorial = (function(){
+ var count = 0;
+ var fac = function(i){
+ count++;
+ if (i==0) {
+ console.log('调用次数:' + count);
+ return 1;
+ }
+ return i*factorial(i-1);
+ }
+ return fac;
+ })();
+ for(var i=0;i<=10;i++){
+ console.log(factorial(i));
+ }
+
+//记忆函数
+ var factorial = (function(){
+ var memo = [1];
+ var count = 0;
+ var fac = function(i){
+ count++;
+ var result = memo[i];
+ if(typeof result === 'number'){
+ console.log('调用次数:' + count);
+ return result;
+ }
+ result = i*fac(i-1);
+ memo[i] = result;
+ return result;
+ }
+ return fac;
+ })();
+ for(var i=0;i<=10;i++){
+ console.log(factorial(i));
+ }
+```
+
+* curry 函数柯里化
+ * 把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术
+
+```javascript
+ function add(value){
+ var helper = function(next){
+ value = typeof(value)==="undefined"?next:value+next;
+ return helper;
+ }
+ helper.valueOf = function(){
+ return value;
+ }
+ return helper
+ }
+```
+
+* 定时器
+
+```javascript
+function set_loop() {
+ var i =1;
+ setTimeout(function () {
+ i = i + 1;
+ console.log(i);
+ set_loop()
+ },5000);
+}
+```
+
diff --git a/04/ji-yu-liu-de-bian-cheng.md b/04/ji-yu-liu-de-bian-cheng.md
new file mode 100644
index 0000000..100f400
--- /dev/null
+++ b/04/ji-yu-liu-de-bian-cheng.md
@@ -0,0 +1,2 @@
+# 基于流的编程
+
diff --git a/04/jian-tou-han-shu.md b/04/jian-tou-han-shu.md
new file mode 100644
index 0000000..850e098
--- /dev/null
+++ b/04/jian-tou-han-shu.md
@@ -0,0 +1,2 @@
+# 箭头函数
+
diff --git a/04/this.md b/04/this.md
new file mode 100644
index 0000000..d23018b
--- /dev/null
+++ b/04/this.md
@@ -0,0 +1,96 @@
+# this
+
+* this 要在执行时才能确认值,定义时无法确认值
+
+```javascript
+var a = {
+ name:'A',
+ fn:function(){
+ console.log(this.name);
+ }
+}
+a.fn() //this === A
+a.fn.call({name:'B'}) //this === {name:'B'}
+var fn1 = a.fn;
+fn1() //this === window
+```
+
+* 作为构造函数执行
+* 作为对象属性执行
+* 作为普通函数执行
+* call apply bind
+
+```javascript
+function Foo(name){
+ this.name = name;
+}
+var f = new Foo('zhangsan');
+
+var obj = {
+ name:'A',
+ printName:function(){
+ console.log(this.name);
+ }
+}
+obj.printName()
+
+function fn(){
+ console.log(this);
+}
+fn()
+
+// call apply bind
+function fn1(name) {
+ alert(name);
+ console.log(this);
+}
+fn1.call({x:100},'zhangsan',20);
+// bind
+var fn2 = function fn2(name) {
+ alert(name);
+ console.log(this);
+}.bind({y:200});
+fn2('zhangsan',20);
+```
+
+## this几种不停的使用场景
+
+* 作为构造函数执行
+* 作为对象属性执行
+* 作为普通函数执行
+* call apply bind
+
+```text
+function Foo(name){
+ this.name = name;
+}
+var f = new Foo('zhangsan');
+
+var obj = {
+ name:'A',
+ printName:function(){
+ console.log(this.name);
+ }
+}
+
+obj.printName()
+
+function fn(){
+ console.log(this);
+}
+fn()
+
+// call apply bind
+function fn1(name) {
+ alert(name);
+ console.log(this);
+}
+fn1.call({x:100},'zhangsan',20);
+// bind
+var fn2 = function fn2(name) {
+ alert(name);
+ console.log(this);
+}.bind({y:200});
+fn2('zhangsan',20);
+```
+
diff --git a/04/wu-lei-bian-cheng.md b/04/wu-lei-bian-cheng.md
new file mode 100644
index 0000000..73e3510
--- /dev/null
+++ b/04/wu-lei-bian-cheng.md
@@ -0,0 +1,2 @@
+# 无类编程
+
diff --git a/04/you-han-shu-gou-jian-han-shu.md b/04/you-han-shu-gou-jian-han-shu.md
new file mode 100644
index 0000000..ab245da
--- /dev/null
+++ b/04/you-han-shu-gou-jian-han-shu.md
@@ -0,0 +1,2 @@
+# 由函数构建函数
+
diff --git a/05/README.md b/05/README.md
new file mode 100644
index 0000000..7046bc5
--- /dev/null
+++ b/05/README.md
@@ -0,0 +1,86 @@
+# 05-JavaScrpit-BOM
+
+## 从基础知识到JS-Web-API
+
+* 变量类型和计算
+* 原型和原型链
+* 闭包和作用域
+* 异步和单线程
+* 其他(如日期、Math、各种常用API)
+
+### 特点
+
+* 特点:表面上来看不能用于工作中开发代码
+* 内置函数:`Object Array Boolean String ......`
+* 内置对象:`Math JSON ...`
+* 我们连在网页弹出一句`Hello World`都不能实现
+
+### JS-Web-API
+
+* JS基础知识:ECMA 262标准
+* JS-Web-API:W3C标准
+* W3C标准中关于JS的规定有:
+ * DOM操作
+ * BOM操作
+ * 事件绑定
+ * ajax请求\(包含http协议\)
+ * 存储
+
+### 基本操作
+
+* 页面弹框是`windows.alert(123)`,浏览器需要做:
+ * 定义一个`windows`全局变量,对象类型;
+ * 给它定义一个`alert`属性,属性值是一个函数;
+* 获取元素document.getElementById\(id\),浏览器需要:
+ * 定义一个document全局变量,对象属性;
+ * 给它定义一个getElementById的属性,属性值是一个函数;
+* W3C标准没有规定任何JS基础相关的东西;
+* 不管什么变量类型、原型、作用域和异步
+* 只管定义用于浏览器中JS操作页面的API和全局变量
+* 全面考虑,JS内置的全局函数和对象有哪些?
+* 之前ECMA的
+* 比如 window document
+* 所有未定义的全局变量,如`navigator.userAgent`
+
+### 总结
+
+* 常说的JS\(浏览器执行的JS\)包含两个部分:
+* JS基础知识\(ECMA262标准\);
+* JS-Web-API\(W3C标准\);
+
+## BOM操作
+
+* Browser Object Model
+
+ **如何监测浏览器的类型**
+
+ **拆解url的各部分**
+
+ **知识点**
+
+* `navigator & screen`
+
+```javascript
+//navigator
+var ua = navigator.userAgent;
+var isChrome = ua.indexOf('Chrome');
+console.log(isChrome);
+//screen
+console.log(screen.width);
+console.log(screen.height);
+```
+
+* `location & history`
+
+```javascript
+//location
+console.log(location.href);
+console.log(location.protocel);
+console.log(location.pathname);
+console.log(location.search);
+console.log(location.hash);
+//history
+history.back();
+history.forward();
+```
+
diff --git a/05/historydui-xiang.md b/05/historydui-xiang.md
new file mode 100644
index 0000000..259362f
--- /dev/null
+++ b/05/historydui-xiang.md
@@ -0,0 +1,2 @@
+# history对象
+
diff --git a/05/img/event_all.jpg b/05/img/event_all.jpg
new file mode 100644
index 0000000..df0fa3f
Binary files /dev/null and b/05/img/event_all.jpg differ
diff --git a/05/locationdui-xiang.md b/05/locationdui-xiang.md
new file mode 100644
index 0000000..7f509eb
--- /dev/null
+++ b/05/locationdui-xiang.md
@@ -0,0 +1,2 @@
+# location对象
+
diff --git a/05/navigatordui-xiang.md b/05/navigatordui-xiang.md
new file mode 100644
index 0000000..14393e1
--- /dev/null
+++ b/05/navigatordui-xiang.md
@@ -0,0 +1,2 @@
+# navigator对象
+
diff --git a/05/screendui-xiang.md b/05/screendui-xiang.md
new file mode 100644
index 0000000..24f9caf
--- /dev/null
+++ b/05/screendui-xiang.md
@@ -0,0 +1,2 @@
+# screen对象
+
diff --git a/05/windowdui-xiang.md b/05/windowdui-xiang.md
new file mode 100644
index 0000000..0cda2f0
--- /dev/null
+++ b/05/windowdui-xiang.md
@@ -0,0 +1,2 @@
+# window对象
+
diff --git a/06/README.md b/06/README.md
new file mode 100644
index 0000000..7868075
--- /dev/null
+++ b/06/README.md
@@ -0,0 +1,60 @@
+# 06-JavaScript-DOM
+
+## DOM操作
+
+* Document Object Model
+* DOM是哪种基本的数据结构
+* DOM操作的常用API有哪些
+* DOM节点的attr和property有和区别
+
+### DOM的本质
+
+* XML
+
+```markup
+
+
+ Tove
+ Jani
+ Reminder
+ Dont forget me this weekend
+
+
+
+
+
+```
+
+* HTML
+
+```markup
+
+
+
+
+ Document
+
+
+
+
+
+```
+
+## DOM知识解答
+
+* DOM是哪种基本的数据结构?
+ * 树
+* DOM操作的常用API有哪些
+ * 获取DOM节点,以及节点的`property`和`Attribute`
+ * 获取父节点,获取子节点
+ * 新增节点,删除节点
+* `DOM节点`的`Attribute`和`property`有何区别
+ * `property`只是一个`JS对象`的属性的修改
+ * `Attribute`是对`html标签`属性的修改
+* 重点总结
+ * DOM本质
+ * DOM节点的操作
+ * DOM结构操作
+
diff --git a/06/domjie-dian-cao-zuo.md b/06/domjie-dian-cao-zuo.md
new file mode 100644
index 0000000..0534fd1
--- /dev/null
+++ b/06/domjie-dian-cao-zuo.md
@@ -0,0 +1,45 @@
+# DOM节点操作
+
+## DOM节点操作
+
+* 获取DOM节点
+* prototype,获取JS对象上的属性
+* Attribute,获取DOM标签上的属性
+
+## 获取DOM节点
+
+```javascript
+var div1 = document.getElementById('div1'); //元素
+var divList = document.getElementByTagName('div'); //集合
+console.log(divList.length);
+console.log(divList[0]);
+var containerList = document.getElementByClassName('.container'); //集合
+var pList = document.querySelectorAll('p'); //集合
+```
+
+### property
+
+```javascript
+var pList = document.querySelectorAll('p');
+var p = pList[0];
+console.log(p.style.width); // 获取样式
+p.style.width = '100px' // 修改样式
+console.log(p.className);//获取class
+p.className = 'p1' //修改class
+
+// 获取 nodeName 和 ndoeType
+console.log(p.nodeName);
+console.log(p.nodeType);
+```
+
+### Attribute
+
+```javascript
+var pList = document.querySelectorAll('p');
+var p = pList[0];
+p.getAttribute('data-name');
+p.getAttribute('data-name','imooc');
+p.getAttribute('style');
+p.setAttribute('style','font-size:30px;');
+```
+
diff --git a/Example/demo1.html b/06/domjie-gou-cao-zuo.md
similarity index 54%
rename from Example/demo1.html
rename to 06/domjie-gou-cao-zuo.md
index ee5b420..3c10bd3 100644
--- a/Example/demo1.html
+++ b/06/domjie-gou-cao-zuo.md
@@ -1,3 +1,36 @@
+# DOM结构操作
+
+* 新增节点
+
+```javascript
+var div1 = document.getElementById('div1');
+//添加新节点
+var p1 = document.createElement('p');
+p1.innerHTML = 'this is p1';
+div1.appendChild(p1); //添加新创建的元素
+//移除已有节点
+var p2 = document.getElementById('p2');
+div1.appendChild(p2);
+```
+
+* 获取父元素-获取子节点
+
+```javascript
+var div1 = document.getElementById('div1');
+var parent = div1.parentElement;
+```
+
+* 删除节点
+
+```javascript
+var div1 = document.getElementById('div1');
+var child = div1.childNodes;
+div1.removeChild(child[0]);
+```
+
+## 举个栗子\(例子:example\)!!!
+
+```markup
@@ -29,3 +62,5 @@
+```
+
diff --git a/07/README.md b/07/README.md
new file mode 100644
index 0000000..d3b2fd8
--- /dev/null
+++ b/07/README.md
@@ -0,0 +1,123 @@
+# 07-JavaScrpit-事件
+
+## 07-JavaScrpit-事件
+
+### DOM事件介绍
+
+* 点击一个DOM元素
+* 键盘按一下一个键
+* 输入框输入内容
+* 页面加载完成
+
+## 编写一个通用的事件监听函数
+
+#### 描述事件冒泡流程
+
+* DOM树形结构
+* 事件冒泡
+* 阻止冒泡
+* 冒泡的应用
+
+#### 对于一个无限下拉加载图片的页面,如何给每个图片绑定事件
+
+* 使用代理
+* 知道代理的有点
+
+**通用事件绑定**
+
+```javascript
+var btn = document.getElementById('btn1');
+btn.addEventListener('click',function (event) {
+ console.log('clicked');
+})
+
+function bindEvent(elem,type,fn) {
+ elem.addEventListener(type,fn);
+}
+var a = document.getElementById('link1')
+bindEvent(a,'click',function(e){
+ e.preventDefault(); //阻止默认行为
+ alert('clicked');
+});
+```
+
+#### 事件冒泡
+
+```markup
+
+
+
+
+```
+
+```javascript
+var p1 = document.getElementById('p1');
+var body = document.body;
+bindEvent(p1,'click',function (e) {
+ e.stopPropatation();
+ alert('激活');
+});
+bindEvent(body,'click',function(e){
+ alert('取消');
+})
+```
+
+#### 代理
+
+```markup
+
+```
+
+```javascript
+var div1 = document.getElementById('div1');
+div1.addEventListener('click',function (e) {
+ var target = e.target;
+ if (target.nodeName === 'A') {
+ alert(target.innerHTML);
+ }
+})
+```
+
+#### 完善通用绑定事件的函数
+
+```javascript
+//使用代理
+var div1 = document.getElementById('div1');
+bindEvent(div1,'click','a',function (e) {
+ console.log(this.innerHTML);
+})
+```
+
+```javascript
+function bindEvent(elem,type,selector,fn) {
+ if (fn == null) {
+ fn = selector;
+ }
+ elem.addEventListener(type,function (e) {
+ var target;
+ if (selector) {
+ target = e.target;
+ if (target.matches(selector)) {
+ fn.call(target,e);
+ }
+ }else {
+ fn(e);
+ }
+ })
+}
+```
+
diff --git a/07/shi-jian-dui-xiang.md b/07/shi-jian-dui-xiang.md
new file mode 100644
index 0000000..e450282
--- /dev/null
+++ b/07/shi-jian-dui-xiang.md
@@ -0,0 +1,46 @@
+# 事件对象
+
+## 事件对象
+
+```javascript
+var elem = document.getElementById('div1');
+var clickHandler = function(event){
+ // TO DO
+}
+elem.addEventListener('click',clickHandler,false);
+```
+
+## `event对象包含很多信息`
+
+```javascript
+var elem = document.getElementById('div1');
+var clickHandler = function event() {
+ event = event || window.event;
+}
+addEvent(elem,'click',clickHandler,false);
+```
+
+## 事件对象
+
+* 属性
+ * type
+ * target\(`srcElement`IE\)`事件触发节点`
+ * currentTarget`父节点事件` \| `事件代理`
+* 方法
+ * stopPropagation `阻止冒泡`
+ * preventDefault `阻止默认事件`
+ * stopImmediatePropagation `阻止冒泡`
+
+### 阻止事件传播
+
+* `event.stopPropagation()` \(W3C\)
+ * 阻止事件传播到父节点
+ * `event.cancelBubble=true` \(IE\)
+ * `stopImmediatePropagation (W3C)` 并且阻止当前节点的后续事件
+
+### 阻止默认行为
+
+* `event.preventDefault() (W3C)`
+ * 阻止默认行为
+ * `Event.returnValue = false`\(IE\)
+
diff --git a/07/shi-jian-fen-lei.md b/07/shi-jian-fen-lei.md
new file mode 100644
index 0000000..ffebfd1
--- /dev/null
+++ b/07/shi-jian-fen-lei.md
@@ -0,0 +1,24 @@
+# 事件分类
+
+* Event : load\|unload\|error\|select\|abort
+* UIEvent : resize\|scroll
+* FoucusEvent : blur\|focus\|focusin\|focusout
+* InputEvent : beforeinput\|input
+* KeyboardEvent : keydown\|keyup
+* MouseEvent : click\|dbclick\|mousedown\|mouseenter\|mouseleave\|mousemove\|mouseout\|mouseover\|mouseup
+* WheelEvent : wheel
+
+
+
+## Event
+
+| 事件类型 | 是否冒泡 | 元素 | 默认事件 | 元素例子 |
+| :--- | :--- | :--- | :--- | :--- |
+| load | NO | Window,Document,Element | None | window,image,iframe |
+| unload | NO | Window,Document,Element | None | window |
+| error | NO | Window,Document | None | window,image |
+| select | NO | Element | None | input,textarea |
+| abort | NO | Window,Element | None | window,image |
+
+## 未完待续 。。。
+
diff --git a/Example/captrue.html b/07/shi-jian-liu.md
similarity index 58%
rename from Example/captrue.html
rename to 07/shi-jian-liu.md
index b2cfe04..b8014e0 100644
--- a/Example/captrue.html
+++ b/07/shi-jian-liu.md
@@ -1,3 +1,19 @@
+# 事件流
+
+* 三个过程:
+ * 从window对象向下到触发元素的父级元素是捕获过程;
+ * 然后触发相应事件
+ * 从当前触发事件的节点的父节点开始向上冒泡,冒泡到顶层的window对象
+
+
+
+1. capture phase 捕获过程
+2. target phase 触发过程
+3. bubble phase 冒泡过程
+
+## 冒泡与捕获
+
+```markup
@@ -33,28 +49,9 @@
},true);
ev.addEventListener('click',function () {
console.log('ev click');
- },true);
- window.addEventListener('click',function () {
- console.log("window click");
- });
- document.addEventListener('click',function () {
- console.log('document click');
- });
- document.documentElement.addEventListener('click',function () {
- console.log('html click');
- });
- document.body.addEventListener("click",function () {
- console.log('body click');
- });
- ev.addEventListener('click',function () {
- console.log('ev click');
- });
-
- var eve = new Event('test');
- ev.addEventListener('test'.function () {
- console.log('test');
- });
- ev.dispatchEvent(eve);
+ })
+```
+
diff --git a/07/shi-jian-zhu-ce-yu-hong-fa.md b/07/shi-jian-zhu-ce-yu-hong-fa.md
new file mode 100644
index 0000000..41043d7
--- /dev/null
+++ b/07/shi-jian-zhu-ce-yu-hong-fa.md
@@ -0,0 +1,64 @@
+# 事件注册与触发
+
+## 事件注册与触发
+
+* 事件注册
+* 取消事件注册
+* 事件触发
+
+#### eventTarget
+
+## 事件注册
+
+`eventTarget.addEventListener(type,listener,[useCapture])`
+
+```javascript
+var elem = document.getElementById('div1');
+var clickHandler = function(event){
+ // TO DO
+}
+elem.addEventListener('click',clickHandler,false);
+```
+
+## 取消事件注册
+
+`eventTarget.removeEventListener(type,listener,[useCapture])`
+
+```javascript
+elem.removeEventListener('click',clickHandler,false);
+elem.onclick=null;
+```
+
+## 事件触发
+
+`eventTarget.dispatchEvent(type)`
+
+### 浏览器兼容
+
+* 关于IE低版本的兼容性
+ * IE低版本使用attachEvent绑定事件,和W3C标准不一样
+* 事件注册与取消
+ * attachEvent/detachEvent
+* 事件触发
+ * fireEvent\(e\)
+* no capture
+
+#### 事件兼容处理\(W3C和IE低版本\)
+
+```javascript
+var addEvent = document.addEventListener ?
+ function functionName(elem,type,listener,useCapture) {
+ elem.addEventListener(type,listener,useCapture);
+ }:
+ function functionName(elem,type,listener,useCapture) {
+ elem.attachEvent('on' + type, listener);
+ };
+var delEvent = document.removeEventListener ?
+ function functionName(elem,type,listener,useCapture) {
+ elem.removeEventListener(type,listener,useCapture);
+ }:
+ function functionName() {
+ elem.detachEvent('on' + type, listener);
+ };
+```
+
diff --git a/08/README.md b/08/README.md
new file mode 100644
index 0000000..f6497c8
--- /dev/null
+++ b/08/README.md
@@ -0,0 +1,2 @@
+# 08-JavaScrpit-算法应用
+
diff --git "a/08/code/\345\275\222\345\271\266\346\216\222\345\272\217.html" "b/08/code/\345\275\222\345\271\266\346\216\222\345\272\217.html"
new file mode 100644
index 0000000..a90b129
--- /dev/null
+++ "b/08/code/\345\275\222\345\271\266\346\216\222\345\272\217.html"
@@ -0,0 +1,50 @@
+
+
+
+
+ 归并排序
+
+
+
+
+
+
diff --git a/08/ji-ben-pai-xu-suan-fa.md b/08/ji-ben-pai-xu-suan-fa.md
new file mode 100644
index 0000000..199649b
--- /dev/null
+++ b/08/ji-ben-pai-xu-suan-fa.md
@@ -0,0 +1,94 @@
+### JavaScript算法测试函数
+
+* SetData\(\)函数生成了存储在数组中的随机数字。Math类的random\(\)函数会生成\[0,1\)区间内的随机数字。换句话说,random\(\)函数生成的随机数字大于等于0,但不会等于1。最后在用Math类的floor\(\)函数确定最终结果。
+* 如下这个公式可以成功生成1~100的随机数字集合。
+
+```js
+function CArray(numElements) {
+ this.dataStore = [];
+ this.pos = 0;
+ this.numElements = numElements;
+ this.insert = insert;
+ this.toString = toString;
+ this.clear = clear;
+ this.setData = setData;
+ this.swap = swap;
+ for (var i = 0; i < numElements; ++i) {
+ this.dataStore[i] = i;
+ }
+}
+//数据输出
+function setData() {
+ for (var i = 0; i
+<
+ this.numElements; ++i) {
+ this.dataStore[i] = Math.floor(Math.random() * (this.numElements + 1));//生成随机数组
+ }
+}
+
+function clear() {
+ for (var i = 0; i
+<
+ this.dataStore.length; ++i) {
+ this.dataStore[i] = 0;
+ }
+}
+
+function insert(element) {
+ this.dataStore[this.pos++] = element;
+}
+
+function toString() {
+ var restr = "";
+ for (var i = 0; i < this.dataStore.length; ++i) {
+ restr += this.dataStore[i] + " ";
+ if (i > 0 & i % 10 == 0) {
+ restr += "\n";
+ }
+ }
+ return restr;
+}
+
+function swap(arr,index1,index2) {
+ var temp = arr[index1];
+ arr[index1] = arr[index2];
+ arr[index2] = temp;
+}
+
+//测试
+var numElements = 100;
+var myNums = new CArray(numElements);
+myNums.setData();
+console.log(myNums.toString());
+```
+
+#### 名词解释:
+
+* n: 数据规模
+* k:“桶”的个数
+* In-place: 占用常数内存,不占用额外内存
+* Out-place: 占用额外内存
+* 稳定性:排序后2个相等键值的顺序和排序之前它们的顺序相同
+
+##### 用一个`for`遍历数组排序
+
+```js
+var a = [12,13,65,54,86,21,37,1,95,4];
+var l = a.length;
+console.log(a);
+for (var i = 0; i < l; i++) {
+ if (a[i] > a[i + 1]) {
+ var temp = a[i];
+ a[i] = a[i + 1];
+ a[i + 1] = temp;
+ }
+ if (i == l-1) {
+ i = -1;
+ l--;
+ }
+}
+console.log(a);
+```
+
+
+
diff --git a/08/ji-ben-pai-xu-suan-fa/README.md b/08/ji-ben-pai-xu-suan-fa/README.md
new file mode 100644
index 0000000..494c248
--- /dev/null
+++ b/08/ji-ben-pai-xu-suan-fa/README.md
@@ -0,0 +1,92 @@
+# 基本排序算法
+
+* SetData\(\)函数生成了存储在数组中的随机数字。Math类的random\(\)函数会生成\[0,1\)区间内的随机数字。换句话说,random\(\)函数生成的随机数字大于等于0,但不会等于1。最后在用Math类的floor\(\)函数确定最终结果。
+* 如下这个公式可以成功生成1~100的随机数字集合。
+
+```javascript
+function CArray(numElements) {
+ this.dataStore = [];
+ this.pos = 0;
+ this.numElements = numElements;
+ this.insert = insert;
+ this.toString = toString;
+ this.clear = clear;
+ this.setData = setData;
+ this.swap = swap;
+ for (var i = 0; i < numElements; ++i) {
+ this.dataStore[i] = i;
+ }
+}
+//数据输出
+function setData() {
+ for (var i = 0; i
+<
+ this.numElements; ++i) {
+ this.dataStore[i] = Math.floor(Math.random() * (this.numElements + 1));//生成随机数组
+ }
+}
+
+function clear() {
+ for (var i = 0; i
+<
+ this.dataStore.length; ++i) {
+ this.dataStore[i] = 0;
+ }
+}
+
+function insert(element) {
+ this.dataStore[this.pos++] = element;
+}
+
+function toString() {
+ var restr = "";
+ for (var i = 0; i < this.dataStore.length; ++i) {
+ restr += this.dataStore[i] + " ";
+ if (i > 0 & i % 10 == 0) {
+ restr += "\n";
+ }
+ }
+ return restr;
+}
+
+function swap(arr,index1,index2) {
+ var temp = arr[index1];
+ arr[index1] = arr[index2];
+ arr[index2] = temp;
+}
+
+//测试
+var numElements = 100;
+var myNums = new CArray(numElements);
+myNums.setData();
+console.log(myNums.toString());
+```
+
+## 名词解释:
+
+* n: 数据规模
+* k:“桶”的个数
+* In-place: 占用常数内存,不占用额外内存
+* Out-place: 占用额外内存
+* 稳定性:排序后2个相等键值的顺序和排序之前它们的顺序相同
+
+### 用一个`for`遍历数组排序
+
+```javascript
+var a = [12,13,65,54,86,21,37,1,95,4];
+var l = a.length;
+console.log(a);
+for (var i = 0; i < l; i++) {
+ if (a[i] > a[i + 1]) {
+ var temp = a[i];
+ a[i] = a[i + 1];
+ a[i + 1] = temp;
+ }
+ if (i == l-1) {
+ i = -1;
+ l--;
+ }
+}
+console.log(a);
+```
+
diff --git a/08/ji-ben-pai-xu-suan-fa/cha-ru-pai-xu.md b/08/ji-ben-pai-xu-suan-fa/cha-ru-pai-xu.md
new file mode 100644
index 0000000..0678522
--- /dev/null
+++ b/08/ji-ben-pai-xu-suan-fa/cha-ru-pai-xu.md
@@ -0,0 +1,22 @@
+# 插入排序
+
+* 插入排序
+* 插入排序有两个循环,外循环将数组元素挨个移动,而内循环则对外循环中选中的元素及它后面的那个元素进行比较。如果外循环中选中的元素比内循环中选中的元素小,那么数组会向右移动,为内循环中的这个元素腾出位置。
+
+
+
+```javascript
+function insertionSort() {
+ var temp,inner;
+ for (var outer = 1; outer <= this.dataStore.length - 1 ; ++outer) {
+ temp = this.dataStore[outer];
+ inner = outer;
+ while (inner>0 &&(this.dataStore[inner-1] >= temp)) {
+ this.dataStore[inner] = this.dataStore[inner - 1];
+ --inner;
+ }
+ this.dataStore[inner] = temp;
+ }
+}
+```
+
diff --git a/08/ji-ben-pai-xu-suan-fa/gui-bing-pai-xu.md b/08/ji-ben-pai-xu-suan-fa/gui-bing-pai-xu.md
new file mode 100644
index 0000000..6ac0a05
--- /dev/null
+++ b/08/ji-ben-pai-xu-suan-fa/gui-bing-pai-xu.md
@@ -0,0 +1,60 @@
+# 归并排序
+
+
+
+* 归并排序
+* 归并排序是建立在归并操作上的一种有效的排序算法。该算法是分治法的一个非常典型的应用。归并排是一种稳定的排序方法。将已有序列的子序列合并
+* .把长度为n的输入序列分成两个长度为n/2的子序列;
+* .对这两个子序列分别采用归并排序;
+* .将两个排序好的子序列合并成一个最终的排序序列。
+
+```javascript
+function mergeSort(arr) { //采用自上而下的递归方法
+ var len = arr.length;
+ if(len <2) {
+ return arr;
+ }
+ var middle = Math.floor(len / 2),
+ left = arr.slice(0, middle),
+ right = arr.slice(middle);
+ return merge(mergeSort(left), mergeSort(right));
+}
+
+function merge(left, right){
+ var result = [];
+ console.time('归并排序耗时');
+ while (left.length && right.length) {
+ if (left[0] <= right[0]) {
+ result.push(left.shift());
+ } else {
+ result.push(right.shift());
+ }
+ }
+
+ while (left.length)
+ result.push(left.shift());
+
+ while (right.length)
+ result.push(right.shift());
+ console.timeEnd('归并排序耗时');
+ return result;
+}
+var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
+console.log(mergeSort(arr));
+// 归并排序耗时: 0.009033203125ms
+// 归并排序耗时: 0.0048828125ms
+// 归并排序耗时: 0.004150390625ms
+// 归并排序耗时: 0.002197265625ms
+// 归并排序耗时: 0.0048828125ms
+// 归并排序耗时: 0.0029296875ms
+// 归并排序耗时: 0.0009765625ms
+// 归并排序耗时: 0.000732421875ms
+// 归并排序耗时: 0.003173828125ms
+// 归并排序耗时: 0.003173828125ms
+// 归并排序耗时: 0.001220703125ms
+// 归并排序耗时: 0.002197265625ms
+// 归并排序耗时: 0.0029296875ms
+// 归并排序耗时: 0.002685546875ms
+//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]
+```
+
diff --git a/08/ji-ben-pai-xu-suan-fa/kuai-su-pai-xu.md b/08/ji-ben-pai-xu-suan-fa/kuai-su-pai-xu.md
new file mode 100644
index 0000000..c228c63
--- /dev/null
+++ b/08/ji-ben-pai-xu-suan-fa/kuai-su-pai-xu.md
@@ -0,0 +1,33 @@
+# 快速排序
+
+* 快速排序是处理大数据集最快的排序算法之一。它是一种分而治之的算法,通过递归的方式将数据依次分解为包含较小元素和较大元素的不同子序列。该算法不断重复这个步骤直到所有数据都是有序的。
+* 这个算法首先要在列表中选择一个元素作为基准值\(pivot\)。数据排序围绕基准值进行,将列表中小于基准值的元素移到数组的底部,将大于基准值的元素移到数组的顶部。
+
+## 快速排序的算法和伪代码
+
+* 算法:
+ * (1)选择一个基准元素,将列表分隔成两个子序列;
+ * (2)对列表重新排序,将所有小于基准值的元素放在基准值的前面,所有大于基准值的元素放在基准值的后面
+ * (3)分别对较小元素的子序列和较大元素的子序列重复步骤1和2。
+* 代码如下
+
+```javascript
+function qSort(list) {
+ if (list.length == 0) {
+ return [];
+ }
+ var lesser = [];
+ var greater = [];
+ var pivot = list[0];
+ for (var i = 1; i <
+ list.length; i++) {
+ if (list[i]= 2; --outer) {//对元素遍历,直到最后剩2个数字
+ for (var inner = 0; inner <= outer - 1; ++inner ) {//从第零个开始,直到不满足
+ if (this.dataStore[inner] > this.dataStore[inner + 1]) {//如果,前一个大于后一个,
+ swap(this.dataStore,inner,inner + 1);//进行交换
+ }
+ }
+ }
+}//通过比较把最大的放到最右面
+```
+
+* 使用bubbleSort\(\)对10个数字排序
+
+```javascript
+var numElements = 10;
+var mynums = new CArray(numElements);
+mynums.setData();
+console.log(mynums.toString());
+mynums.bubbleSort();
+console.log(mynums.toString);
+```
+
diff --git a/08/ji-ben-pai-xu-suan-fa/xi-er-pai-xu.md b/08/ji-ben-pai-xu-suan-fa/xi-er-pai-xu.md
new file mode 100644
index 0000000..5d9668e
--- /dev/null
+++ b/08/ji-ben-pai-xu-suan-fa/xi-er-pai-xu.md
@@ -0,0 +1,31 @@
+# 希尔排序
+
+* 希尔排序
+* 这个算法在插入排序的基础上作出了很大的改善。希尔排序的核心理念与插入排序不同,它会首先比较距离较远的元素,而非相邻的元素。和简单的比较相邻元素相比,使用这种方案可以使离正确位置很远的元素更快回到适合的位置。当开始用这个算法遍历数据集时,所有元素之间的距离会不断减小,直到处理到数据集的末尾,这时算法比较的就是相邻元素了。
+* 主要是通过遍历数组中相隔相同位置的元素去比较大小进行排列
+
+```javascript
+function shellsort() {
+ for (var g = 0; i <
+ this.gaps.length; ++g) {
+ for (var i = 0; i < this.dataStore.length; ++i) {
+ var temp = this.dataStore[i];
+ for (var j = i; j >= this.gaps[g] && this.dataStore[j-this.gaps[g]] > temp; j -= this.gaps[g]) {
+ this.dataStore[j] = this.dataStore[j-this.gaps[g]];
+ }
+ this.dataStore[j] = temp;
+ }
+ }
+}
+```
+
+* CArray构造函数中添加
+
+```javascript
+this.gaps = [5,3,1];
+//并添加一个函数
+function setGap(arr) {
+ this.gaps = arr ;
+}
+```
+
diff --git a/08/ji-ben-pai-xu-suan-fa/xuan-ze-pai-xu.md b/08/ji-ben-pai-xu-suan-fa/xuan-ze-pai-xu.md
new file mode 100644
index 0000000..0fb49d4
--- /dev/null
+++ b/08/ji-ben-pai-xu-suan-fa/xuan-ze-pai-xu.md
@@ -0,0 +1,26 @@
+# 选择排序
+
+* 选择排序
+* 选择排序从数组的开头开始,将第一个元素和其他元素进行比较。检查完所有元素后,最小的元素会被放到数组的第一个位置,然后算法会从第二个位置继续。这个过程一直进行,当进行到数组的倒数第二个位置时,所有的数据便完成了排序。
+* 选择排序会用到嵌套循环。外循环从数组的第一个元素一定到倒数第二个元素;内循环从第二个数组元素移动到最后一个元素,查找比当前外循环
+
+
+
+```javascript
+function selectionSort() {
+ var min,temp;
+ for (var outer = 0; outer <= this.dataStore.length-2; ++outer){//循环
+ min = outer;//定义第一个为最小
+ for (var inner = outer + 1; i {
+ // ?做一些异步操作,最终会调用下面两者之一:
+ //
+ // resolve(someValue); // fulfilled
+ // ?或
+ // reject("failure reason"); // rejected
+});
+```
+
+{% hint style="info" %}
+ promise.finally\(\) 要注意浏览器兼容性
+{% endhint %}
+
+## Promise实现
+
+{% code title="promise" %}
+```javascript
+// 基本状态
+
+
+class MyPromise(fn) {
+ static PENGDING = 'pending';
+ static RESOLVED = 'resolved'; // fulfilled
+ static REJECTED = 'rejected';
+
+ constructor(callBackFun) {
+ this.
+ }
+}
+```
+{% endcode %}
+
diff --git a/09/xmlhttprequest.md b/09/xmlhttprequest.md
new file mode 100644
index 0000000..e69de29
diff --git a/10/README.md b/10/README.md
new file mode 100644
index 0000000..c2a759f
--- /dev/null
+++ b/10/README.md
@@ -0,0 +1,2 @@
+# 10-JavaScrpit-跨域
+
diff --git a/10/kua-yu-fang-fa.md b/10/kua-yu-fang-fa.md
new file mode 100644
index 0000000..e69de29
diff --git a/10/kua-yu-fang-fa/README.md b/10/kua-yu-fang-fa/README.md
new file mode 100644
index 0000000..1b7e827
--- /dev/null
+++ b/10/kua-yu-fang-fa/README.md
@@ -0,0 +1,2 @@
+# 跨域方法
+
diff --git a/10/kua-yu-fang-fa/cors.md b/10/kua-yu-fang-fa/cors.md
new file mode 100644
index 0000000..37ec7bf
--- /dev/null
+++ b/10/kua-yu-fang-fa/cors.md
@@ -0,0 +1,2 @@
+# CORS
+
diff --git a/10/kua-yu-fang-fa/hash.md b/10/kua-yu-fang-fa/hash.md
new file mode 100644
index 0000000..4f46dfe
--- /dev/null
+++ b/10/kua-yu-fang-fa/hash.md
@@ -0,0 +1,2 @@
+# Hash
+
diff --git a/10/kua-yu-fang-fa/jsonp.md b/10/kua-yu-fang-fa/jsonp.md
new file mode 100644
index 0000000..6e1be72
--- /dev/null
+++ b/10/kua-yu-fang-fa/jsonp.md
@@ -0,0 +1,60 @@
+# JSONP
+
+我理解的JSONP的方式就是,通过JS代码,动态创建一个Script标签,通过标签的src的网址里面包含一个JSONP属性,后端接收到后返回一个url中jsonp=参数,这样一个参数\(包含一个json\),通过执行这个参数命名的函数来实现跨域。
+
+以下是JS中的代码
+
+```javascript
+var util = {};
+
+/*[function 在页面注入脚本]*/
+util.createScript = function(url,charset){
+ var script = document.createElement('script');
+ script.setAttribute('type','text/javascript');
+ charset && script.setAttribute('charset',charset);
+ script.async = true;
+ return script;
+}
+
+/*[function jsonp]*/
+util.jsonp =function(url,onsuccess,onerror,charset){
+ var callbackName = util.getName('tt_player');
+ window[callbackName] = function () {
+ if(onsuccess && util.isFunction(onsuccess)){
+ onsuccess(arguments[0]);
+ }
+ };
+ var script = util.createScript(url + '&callback=' + callbackName,charset);
+ script.onload = script.onreadystatechange = function () {
+ if(!script.readyState || /loaded|complete/.test(script.readyState)){
+ script.onload = script.onreadystatechange = null;
+ //移除该script 的DOM 对象
+ if(script.parentNode){
+ script.parentNode.removeChild(script);
+ }
+ //删除函数或变量
+ window[callbackName] = null;
+ }
+ };
+ script.onerror = function(){
+ if(onerror && util.isFunction(onerror)){
+ onerror();
+ }
+ };
+ document.getElementsByTagName('head')[0].appendChild(script);
+}
+```
+
+通过它可以创建如下
+
+```markup
+
+
+```
+
diff --git a/10/kua-yu-fang-fa/xdomainrequest.md b/10/kua-yu-fang-fa/xdomainrequest.md
new file mode 100644
index 0000000..83deef8
--- /dev/null
+++ b/10/kua-yu-fang-fa/xdomainrequest.md
@@ -0,0 +1,2 @@
+# XDomainRequest
+
diff --git a/10/kua-yu.md b/10/kua-yu.md
new file mode 100644
index 0000000..7466b22
--- /dev/null
+++ b/10/kua-yu.md
@@ -0,0 +1,2 @@
+# 跨域
+
diff --git a/11/README.md b/11/README.md
new file mode 100644
index 0000000..799e463
--- /dev/null
+++ b/11/README.md
@@ -0,0 +1,71 @@
+# 11-JavaScrpit-模块化
+
+## 模块化
+
+* 不使用模块化
+* 使用模块化
+* AMD
+* CommonJS
+* ES6
+
+### 不使用模块化
+
+* `util getFormatDate函数`
+* `a-util.js aGetFormatDate函数 使用getFormatDate`
+* `a.js aGetFormatDate`
+* 定义
+
+```javascript
+//util.js
+function getFormatDate(date,type) {
+ //type === 1返回 2017-06-15
+ //type === 2返回 2017年6月15日 格式
+ //...
+}
+//a-util.js
+function aGetFormatDate(data) {
+ //返回
+ return getFormatDate(date,2);
+}
+// a.js
+var dt = new Date()
+console.log(aGetFormatDate(dt));
+```
+
+* 使用
+
+```markup
+
+
+
+
+
+```
+
+### 使用模块化
+
+```javascript
+//util.js
+export{
+ getFormatDate:function (data,type) {
+ //type === 1 返回 2017-06-15
+ //type === 2 返回 2017年6月15日 格式
+ }
+}
+//a-util.js
+var getFormatDate = require('util.js');
+export{
+ aGetFormatDate:function (date) {
+ //要求返回 2017年6月15日 格式
+ return getFormatDate(date,2);
+ }
+}
+// a.js
+var aGetFormatDate = require('a-util.js')
+var dt = new Date();
+console.log(aGetFormatDate(dt));
+
+//直接‘’,其他的根据依赖关系自动引用
+//那两个函数,没必要做成全局变量,不会带来污染和覆盖
+```
+
diff --git a/11/amd.md b/11/amd.md
new file mode 100644
index 0000000..2427382
--- /dev/null
+++ b/11/amd.md
@@ -0,0 +1,63 @@
+# AMD
+
+* require.js `requirejs.org/`
+* 全局define函数
+* 全局require函数
+* 依赖JS会自动、异步加载
+
+```javascript
+//util.js
+define(function () {
+ return{
+ getFormatDate: function (date,type) {
+ if (type === 1) {
+ return '2017-06-15'
+ }
+ if (type === 2) {
+ return '2017年6月15日'
+ }
+ }
+ }
+});
+
+//a-util.js
+define(['./util.js'],function (util) {
+ return{
+ aGetFormatDate: function (date) {
+ return util.getFormatDate(date,2);
+ }
+ }
+});
+
+// a.js
+define('[./a-util.js]',function (aUtil) {
+ return{
+ printDate:function (date) {
+ console.log(aUtil.aGetFormatDate);
+ }
+ }
+});
+
+//main.js
+require('[./a.js]',function (a) {
+ var date = new Date();
+ a.printDate(date);
+});
+```
+
+* 使用
+
+```markup
+
+
+
+
+ Document
+
+
+ AMD test
+
+
+
+```
+
diff --git a/11/cmd.md b/11/cmd.md
new file mode 100644
index 0000000..e161396
--- /dev/null
+++ b/11/cmd.md
@@ -0,0 +1,33 @@
+# CommonJS
+
+* nodejs模块化规范,现在被大量用于前端,原因:
+ * 前端开发依赖的插件和库,都可以从npm中获取
+ * 构建工具的高度自动化,是的使用npm的成本非常低
+ * CommonJS不会异步加载JS,而是同步一次性加载出来
+
+```javascript
+module.exports = {
+ getFormatDate:function (data,type) {
+ if (type === 1) {
+ return '2017-06-15';
+ }
+ if (type === 2) {
+ return '2017年6月15日';
+ }
+ }
+}
+
+// a-util.js
+var util = require('util.js')
+module.exports = {
+ aGetFormatDate:function (data) {
+ return util.getFormatDate(data,2);
+ }
+}
+```
+
+## AMD和CommonJS的使用场景
+
+* 需要异步加载JS,使用AMD
+* 使用了npm之后建议使用CommonJS
+
diff --git a/11/es6mo-kuai-hua.md b/11/es6mo-kuai-hua.md
new file mode 100644
index 0000000..95f1c7f
--- /dev/null
+++ b/11/es6mo-kuai-hua.md
@@ -0,0 +1,2 @@
+# ES6模块化
+
diff --git a/12/README.md b/12/README.md
new file mode 100644
index 0000000..6a898be
--- /dev/null
+++ b/12/README.md
@@ -0,0 +1,2 @@
+# 12-JavaScrpit-Web安全🔐
+
diff --git a/12/csrf.md b/12/csrf.md
new file mode 100644
index 0000000..56b1178
--- /dev/null
+++ b/12/csrf.md
@@ -0,0 +1,2 @@
+# CSRF
+
diff --git a/12/xss.md b/12/xss.md
new file mode 100644
index 0000000..d037aa2
--- /dev/null
+++ b/12/xss.md
@@ -0,0 +1,2 @@
+# XSS
+
diff --git a/13/README.md b/13/README.md
new file mode 100644
index 0000000..b84f9b5
--- /dev/null
+++ b/13/README.md
@@ -0,0 +1,4 @@
+# 13-JavaScrpit-应用
+
+* [Socket.io库](https://www.gitbook.com/book/tyrmars/javascript-steppitguide/edit#)
+
diff --git a/13/async+awaityi-bu-diao-yong.md b/13/async+awaityi-bu-diao-yong.md
new file mode 100644
index 0000000..e506173
--- /dev/null
+++ b/13/async+awaityi-bu-diao-yong.md
@@ -0,0 +1,41 @@
+# async+await异步调用
+
+最早的的使用异步操作的时候,我们一般会用setTimeout,会出现回掉地狱的情况
+
+```javascript
+setTimeout(()=>{
+ setTimeout(()=>{
+ setTimeout(()=>{
+ console.log('1')
+ },1000)
+ },1000)
+},1000)
+```
+
+ES6中Promise
+
+```javascript
+//promise
+()=>{
+ axios.post('/user/readmsg',{from})
+ .then(res=>{
+ const userid = getState().user._id
+ if( res.status === 200 && res.data.code === 0){
+ dispatch(msgRead({userid,from,num:res.data.num}))
+ }
+ })
+}
+```
+
+ES7 async+await
+
+```javascript
+async ()=>{
+ const res = await axios.post('/user/readmsg',{from})
+ const userid = getState().user._id
+ if( res.status === 200 && res.data.code === 0){
+ dispatch(msgRead({userid,from,num:res.data.num}))
+ }
+}
+```
+
diff --git a/13/axios.md b/13/axios.md
new file mode 100644
index 0000000..5164eea
--- /dev/null
+++ b/13/axios.md
@@ -0,0 +1,32 @@
+# axios
+
+简洁好用的发送请求库,`npm install axios --save`安装
+
+* axios.interceptors设置拦截器,比如全局的loading
+* axios.get,post发送请求,返回promise对象
+
+## 发送请求
+
+```javascript
+//get请求
+```
+
+## 拦截请求
+
+```javascript
+//拦截请求
+import axios from 'axios'
+axios.interceptors.request.use(
+ function(config){
+ //doing
+ }
+)
+
+//拦截响应
+axios.interceptors.request.use(
+ function(config){
+ //doing
+ }
+)
+```
+
diff --git a/13/socketio.md b/13/socketio.md
new file mode 100644
index 0000000..021010d
--- /dev/null
+++ b/13/socketio.md
@@ -0,0 +1,46 @@
+# Socket.io库
+
+## Socket.io是什么?
+
+### 基于事件的实时双向通信库
+
+* 基于websocket协议
+* 前后端通过事件进行双向通信
+* 配合express,快速开发实时应用
+
+## Socket.io和Ajax区别
+
+### 基于不同的网络协议
+
+* Ajax基于http协议,单向,实时获取数据只能轮询
+* socket.io基于websocket双向通信协议,后端可以主动推送数据
+* 现代浏览器均可以支持websocket
+
+
+
+## Socket.io后端API
+
+### 配合express
+
+* IO = require\('socket.io'\)\(http\)
+* io.on 监听事件
+* io.emit 触发事件
+
+## Socket.io前端API
+
+### 配合 express
+
+* import io from 'socket.io-client'
+* io.on 监听事件
+* io.emit 触发事件
+
+## Socket.io合并HTTP
+
+```javascript
+const express = require('express')
+const app = express()
+//work with express
+const server = require('http').Server(app)
+const io = require('socket.io')(server)
+```
+
diff --git a/14.md b/14.md
new file mode 100644
index 0000000..56694ae
--- /dev/null
+++ b/14.md
@@ -0,0 +1,2 @@
+# 14-JavaScript-设计模式
+
diff --git a/14/README.md b/14/README.md
new file mode 100644
index 0000000..e69de29
diff --git a/15.md b/15.md
new file mode 100644
index 0000000..e78b141
--- /dev/null
+++ b/15.md
@@ -0,0 +1,104 @@
+# 15-JavaScript-正则表达式
+
+* [正则练习](http://www.52cik.com/regex-tuesday/)
+
+## 1.生成一个正则表达式regexObj
+
+* 描述字符串规则的表达式,两种方式
+ * 直接量: `/pattren/attrs`\(/规则/属性\)
+ * 对象构造方式:`new RegExp(pattern,arrtes)` \(/规则/属性\)
+
+## 2.regexObj.test\(str\)
+
+* 测试正则表达式regexObj与指定字符串是否匹配
+
+```javascript
+/10086/.test('10086') //true
+/10086/.test('12314') //false
+/10086/.test('x10086s') //true //true
+```
+
+* 由此看到`.test()`匹配了正则表达式,但是最后一条出来了一个问题。如果这种情况下`/10086/.test('x10086s')`正则表达式匹配到该字符串中确实含有此正则表达式
+* 所以必须要有一些限制,以下就是限制方法
+
+### 锚点
+
+* 我们可以通过一个锚点匹配一个位置
+ * `^`:起始位置
+ * `$` :结尾位置
+ * `\b` :单词边界
+
+```javascript
+//起始位置
+/^http:/.test('http://www.kejiganhuo.com') // true 以http:为起始的字符串可以匹配
+/^http:/.test('attp://www.kejiganhuo.com') // false
+/^http:/.test('https://www.kejiganhuo.com') //false
+//结尾位置
+/\.jpg$/.test('1.jpg') // true 以.jsp结尾的字符串可以匹配
+/\.jsp$/.test('1.jpg ls') // false
+//单词边界
+/\bis\b/.test('this is tyrmars') // true 这里is才是正则所匹配的,匹配的就是is,就是看有没有is字符串
+/\bis\b/.test('this') // false this是无法匹配单词边界为is
+/is\b/.test('this tyrmars') // true 这样就可以匹配,因为单词左边界没有限制
+```
+
+#### example1
+
+```javascript
+/^10086$/.test('10086') //true
+```
+
+* 这种方法只能检测固定的号码,但是我们想检测同类的手机号码,所以就需要用到如下 **字符类**
+
+### 字符类
+
+* 匹配一类字符中的一个,采用`[]`,相当于限定字符集
+ * `[abc]`:a或b或c
+ * `[0-9]`:一个数字
+ * `[^0-9]`:非数字的一个字符
+ * `[a-z]`:一个字母
+ * `.`:任意一个字符\(除还行外\)
+
+```javascript
+/[0-9]/.test(123) // true
+/[^1-9]/.test(0123) // false
+/[12345]/.test(0) // false
+/[abc]/.test('abcdefgh') //true
+/[abc]/.test('fgh') //false
+```
+
+#### example2
+
+```javascript
+/^1[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/.test(12345678901) //true
+```
+
+* `[0-9]`可以被优化,所以学习到了元字符,元字符是具有特殊意义的字符
+
+### 元字符
+
+* 具有特殊意义的字符
+ * `^`、`$`、`\b`
+ * `\d`:`[0-9]`
+ * `\D`:`[^\d]`
+ * `\s`:空白符
+ * `\S`:`[^\s]`
+ * `\w`:`[A-Z]`
+ * `\W`:`[^\w]`
+
+#### example3
+
+```javascript
+/^1\d\d\d\d\d\d\d\d\d\d\d$/.test(12345678901) //true
+```
+
+* 不过呢,想一下这些`\d`都是重复的,所以需要用到量词
+
+### 量词
+
+* 出现的次数
+ * `{m,n}`:m到n次
+ * `*`:`{0,}` 出现0或n次
+ * `?`:`{0,1}` 出现0或者1次
+ * `+`:`{1,}` 出现1或n次
+
diff --git a/15/README.md b/15/README.md
new file mode 100644
index 0000000..d1f8dc4
--- /dev/null
+++ b/15/README.md
@@ -0,0 +1,106 @@
+# JavaScript正则表达式
+
+* [正则练习](http://www.52cik.com/regex-tuesday/ "正则练习")
+
+### 1.生成一个正则表达式regexObj
+
+* 描述字符串规则的表达式,两种方式
+ * 直接量: `/pattren/attrs`\(/规则/属性\)
+ * 对象构造方式:`new RegExp(pattern,arrtes)` \(/规则/属性\)
+
+### 2.regexObj.test\(str\)
+
+* 测试正则表达式regexObj与指定字符串是否匹配
+
+```js
+/10086/.test('10086') //true
+/10086/.test('12314') //false
+/10086/.test('x10086s') //true //true
+```
+
+* 由此看到`.test()`匹配了正则表达式,但是最后一条出来了一个问题。如果这种情况下`/10086/.test('x10086s')`正则表达式匹配到该字符串中确实含有此正则表达式
+* 所以必须要有一些限制,以下就是限制方法
+
+#### 锚点
+
+* 我们可以通过一个锚点匹配一个位置
+ * `^`:起始位置
+ * `$` :结尾位置
+ * `\b` :单词边界
+
+```js
+//起始位置
+/^http:/.test('http://www.kejiganhuo.com') // true 以http:为起始的字符串可以匹配
+/^http:/.test('attp://www.kejiganhuo.com') // false
+/^http:/.test('https://www.kejiganhuo.com') //false
+//结尾位置
+/\.jpg$/.test('1.jpg') // true 以.jsp结尾的字符串可以匹配
+/\.jsp$/.test('1.jpg ls') // false
+//单词边界
+/\bis\b/.test('this is tyrmars') // true 这里is才是正则所匹配的,匹配的就是is,就是看有没有is字符串
+/\bis\b/.test('this') // false this是无法匹配单词边界为is
+/is\b/.test('this tyrmars') // true 这样就可以匹配,因为单词左边界没有限制
+```
+
+###### example1
+
+```js
+/^10086$/.test('10086') //true
+```
+
+* 这种方法只能检测固定的号码,但是我们想检测同类的手机号码,所以就需要用到如下 **字符类**
+
+#### 字符类
+
+* 匹配一类字符中的一个,采用`[]`,相当于限定字符集
+ * `[abc]`:a或b或c
+ * `[0-9]`:一个数字
+ * `[^0-9]`:非数字的一个字符
+ * `[a-z]`:一个字母
+ * `.`:任意一个字符\(除还行外\)
+
+```js
+/[0-9]/.test(123) // true
+/[^1-9]/.test(0123) // false
+/[12345]/.test(0) // false
+/[abc]/.test('abcdefgh') //true
+/[abc]/.test('fgh') //false
+```
+
+###### example2
+
+```js
+/^1[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/.test(12345678901) //true
+```
+
+* `[0-9]`可以被优化,所以学习到了元字符,元字符是具有特殊意义的字符
+
+#### 元字符
+
+* 具有特殊意义的字符
+ * `^`、`$`、`\b`
+ * `\d`:`[0-9]`
+ * `\D`:`[^\d]`
+ * `\s`:空白符
+ * `\S`:`[^\s]`
+ * `\w`:`[A-Z]`
+ * `\W`:`[^\w]`
+
+###### example3
+
+```js
+/^1\d\d\d\d\d\d\d\d\d\d\d$/.test(12345678901) //true
+```
+
+* 不过呢,想一下这些`\d`都是重复的,所以需要用到量词
+
+#### 量词
+
+* 出现的次数
+ * `{m,n}`:m到n次
+ * `*`:`{0,}` 出现0或n次
+ * `?`:`{0,1}` 出现0或者1次
+ * `+`:`{1,}` 出现1或n次
+
+
+
diff --git a/16.md b/16.md
new file mode 100644
index 0000000..cd348b7
--- /dev/null
+++ b/16.md
@@ -0,0 +1,16 @@
+# 16-JavaScript-性能优化
+
+## 页面性能
+
+* 浏览器缓存
+
+### 缓存分类
+
+* 强缓存:直接拿来用的缓存
+ * **Expires** Expires:Thu, 21 Jan 2018 23:39:02 GMT **(表示绝对时间,时间来自服务器,但是做比较的时候以本地浏览器的时间作为比较)**
+ * **Cache-Control** Cache-Control:max-age = 3600**(客户端相对时间)它的判断优先级高**
+* 协商缓存:本地有副本,但无法确实是否可以使用,需要询问服务器
+ * **Last-Modified (服务端发过来修改时间)=== If-Modified-Since (通过这个Key值询问是否变化)**
+ * **Etag (哈希值,如果修改时间变了,但是内容没变通过对比Etag值来判断是否可以再用)**
+ * **If-None-Match是一个条件式请求首部。对于** `GET` **和** `HEAD` **请求方法来说,当且仅当服务器上没有任何资源的**`ETag`**属性值与这个首部中列出的相匹配的时候,服务器端会才返回所请求的资源,响应码为 200 。对于其他方法来说,当且仅当最终确认没有已存在的资源的** `ETag` **属性值与这个首部中所列出的相匹配的时候,才会对请求进行相应的处理。**
+
diff --git a/16/README.md b/16/README.md
new file mode 100644
index 0000000..39a0d73
--- /dev/null
+++ b/16/README.md
@@ -0,0 +1,18 @@
+# 16-JavaScript-性能优化
+
+#### 页面性能
+
+* 浏览器缓存
+
+###### 缓存分类
+
+* 强缓存:直接拿来用的缓存
+ * **Expires **Expires:Thu, 21 Jan 2018 23:39:02 GMT **(表示绝对时间,时间来自服务器,但是做比较的时候以本地浏览器的时间作为比较)**
+ * **Cache-Control **Cache-Control:max-age = 3600**(客户端相对时间)它的判断优先级高**
+* 协商缓存:本地有副本,但无法确实是否可以使用,需要询问服务器
+ * **Last-Modified (服务端发过来修改时间)=== If-Modified-Since (通过这个Key值询问是否变化)**
+ * **Etag (哈希值,如果修改时间变了,但是内容没变通过对比Etag值来判断是否可以再用)**
+ * **If-None-Match是一个条件式请求首部。对于 **`GET`** 和 **`HEAD`** 请求方法来说,当且仅当服务器上没有任何资源的**`ETag`**属性值与这个首部中列出的相匹配的时候,服务器端会才返回所请求的资源,响应码为 200 。对于其他方法来说,当且仅当最终确认没有已存在的资源的 **`ETag`** 属性值与这个首部中所列出的相匹配的时候,才会对请求进行相应的处理。**
+
+
+
diff --git a/17.md b/17.md
new file mode 100644
index 0000000..5ba455a
--- /dev/null
+++ b/17.md
@@ -0,0 +1,86 @@
+# 17-JavaScript-错误监控
+
+* 前端错误的分类
+* 错误的捕获方式
+* 上报错误的基本原理
+
+## 1、前端错误的分类
+
+* 即时运行错误:代码错误
+* 资源加载错误
+
+## 2、错误的捕获方式
+
+### 即时运行错误捕获方式
+
+1. try...catch
+2. window.onerror
+
+### 资源加载错误
+
+1. object.onerror
+2. performance.getEntries
+3. Error事件捕获
+
+* 资源加载错误事件不会冒泡,只会在本身这个object报错事件进行响应
+* performace.getEntries\(\)这个API获取所有资源的加载地址
+
+
+
+* Error事件捕获
+
+```markup
+
+
+
+
+
+
+
+
+
+
+
+```
+
+
+
+### 跨域资源加载错误
+
+1. 在script标签增加crossorigin属性(客户端错误)
+2. 设置JS资源响应头Access-Control-Allow-Origin:\*(服务端做)
+
+## 3、错误监控
+
+* 上报错误的基本原理
+ * 使用Ajax通信进行上报
+ * 利用Image对象上报
+
+```markup
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+
+
diff --git a/17/README.md b/17/README.md
new file mode 100644
index 0000000..c57b94f
--- /dev/null
+++ b/17/README.md
@@ -0,0 +1,84 @@
+# 17-JavaScript-错误监控
+
+* 前端错误的分类
+* 错误的捕获方式
+* 上报错误的基本原理
+
+### 1、前端错误的分类
+
+* 即时运行错误:代码错误
+* 资源加载错误
+
+### 2、错误的捕获方式
+
+###### 即时运行错误捕获方式
+
+1)try...catch 2)window.onerror
+
+###### 资源加载错误
+
+1)object.onerror 2)performance.getEntries 3)Error事件捕获
+
+* 资源加载错误事件不会冒泡,只会在本身这个object报错事件进行响应
+* performace.getEntries\(\)这个API获取所有资源的加载地址
+
+
+
+* Error事件捕获
+
+```html
+
+
+
+
+
+
+
+
+
+
+
+```
+
+
+
+###### 跨域资源加载错误
+
+1. 在script标签增加crossorigin属性(客户端错误)
+2. 设置JS资源响应头Access-Control-Allow-Origin:\*(服务端做)
+
+### 3、错误监控
+
+* 上报错误的基本原理
+ * 使用Ajax通信进行上报
+ * 利用Image对象上报
+
+```html
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+
+
diff --git a/18/README.md b/18/README.md
new file mode 100644
index 0000000..0a0f48a
--- /dev/null
+++ b/18/README.md
@@ -0,0 +1,2 @@
+# 18-JavaScript-语法规则
+
diff --git a/18/eslint.md b/18/eslint.md
new file mode 100644
index 0000000..388689a
--- /dev/null
+++ b/18/eslint.md
@@ -0,0 +1,4 @@
+# ESlint
+
+语法限制,语法规范
+
diff --git a/19-javascriptgong-ju.md b/19-javascriptgong-ju.md
new file mode 100644
index 0000000..e69de29
diff --git a/19-javascriptgong-ju/README.md b/19-javascriptgong-ju/README.md
new file mode 100644
index 0000000..7d4de46
--- /dev/null
+++ b/19-javascriptgong-ju/README.md
@@ -0,0 +1,2 @@
+# 19-JavaScript-工具
+
diff --git a/19-javascriptgong-ju/shi-jian-cao-zuo.md b/19-javascriptgong-ju/shi-jian-cao-zuo.md
new file mode 100644
index 0000000..acab8d3
--- /dev/null
+++ b/19-javascriptgong-ju/shi-jian-cao-zuo.md
@@ -0,0 +1,29 @@
+# 时间操作
+
+## 时间内整天数据筛选
+
+```text
+
+```
+
+## 获取时间内整天
+
+```typescript
+/**
+ * getXAxis()方法作用:获取开始日期和结束日期之间(包含开始日期和结束日期)的日期数组,可作为时间轴坐标等
+ * @param filters: {tab:0/1/2, startTime:开始日期, endTime:结束日期}
+ * 说明: tab:取值0或1或2,分别表示日、月、年,对应的startTime和endTime的格式分别为'yyyy-MM-dd'、'yyyy-MM'、'yyyy'
+ */
+export function getXAxis(startTime: number, endTime: number): any {
+ const length = (endTime - startTime) / (1000 * 24 * 60 * 60) + 1;
+ const start = moment(startTime);
+ const xAxis = new Array(length);
+ for (let i = 0; i < length; i++) {
+ start.set('date', start.get('date') + 1);
+ xAxis[i] = moment(startTime).format('YYYY-MM-DD');
+ }
+
+ return xAxis;
+}
+```
+
diff --git a/AMD/index.html b/AMD/index.html
deleted file mode 100644
index 5d6d843..0000000
--- a/AMD/index.html
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
- Document
-
-
- AMD test
-
-
-
diff --git a/AMD/js/a.js b/AMD/js/a.js
deleted file mode 100644
index 936ce75..0000000
--- a/AMD/js/a.js
+++ /dev/null
@@ -1,8 +0,0 @@
-define(['./a_util.js'],function (aUtil) {
- var a = {
- printDate: function (date) {
- console.log(aUtil.aGetFormatDate(date));
- }
- }
- return a
-})
diff --git a/AMD/js/a_util.js b/AMD/js/a_util.js
deleted file mode 100644
index 2ab49ce..0000000
--- a/AMD/js/a_util.js
+++ /dev/null
@@ -1,8 +0,0 @@
-define(['./util.js'],function (util) {
- var aUtil ={
- aGetFormatDate:function (date) {
- return util.getFormatDate(date,2)
- }
- }
- return aUtil
-})
diff --git a/AMD/js/main.js b/AMD/js/main.js
deleted file mode 100644
index e47ff59..0000000
--- a/AMD/js/main.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require(['./js/a.js'],function (a) {
- var date = new Date();
- a.printDate(date);
-})
diff --git a/AMD/js/util.js b/AMD/js/util.js
deleted file mode 100644
index a3784a6..0000000
--- a/AMD/js/util.js
+++ /dev/null
@@ -1,12 +0,0 @@
-define(function () {
- var util = {
- getFormatDate:function (date,type) {
- if (type === 1) {
- return '2017-8-6'
- }else if (type === 2) {
- return '2017年8月6日'
- }
- }
- }
- return util
-})
diff --git a/Accordions/css/base.css b/Accordions/css/base.css
deleted file mode 100644
index 6f128ce..0000000
--- a/Accordions/css/base.css
+++ /dev/null
@@ -1,77 +0,0 @@
-body,ul,li,p,h3{margin: 0;padding: 0;}
-ul,ol {list-style: none;}
-
-.wrapper{
- width: 1920px;
- height: 240px;
-}
-
-.wrapper li{
- width: 384px;
- height: 240px;
- float: left;
- overflow: hidden;
-}
-
-.wrapper li a{
- display: block;
- width: 384px;
- height: 240px;
- position: relative;
- text-decoration: none;
-}
-
-.wrapper img {
- position: absolute;
- bottom: 0;
- right: -15px;
- width: 384px;
- height: 240px;
-}
-
-.wrapper .info{
- position: absolute;
- top:0;
- left: 0;
- width: 120px;
- padding: 5px 15px;
-}
-
-.wrapper .info h3{
- font-size: 20px;
- font-weight: 700;
- color: #ffffff;
-}
-
-.wrapper .info p{
- font-size: 15px;
- color: #ffffff;
- line-height: 22px;
-}
-
-.wrapper .line{
- position: absolute;
- right:0;
- width:0;
- height: 240px;
- border: 1px dashed #cacaca;
-}
-
-.wrapper .mask{
- position: absolute;
- top:0;
- left:0;
- width: 384px;
- height: 240px;
- opacity: 0.15;
- background: #444;
-}
-
-.wrapper li.big, li.big a{
- width: 424px;
-}
-
-.wrapper li.big img{
- width: 424px;
- height: 264px;
-}
\ No newline at end of file
diff --git a/Accordions/html.html b/Accordions/html.html
deleted file mode 100644
index 3093079..0000000
--- a/Accordions/html.html
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
-
- Title
-
-
-
-
-
-
-
\ No newline at end of file
diff --git "a/Accordions/img/\345\260\217\346\232\221.jpg" "b/Accordions/img/\345\260\217\346\232\221.jpg"
deleted file mode 100644
index dd25aac..0000000
Binary files "a/Accordions/img/\345\260\217\346\232\221.jpg" and /dev/null differ
diff --git "a/Accordions/img/\345\260\217\351\233\252.jpg" "b/Accordions/img/\345\260\217\351\233\252.jpg"
deleted file mode 100644
index 7ebb7e1..0000000
Binary files "a/Accordions/img/\345\260\217\351\233\252.jpg" and /dev/null differ
diff --git "a/Accordions/img/\346\270\205\346\230\216.jpg" "b/Accordions/img/\346\270\205\346\230\216.jpg"
deleted file mode 100644
index a9ea3cf..0000000
Binary files "a/Accordions/img/\346\270\205\346\230\216.jpg" and /dev/null differ
diff --git "a/Accordions/img/\350\212\222\347\247\215.jpg" "b/Accordions/img/\350\212\222\347\247\215.jpg"
deleted file mode 100644
index 6e8d2fc..0000000
Binary files "a/Accordions/img/\350\212\222\347\247\215.jpg" and /dev/null differ
diff --git "a/Accordions/img/\351\233\250\346\260\264.jpg" "b/Accordions/img/\351\233\250\346\260\264.jpg"
deleted file mode 100644
index ff46f97..0000000
Binary files "a/Accordions/img/\351\233\250\346\260\264.jpg" and /dev/null differ
diff --git a/Accordions/js/main.js b/Accordions/js/main.js
deleted file mode 100644
index 9c99592..0000000
--- a/Accordions/js/main.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/**
- * Created by Jonathan Zhang on 2017/5/24.
- */
diff --git a/Canvaspointcolor/.idea/color.iml b/Canvaspointcolor/.idea/color.iml
deleted file mode 100644
index 24643cc..0000000
--- a/Canvaspointcolor/.idea/color.iml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Canvaspointcolor/.idea/dictionaries/Jonathan_Zhang.xml b/Canvaspointcolor/.idea/dictionaries/Jonathan_Zhang.xml
deleted file mode 100644
index 13fba25..0000000
--- a/Canvaspointcolor/.idea/dictionaries/Jonathan_Zhang.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/Canvaspointcolor/.idea/jsLibraryMappings.xml b/Canvaspointcolor/.idea/jsLibraryMappings.xml
deleted file mode 100644
index d23208f..0000000
--- a/Canvaspointcolor/.idea/jsLibraryMappings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Canvaspointcolor/.idea/misc.xml b/Canvaspointcolor/.idea/misc.xml
deleted file mode 100644
index 9f7e87c..0000000
--- a/Canvaspointcolor/.idea/misc.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
- false
-
- false
- false
-
-
-
-
-
-
-
-
-
-
-
- AngularJS
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Canvaspointcolor/.idea/modules.xml b/Canvaspointcolor/.idea/modules.xml
deleted file mode 100644
index bdb39ec..0000000
--- a/Canvaspointcolor/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Canvaspointcolor/.idea/workspace.xml b/Canvaspointcolor/.idea/workspace.xml
deleted file mode 100644
index f705416..0000000
--- a/Canvaspointcolor/.idea/workspace.xml
+++ /dev/null
@@ -1,301 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- true
- DEFINITION_ORDER
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- project
-
-
- true
-
-
-
- DIRECTORY
-
- false
-
-
-
-
-
-
-
-
-
- 1495802611201
-
-
- 1495802611201
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Canvaspointcolor/index.html b/Canvaspointcolor/index.html
deleted file mode 100644
index dbf3002..0000000
--- a/Canvaspointcolor/index.html
+++ /dev/null
@@ -1,111 +0,0 @@
-
-
-
-
- Title
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Canvaspointcolor/node_modules/jquery/AUTHORS.txt b/Canvaspointcolor/node_modules/jquery/AUTHORS.txt
deleted file mode 100644
index c32c25f..0000000
--- a/Canvaspointcolor/node_modules/jquery/AUTHORS.txt
+++ /dev/null
@@ -1,301 +0,0 @@
-Authors ordered by first contribution.
-
-John Resig
-Gilles van den Hoven
-Michael Geary
-Stefan Petre
-Yehuda Katz
-Corey Jewett
-Klaus Hartl
-Franck Marcia
-Jörn Zaefferer
-Paul Bakaus
-Brandon Aaron
-Mike Alsup
-Dave Methvin
-Ed Engelhardt
-Sean Catchpole
-Paul Mclanahan
-David Serduke
-Richard D. Worth
-Scott González
-Ariel Flesler
-Jon Evans
-TJ Holowaychuk
-Michael Bensoussan
-Robert Katić
-Louis-Rémi Babé
-Earle Castledine
-Damian Janowski
-Rich Dougherty
-Kim Dalsgaard
-Andrea Giammarchi
-Mark Gibson
-Karl Swedberg
-Justin Meyer
-Ben Alman
-James Padolsey
-David Petersen
-Batiste Bieler
-Alexander Farkas
-Rick Waldron
-Filipe Fortes
-Neeraj Singh
-Paul Irish
-Iraê Carvalho
-Matt Curry
-Michael Monteleone
-Noah Sloan
-Tom Viner
-Douglas Neiner
-Adam J. Sontag
-Dave Reed
-Ralph Whitbeck
-Carl Fürstenberg
-Jacob Wright
-J. Ryan Stinnett
-unknown
-temp01
-Heungsub Lee
-Colin Snover
-Ryan W Tenney
-Pinhook
-Ron Otten
-Jephte Clain
-Anton Matzneller
-Alex Sexton
-Dan Heberden
-Henri Wiechers
-Russell Holbrook
-Julian Aubourg
-Gianni Alessandro Chiappetta
-Scott Jehl
-James Burke
-Jonas Pfenniger
-Xavi Ramirez
-Jared Grippe
-Sylvester Keil
-Brandon Sterne
-Mathias Bynens
-Timmy Willison <4timmywil@gmail.com>
-Corey Frang
-Digitalxero
-Anton Kovalyov
-David Murdoch
-Josh Varner
-Charles McNulty
-Jordan Boesch
-Jess Thrysoee
-Michael Murray
-Lee Carpenter
-Alexis Abril
-Rob Morgan
-John Firebaugh
-Sam Bisbee
-Gilmore Davidson
-Brian Brennan
-Xavier Montillet
-Daniel Pihlstrom
-Sahab Yazdani
-avaly
-Scott Hughes
-Mike Sherov
-Greg Hazel
-Schalk Neethling
-Denis Knauf
-Timo Tijhof
-Steen Nielsen
-Anton Ryzhov
-Shi Chuan
-Berker Peksag
-Toby Brain
-Matt Mueller
-Justin
-Daniel Herman
-Oleg Gaidarenko
-Richard Gibson
-Rafaël Blais Masson
-cmc3cn <59194618@qq.com>
-Joe Presbrey
-Sindre Sorhus
-Arne de Bree
-Vladislav Zarakovsky
-Andrew E Monat
-Oskari
-Joao Henrique de Andrade Bruni
-tsinha
-Matt Farmer
-Trey Hunner
-Jason Moon
-Jeffery To
-Kris Borchers
-Vladimir Zhuravlev
-Jacob Thornton
-Chad Killingsworth
-Nowres Rafid
-David Benjamin
-Uri Gilad
-Chris Faulkner
-Elijah Manor
-Daniel Chatfield
-Nikita Govorov
-Wesley Walser
-Mike Pennisi
-Markus Staab
-Dave Riddle
-Callum Macrae
-Benjamin Truyman
-James Huston
-Erick Ruiz de Chávez
-David Bonner
-Akintayo Akinwunmi
-MORGAN
-Ismail Khair
-Carl Danley
-Mike Petrovich
-Greg Lavallee
-Daniel Gálvez
-Sai Lung Wong
-Tom H Fuertes
-Roland Eckl
-Jay Merrifield
-Allen J Schmidt Jr
-Jonathan Sampson
-Marcel Greter
-Matthias Jäggli
-David Fox
-Yiming He
-Devin Cooper
-Paul Ramos
-Rod Vagg
-Bennett Sorbo
-Sebastian Burkhard
-Zachary Adam Kaplan
-nanto_vi
-nanto
-Danil Somsikov
-Ryunosuke SATO
-Jean Boussier
-Adam Coulombe
-Andrew Plummer
-Mark Raddatz
-Isaac Z. Schlueter
-Karl Sieburg
-Pascal Borreli
-Nguyen Phuc Lam
-Dmitry Gusev
-Michał Gołębiowski
-Li Xudong
-Steven Benner
-Tom H Fuertes
-Renato Oliveira dos Santos
-ros3cin
-Jason Bedard
-Kyle Robinson Young
-Chris Talkington
-Eddie Monge
-Terry Jones
-Jason Merino
-Jeremy Dunck
-Chris Price
-Guy Bedford
-Amey Sakhadeo
-Mike Sidorov
-Anthony Ryan
-Dominik D. Geyer
-George Kats
-Lihan Li
-Ronny Springer
-Chris Antaki
-Marian Sollmann
-njhamann
-Ilya Kantor
-David Hong
-John Paul
-Jakob Stoeck
-Christopher Jones
-Forbes Lindesay
-S. Andrew Sheppard
-Leonardo Balter
-Roman Reiß
-Benjy Cui
-Rodrigo Rosenfeld Rosas
-John Hoven
-Philip Jägenstedt
-Christian Kosmowski
-Liang Peng
-TJ VanToll
-Senya Pugach
-Aurelio De Rosa
-Nazar Mokrynskyi
-Amit Merchant
-Jason Bedard
-Arthur Verschaeve
-Dan Hart
-Bin Xin
-David Corbacho
-Veaceslav Grimalschi
-Daniel Husar
-Frederic Hemberger
-Ben Toews
-Aditya Raghavan
-Victor Homyakov
-Shivaji Varma
-Nicolas HENRY
-Anne-Gaelle Colom
-George Mauer
-Leonardo Braga
-Stephen Edgar
-Thomas Tortorini
-Winston Howes
-Jon Hester
-Alexander O'Mara
-Bastian Buchholz
-Arthur Stolyar
-Calvin Metcalf
-Mu Haibao