啦啦啦啦啦啦啦啦绿绿绿绿绿绿

 1 1.JavaScript:
 2        前段三大语言:HTML CSS js
 3     HTML:专门编写网页内容的语言
 4     CSS:专门编写网页样式的语言
 5     js:专门编写网页交互行为的语言
 6   原生js:不需要下载任何第三方文件就可以直接使用的js
 7     ECMAScript(ES):ECMA制定的JavaScript语言国际标准规定js语言的核心语法
 8     JavaScript:NetScape遵照ES标准实现的自己的js语言
 9     JScript:Microsoft遵照ES……
10         DOM:专门操作网页内容的程序标准
11     BOM:专门操作浏览器窗口的程序
12    js语言四大特点:
13     1.运行在脚本解释引擎中:脚本解释引擎:专门解析js语言并执行的小软件
14          1.浏览器自带脚本解释引擎:内容排版引擎和脚本解释引擎
15      2.独立安装的脚本解释引擎:Node.js
16     2.边解释边执行,后解释的相同内容会覆盖先解释的
17     3.弱类型:
18        声明变量时,不必提前规定变量的数据类型,一个变量先后可保存不同类型的数据
19     4.基于对象:core

1.使用

1         1. 页面中的script标签里:
2              一旦进入script标签内,就要使用js的语法
3             问题: 不符合内容与行为分离的原则——不便于维护和共用
4         2. 独立的js文件中:
5             引入: <script src="js文件的url"></script>
6           强调: script标签不同同时引入外部js和包含内部js。结果: 内部js自动失效

  2.变量

 1 var 变量1,变量2,...;;
 2       强调: 一切变量都用var声明,不必提前规定数据类型。
 3          默认值: 变量的默认值为undefined
 4       命名规则:
 5        1. 字母,数字或下划线组成,不能以数字开头
 6        2. 不能使用保留字: js语言已经提前占用的有特殊意义的名字
 7        3. 见名知义
 8        4. 驼峰命名: 首字母小写,之后每个单词首字母大写
 9
10         强调: 变量赋值前,必须先声明
11     特殊: 给为声明过的变量赋值
12     特殊: 试图从未声明过的变量中取值,会报错!
13     声明: const 常量名=值;
14     强调: 声明常量时,必须初始化其值常量名通常全大写
15     赋值: 常量不允许赋值
16     普通模式: 强行赋值,不报错,但也无法修改
17         ——静默失败
18     ES5 严格模式: 将所有静默失败升级为错误!

3.***数据变量:

 1       1. 原始类型: 值直接保存在变量本地的数据类型
 2              number  string   boolean   null    undefined
 3       2. 引用类型: 值无法直接保存在变量本地的复杂数据类型
 4           功能: typeof x 返回变量x中存储的数据的类型名
 5      number类型:其类型的数字在内存中采用二进制存储    1字节=8位二进制
 6           功能:n.toString(2) 将n的数值转为内存中的二进制形式(整数4字节 浮点数8字节)
 7           特殊:舍入误差(底层二进制计算导致)->四舍五入n.toFixed(2)n按2位小数四舍五入
 8      string类型:c.charCodeAt();查看C中的Unicode号
 9      boolean类型:只有两个值的类型: true/false
10      undefined: 空 由程序自动使用,给变量赋初值。
11      null: 空 让程序员主动清空一个变量的值

 4. ***数据类型转换:  

 1    弱类型:
 2         1. 声明变量时,不用提前指定变量的数据类型
 3         2. 同一个变量先后可保存不同类型的数据
 4         3. js会根据自己的需要,动态转变数据的类型
 5    1. 隐式转化: 由程序自动完成,不需要程序员手动干预的类型转化
 6       只要所给的数据类型,不是程序想要的,程序自动将给定的数据转化为自己想要的类型
 7    2. 强制转换: 由程序员主动调用功能,执行的类型转换
 8       1. 强制转数字:
 9             1. Number(x): 可将任意类型的数据,转化为number类型。
10               问题: 只能转纯数字组成的字符串和bool
11             2. parseFloat(str): 将str转化为数字,保留小数。
12                      特殊功能: 可去掉数字*结尾*非数字字符。
13               parseInt(str): 将str转化为数字,去掉小数部分,下取整。
14               强调: parseFloat/Int的参数,要求是字符串。
15                  如果给定的不是字符串,则首先隐式转为字符串,再转为数字。
16              比如: Number(true) -> 1   parseInt(true) -> NaN  "true"->NaN
17         总结: 只要转字符串,都用parseFloat
18               除非去掉小数,才用parseInt
19               Number(x),几乎不会主动使用
20               因为隐式转换使用的其实就是Number
21          如果转不了: 都返回NaN(NaN: Not a Number)
22          代表一切不是数字的值NaN参与任何算数计算,结果依然是NaN
23          补: 转二进制: n.toString(2) 10->2
24                  parseInt(str,2) 2->10
25       2. 转字符串: 2种:
26            x.toString() 将任意内容,转为字符串除null和undefined之外
27            String(x)   将任意内容,转为字符串——万能
28         总结: 今后,凡是转字符串,首选String(x)
29       3. 转bool: Boolean(x);
30            规律: 只有5个值会转为false: 0  ""  null  undefined  NaN
31            其余都转为true!

   5. ***运算符:

 1  1.算数运算: + - * / %
 2     m%n:模运算-->1.判断能否整除  2.用来取余数
 3     隐式转换:
 4      默认: 一切都转为number,再计算
 5      特殊: +运算中,如果碰到字符串,则一切都转字符串,+计算变为字符串拼接
 6  2.关系运算: 做比较,做判断( 6种: > < >= <= == != 7     隐式转换:
 8      默认: 一切都转数字,再比较
 9      特殊:
10        1. 如果两个字符串比较: 不再转数字,而是依次比较每个字符的unicode号大小
11        2. null和undefined:
12       如何鉴别: null vs undefined
13            ===: 全等: 首先要求类型必须相同 ,其次值再相等
14            !==: 其实就是全等的反义,可代替!=
15                 强调: 只要比较undefined必须用===,其实===就是不带隐式转换的==
16                 建议: 用===代替==
17        3. NaN不大于,不小于,不等于任何值
18        isNaN(num)
19            num不是数字或无法转为数字,则返回true
20            num是数字或可隐式转为数字,则返回false
21    3.逻辑运算: 将多个关系运算综合得出最终结论
22          短路逻辑: 如果前一个条件已经可以得出最终结论,则后续条件不再执行
23            &&: 如果前一个条件为true,则后续条件继续执行
24                如果前一个条件为false,则后续条件不再执行,直接返回false!
25            ||: 如果前一个条件为true,则后续条件不再执行,  直接返回true
26                如果前一个条件为false,则后续条件继续执行
27    4.位运算: 了解
28     1.左移右移
29        m<<n :等效于: m*Math.pow(2,n) ,
30        m>>n : 等效于m/Math.pow(2,n)
31     2.下取整:
32         m^0
33         m|0
34        等效于Math.floor(m)
35     3. 交换两变量的值: 3种:
36         1. var t=a; a=b; b=t; 通常鄙视不让用!(不允许声明第三个变量)
37         2. a+=b; b=a-b; a-=b;
38         3. a^=b; b^=a; a^=b; 最简单
39    5.扩展赋值运算: 对计算+赋值的一种简写
40      a=a+b; 可简化为 a+=b 称为累加
41        a=a-b; 可简化为 a-=b
42        a=a*b; 可简化为 a*=b
43        a=a/b; 可简化为 a/=b
44        a=a%b; 可简化为 a%=b

 6.***数组API:

 1  API: 应用程序编程接口(数组: 连续存储多个数据的存储空间——存储
 2                               并提供了操作数据的API——功能)
 3     1.转字符串: 2种:
 4       String(arr): 将每个元素转为字符串,并用逗号连接
 5                何时: 只关心内容,不关心格式——拍照,对比
 6       arr.join(“自定义连接符”): 将每个元素转为字符串,但是,可自定义连接符
 7                何时: 如果要求带格式的转化
 8                比如: 将单词拼接为句子: words.join("")
 9                     将字母拼接为单词: 错误: chars.join()  =>String(chars)
10                                     正确: chars.join("")
11                     将数组内容动态生成页面元素
12             判断数组是空数组:
13                  错误: arr.length==0 因为还有new Array(n)这种仅规定个数的空数组
14                  正确: arr.join("")===””
15
16     2.拼接和选取:
17      *拼接: 将其它元素或其它数组,和当前数组拼接为一个新数组
18         如何: var newArr=arr.concat(值1,值2,...,arr2,…)
19         强调:
20        1.concat无法修改原数组,只能返回新数组。
21             要想获得拼接后的新值,必须用变量接住新数组
22        2.会自动打散数组参数为单个元素,再拼接
23      *选取: 复制出数组中指定开始到结束位置之间的元素,组成新数组
24         如何: var subArr=arr.slice(starti,endi+1);
25           复制出arr中starti位置到endi为止的所有元素,组成新数组。
26         强调: 1. 如果两个参数都是下标,则含头不含尾,结束为止总要+1
27             2. 不修改原数组,仅复制出原数组的元素,组成新数组返回。
28        简写:
29           1.省略第二个参数: arr.slice(starti)表示一直选取到结尾
30          2.支持负数下标: 表示倒数第n个元素
31           原本: arr.length-n可简写为: -n  ,其实,是slice自动用length-n
32         3.省略第一个参数: arr.slice() 复制整个数组
33
34     3.修改数组: 删除,插入,替换 —— splice
35      *删除: arr.splice(starti,n) 删除arr中,starti位置开始的n个元素。
36         其实, splice有返回值: 返回被删除的元素,组成的临时子数组
37            因为,程序中删除的东西,可能还有别的用途
38         如何: var deletes=arr.splice(starti,n);
39         强调: 1. 直接修改原数组
40               2. 不用考虑含头部含尾
41         简写: 1. 省略第二个参数,表示到结尾
42               2. 支持负数参数
43      *插入: arr.splice(starti,0,值1,值2,…)
44          在starti位置,插入值1,值2,…,原starti位置的被向后顺移
45         强调: 不支持打散数组类型参数
46           vs concat() 不同:
47           1.Concat不修改原数组,返回新数组
48             Splice 直接修改原数组
49           2.Concat可打散数组参数为单个元素
50             Splice 不支持打散数组参数,而是住套间
51           3.Concat只能在结尾添加
52             Splice 可在任意位置插入
53      *替换: arr.splice(starti,n,值1,值2,….)其实就是先删除,再插入
54           强调: 1. 删除的个数和插入的个数不必一致,因为,数组不限制元素个数。
55
56      *翻转: arr.reverse();

   7.***排序:

 1   鄙视: 3大排序算法: 冒泡,插入,快速
 2      冒泡:
 3         数组排序API: arr.sort();
 4     原理: 将每个元素都转为字符串,按字符串比较大小
 5     问题: 只能按字符串排序。无法按数字排序。
 6     解决: 自定义比较器函数:
 7         专门比较任意两数大小的函数
 8         要求: 2个参数: a,b
 9            返回值: 如果a>b,就返回正数
10                        a<b,就返回负数
11                        a==b,就返回0
12            函数体: return a-b
13         何时: 只要希望按数字排序时,必须自定义比较器函数
14       如何定义: function cmp(a,b){return a-b}
15       如何使用: 将比较器函数作为参数传给sort函数
16     arr.sort(cmp)
17     强调: cmp后不要加(),因为不是立刻执行,而是传入sort函数内,被sort函数反复调用。
18       降序排列:
19     只要颠倒比较器函数的返回值的正负即可
20        比如: function cmp(a,b){return b-a}

 8.***栈和队列:

 1  Js中没有专门的栈和队列类型。都是用数组模拟的。
 2       只不过,控制了使用数组元素的顺序。
 3      何时: 只要希望按照特定的顺序使用数组元素时
 4
 5     栈(stack): 一端封闭,只能从另一端进出的数组
 6       特点: FILO
 7       如何:
 8       结尾出入栈:
 9            入栈: arr.push(值)  已入栈的元素下标不改变
10            出栈: var last=arr.pop()
11       开头出入栈:
12            入栈: arr.unshift(值) 已入栈元素的位置    往后顺延
13           强调: 开头入栈的结果和结尾入栈的结果是首尾颠倒的
14         出栈: var first=arr.shift();
15
16     队列(queue): 只能从一端进入,从另一端出的数组
17       特点: FIFO
18       何时: 只要按照先来后到的顺序使用数组元素时
19       如何: 结尾入: arr.push()
20            开头出:var first= arr.shift()

9.*** 二维数组: 

 1   什么是: 数组中的元素,又引用另一个子数组
 2      何时: 2种:
 3         要保存的数据,就是横行竖列的二维数据
 4         要对数组中保存的内容,进行更细致的分类时(保存上下级关系的数据)
 5      如何:
 6       创建: 2种:
 7       先创建空数组,再添加子数组
 8       创建数组同时,初始化子数组
 9       访问: 数组[r][c]
10         二维数组中每个元素的用法和一维数组中每个元素的用法,以及单个变量的用法完全相同。
11           强调: 二维数组中行下标r不能越界列下标c 可以
12       遍历: 外层循环控制行,内层循环控制列
13        for(var r=0;r<arr.length;r++){
14          for(var c=0;c<arr[r].length;c++){
15             arr[r][c] //当前元素
16          }
17        }
18         arr.index(值):在arr中找“值”的位置,如果找到返回下标i,否则返回-1
19 *******
20   1.Length属性:
21       数组是对象:分装了一组数据,并提供了对数据操作方法
22      .length属性:获得数组中的元素个数!=实际中的元素个数
23      何时使用:
24          arr[arr.length-1]: 任意长度数组中的最后一个元素
25          arr[arr.length]:向数组末尾追加一个新元素
26          改小length的值,可删除末尾元素
27   2.关联数组:可以自己定义下标名称的数组
28         如何创建关联数组:
29            Var fbb=[];
30                    Key       value—>对儿
31             fbb[“sname”]=”范冰冰”;
32             fbb[“shx”]=91;
33         如何访问关联数组:fbb[“sname”]
34         关联数组中的length属性失效!
35       关联(hash)数组:下标是不能重复
36            优势:利用hash算法,精确定位某个下标的位置,不用遍历
37       索应数组:下标自动分配,无意义,要按内容查找只能从头开始遍历
38       遍历关联数组:
39       For(var key in arr){
40           Key,仅得到当前元素的下标
41            arr[key],得到当前元素的值!
42       }
43
44   3.数组API
45     1.arr to String:
46       var str=arr.toString()?自动,逗号分离
47       var str=arr.join(“连接符”)—>自定义连接符
48          固定套路:1.将字符拼接为单词:arr.join(“”)
49               2.将单词拼接为句子:arr.join(“ “)
50      *优化:
51         问题:频繁字符窜拼接造成内存浪费*
52         解决:先将要拼接的字符串放入数组 最后,arr.join(“”)
53         过程:Var arr=[“a”];  54               arr[arr.length]=”b”;  arr[arr.length]=”c”;
55               1个arr 2个str    1个arr 3个str
56                    [“a”,”b”,”c”]      arr.join(“”);
57              Var str=“a”;     a
58              str+=”b”;//3个    ab   b
59              str+=”c”;//5个      abc   c
60     2. 拼接和截取:原对象保持不变
61        Var newArr=arr.concat(新值1,另一个数组,新值2…)
62        Var subArr=arr.slice(starti[,endi+1]);
63          第二个参数可省略,若省略表示从start一直取到结尾
64          两个参数都可以取负值,就近使用下标 含头不含尾
65     3.arr.splice():删除 插入 替换
66     4.arr.reverse();
67     5.专门比较两数字的大小
68         Function compareNum(a,b){return a-b;}
69           专门比较两字符串的大小
70         Function compareStr(a,b){
71           if(a>b) { return 1; }
72             else if(a=b){return 0;}
73             else if(a<b){return -1}
74         }
75         Function compareStr(a,b){return a>b?1:a<b?-1:0;}
76           Bubble(nums,compareNum);console.log(nums);
77           Bubble(emps,compareStr); console.log(emps);
 1  ***函数对象作为参数
 2          Js中函数本质是一个对象
 3          函数名本质是指向函数对象的变量
 4     自定义sort方法的排序   arr.sort(比较器函数)
 5  ***String:字符串:多个字符组成的一个只读的集合(数组)
 6      凡是数组对象中,不修改原对象的API,字符串都能用!
 7        比如:slice indexof
 8        反例:push  sort  splice
 9  内置对象(javacsript)ES标准中已经定义好的,由浏览器厂商已经实现的对象
10       11个:String Number Boolean
11          /Array Date Math RegExp
12          /Error
13          /Function Object
14          /Globel(全局Window)
15
16  ***包装类型:临时封装原始类型数据,提供对原始类型数据的操作方法
17     3种:String Number Boolean(不能new)
18     函数调用完,包装类型自动释放
19       原理:
20          1. 尝试对原始类型的值调用功能时, 引擎会判断值的类型,
21             然后创建对应类型的包装类型对象。
22          2. 包装类型对象中封装要操作的值,并提供各种API
23          3. 用值调用功能其实是调用包装类型的功能
24          4. 功能执行完,包装类型对象自动释放
25     比如: var n=345.678; n.toFixed(2)
26                 //new Number(n).toFixed(2)
27          var char=”张”; char.charCodeAt()
28                 //new String(char).charCodeAt()

10.****String API:

 1     1.大小写转换: 将字符串中的字母统一转为大写或小写
 2        何时: 不区分大小写时
 3        比如: 用户名,验证码,邮箱地址
 4        如何: str.toUpperCase() 转大写
 5              str.toLowerCase() 转小写
 6     2.获得指定位置的字符: 3种
 7           2.str.charAt(i) => str[i]
 8           1. str[i] 倒数第二个:str[str.length-2]
 9           3.获得指定位置的字符的unicode号: str.charCodeAt(i)
10           4.将unicode号再转回原文: String.fromCharCode(unicode)
11     3.查找关键字的位置:2种:
12         1.Var i=str.indexOf(“kword”[,starti]);
13         2.Var i=str.lastIndexOf(“kword”[,starti]);查找starti左侧第一次出现关键字位置
14                Starti默认等于0
15
16        ***截取子字符串:
17       1.str.slice(starti,endi+1)   eg: pid.slice(6,-5+1);
18       2.str.substring(starti,endi+1) 同slice,
19     仅不支持负数参数eg: pid.substring(6,pid.length-5+1);
20       如果知道个数: str.substr(starti,n)
21
22        ***检索关键词:
23      1. 检索一个固定的关键词出现的位置:
24          var i=str.indexOf(“关键词”,fromi)
25       查找str中fromi位置之后的下一个关键词的位置
26             fromi: 指开始查找的位置
27              如果省略,默认从头开始找
28           返回值: 如果找到,返回关键词第一个字的下标位置
29                   如果找不到了,返回-1
30           问题: 每次只找一个关键词的位置
31                 无法自动找下一个
32           解决: 循环调用indexOf
33                 每次都要显式指定开始查找位置为本次找到位置的下一个
34                 直到返回-1就退出循环
35
36           查找最后一个关键词的位置:
37              var i=str.lastIndexOf(“关键词”);
38           查找str中最后一个“关键词”的位置
39           问题: 只能查找一个固定的关键词
40                 关键词稍微变化,就找不到
41           解决: 正则表达式
42     2.判断是否包含符合规则的关键词——支持正则
43        var i=str.search(/正则/)
44       查找str中第一个符合正则要求的关键词的位置
45        如果找不到,返回-1
46      问题1: 所有正则默认区分大小写
47      解决: 只要在第二个/后加i,表示ignore
48      问题2: 没有第二个参数, 永远只能找第一个
49      问题3: 只能返回位置,无法返回关键词的内容
50      解决: match
51     3.查找所有关键词的内容或个数:
52        var kwords=str.match(/正则/ig);
53      在str中查找所有符合正则要求的关键词
54      返回值: 所有关键词组成的数组
55                如果没找到,返回null!
56      问题: 所有正则默认只匹配第一个符合条件的关键词
57      解决: 在第二个/后加g, 表示global
58      问题: 只能返回内容,无法返回位置!
59     4.即查找每个关键词的内容,又查找每个关键词的位置: ?
60
61          替换: 将字符串中找到的所有关键词,替换为指定的新内容
62          包含2种:
63            简单替换: 将所有关键词替换为统一的新值
64           str=str.replace(/正则/ig,”新值”)
65         强调: 字符串是只读数组,所有,所有API都无权直接修改原字符串,只能返回新字符串
66             高级替换: 根据本次找到的关键词不同,动态选择不同的替换值.
67           str=str.replace(/正则/ig,function(kword){
68                 kword //可自动获得本次找到的关键词
69                    return 根据kword的不同,动态选择不同替换值
70                 })
71           删除: 将关键词替换为””
72
73           切割: 将字符串按指定切割符,切成多段子字符串
74             简单切割: 切割符时固定的
75                var substrs=str.split(“切割符”)
76             复杂切割: 切割符不固定
77                var substrs=str.split(/正则/)
78             固定套路: 将字符串打散为字符数组: str.split(“”)  

 11.***正则表达式:

 1 验证字符串格式
 2     使用规则模糊查找多种关键词
 3     如何:
 4       1.最简单的正则表达式,就是关键词本身
 5       2.字符集:
 6         什么是: 规定一位字符备选字符列表的集合
 7            何时: 只要一位字符上有多种备选字时
 8            如何:[备选字符列表]
 9             强调: 1. []不能随便加逗号和空格
10                  2. 一个[]字符集只能限定一位字符的备选范围
11         简写: 当备选字符中部分字符是连续的,可用-省略中间字符:
12           比如: 一位数字[0-9]
13                 一位小写字母[a-z]
14                 一位大写字母[A-Z]
15                 一位字母[A-Za-z]
16                 一位汉字[\u4e00-\u9fa5]
17         反选: 选择除了xxx都行: [^xxx]
18       3.预定义字符集:
19         什么是: 对常用字符集的最简化写法
20            包括: 4个:
21                  \d  一位数字, 代替[0-9]
22                  \w  一位字母,数字或_, 代替[A-Za-z0-9_]
23                  \s  一位空字符: 空格,Tab,… …
24                  .   一位任意字符(除了换行)——通配符
25             \D,\W,\s-?除了\d,\w或\s--?了解
26                  强调: 必须规则和预定义字符集的规则完全匹配时,才能使用预定义字符集。
27                 问题: 字符集只能规定一位字符的备选内容无法灵活规定出现次数
28         解决: 量词:
29       4.量词: {min,max}灵活定义一位字符集出现次数的规则
30          何时: 只要规定字符集出现次数
31          如何: 2大类:
32         1.有明确数量边界的:3个
33             字符集{m,n} 至少m次,最多n次
34                   字符集{m,}  至少m次,多了不限
35                   字符集{m}  必须m次
36         2.没有明确数量边界:3个
37             字符集?  可有可无,最多一次{0.1}
38                   字符集*  可有可无,多了不限{0,}
39                   字符集+  至少一次,多了不限{1,}
40           强调: 默认一个量词仅修饰相邻的前一个字符集
41       5.选择和分组:
42         分组: 将多个子规则用()包裹为一组
43         为什么: 默认一个量词只能修饰一个字符集
44         何时: 只要希望一个量词同时修饰多个字符集时
45          选择: “规则1|规则2”  |读作或
46               类似于程序中的或者
47                     只要匹配任意一个规则即可
48                例:身份证: 1,2,3代 15位数字  2位数字
49         最后一个可能是数字或Xx后三位整体可有可无,最多1次
50                   \d{15}     (\d{2}     [0-9Xx])?
51               例:手机号: +86或0086  整体可有可无,最多一次
52                   (\+86|0086)?
53              空字符      可有可无,多了不限
54                    \s*
55                         1
56              3,4,5,7,8中挑一个
57               [34578]
58             9位数字
59               \d{9}
60             (\+86|0086)? \s*1[34578] \d{9}
61       6.指定匹配位置: 3个位置
62            ^开始位置, 第一个字符之前
63           $结束位置, 最后一个字符之后
64           何时: 只要仅匹配特定位置的值时
65          比如: 匹配空字符:
66               ^\s+ 字符串开头的空字符
67               \s+$ 字符串结尾的空字符
68               ^\s+|\s+$匹配开头或结尾的空字符
69               \b 专指单词边界:
70                 ^ $ 空格 标点符号
71                     专门选择一个单词之用

  12.**RegExp

 1 什么是: 封装一条正则表达式,并提供使用正则表达式执行验证和查找的API
 2      何时: 2种:
 3         1.验证格式
 4         2.实现最高级的查找
 5     如何:
 6       创建: 2种:
 7         1.使用直接量: var reg=/正则/ig;
 8         何时: 如果正则表达式是固定,无需动态拼接生成
 9         因为//之中不支持js表达式
10         字符冲突: //之间出现特殊符号: + /等等,都要转义为\+ \/
11         2.用new: var reg=new RegExp(“\n \t正则”,”ig”);
12         何时: 如果正则表达式需要动态拼接生成(所有\都要改为\\)
13              字符冲突: \\ 或 “ 都要转义为\\  \”
14         正则API: 2个:
15         1.验证格式: var bool=reg.test(str)
16         验证:str是否符合reg的正则规则(要求从头到尾必须完全匹配)
17                 符合返回true,不符合返回false
18               问题:(test方法默认只要找到部分匹配,就算验证通过。
19               解决: 凡是验证必须前加^后加$
20                   ^表示开头位置的xxxx,$表示结尾位置的xxxx
21                    ^和$联用表示从头到尾必须完整匹配
22
23     密码强度要求:6-8位,只能是字母、数字的组合
24         至少包含一位大写字母至少包含一位数字
25           预判(?):1.不全由小写字母或数字组成,可能包含大写或符号
26                (?! [a-z0-9]*$)
27         2. 不全由大写或小写字母组成,可能包含数字或符号
28         (?![a-zA-Z]*$)
29     正式规则:只能是字母数字的组合—>屏蔽了符号
30                [a-zA-Z0-9]{6}
31     补齐第四种查找关键词的方式:(即查找内容,又查找位置:)
32         var arr=reg.exec(str)
33           在str中查找下一个符合reg规则的关键词的内容和位置.
34           强调: 每次只找一个
35           返回值:
36         如果找到:arr:[0: 关键词内容, index: 关键词位置]
37         没找到: 返回null
38           如何查找所有:
39         仅循环调用即可!直到返回null为止
40              不用指定开始查找位置,就可自动找下一个
41
42     总结:查找关键字:
43         1.var i=str.search(reg)?判断有没有
44         缺点:不能指定开始位置
45         2.var arr=str.match(reg)?获得所有关键字内容,个数
46           缺点:不能返回位置
47         3.var i=str.indexOf(“kword”[,starti])?从指定位置开始,查找下一个关键字的位置
48         缺点:不支持正则
49         4.var arr=reg.exec(str)?即获得内容,又获得位置
50           缺点:复杂
51
52      正则:贪婪模式与懒惰模式
53         默认贪婪模式:默认总是匹配最长的符合条件的字符串
54               原因:.*或.+等引起
55             懒惰模式:仅匹配最短的符合条件的字符串
56             贪婪-->懒惰:(.*?)
57         从正则表达式中获得子内容:2步
58         1.正则表达式:用()包括要获取子内容的部分
59         2.程序中,本次查找后:RegExp.$n-->n:第几个圆括号
60             取本次匹配结果中第N个()匹配的子内容,正则中n从1开始
 1  ***String中的模式匹配API:4个
 2     2个查找:str.search(reg);str.match(reg);
 3     1个替换:str.replace(reg);
 4     1个切割:
 5  1. ***String中的正则API:
 6     1.替换:str.replace(reg,"替换值")
 7     固定套路:利用replace格式化数据
 8     “替换值中,也可用$n,和RegExp.$n的用法完全相同
 9     2.切割:var arr=str.split(reg);
10
11  2.*Math  专门执行数学计算的对象
12     封装了数学计算中常用的常量
13       1.取整:3种:上取整 下取整 四舍五入取整
14     Math.ceil(n)   Math.floor(n)  Math.round(n)
15     对比:    round   VS  toFixed
16               Math对象      Number对象
17           只能取整        按任意小数位数(参数0~20之间)
18            返回数字        返回字符串
19       2.乘方、开平方:
20     乘方:Math.pow(n,m):计算n的m次方
21     开平方:Math.sqrt(n):计算n的平方根
22       3.获取最大值最小值:
23     getMax(a,b)
24     Math.max(a,b,c...)    Math.min(a,b,c...)
25      ***固定套路:变相实现获取数组中最大值
26     Math.max.apply(Math,arr);--》Math.max(arr[0],...)
27       4.随机数:Math.random();0<=n<1
28      任意min到max之间去一个随机整数
29     parseInt(Math.random()*(max-min+1)+min)
30
31   3.*Date:封装了一个时间点,提供对时间日期的操作API
32     创建Date对象:
33     1.var now=new Date();//创建一个新日期对象同时,保存了*客户端*当前时间点的毫秒数。--获得当前时间
34     2.var time=new Date("xxxx/xx/xx [xx:xx:xx]"35     3.var time new Date(年,月-1,日[,时,分,秒])
36     date.getTime():获得日期对象中的毫秒数
37
38      Date API
39     1.每个分量都有一对儿get set方法
40       getDay()获得星期,没有setDay
41     2.命名:年月日星期,不加s,时分秒毫秒,加s
42     3.返回值:月中的日取值范围从1开始到31结束
43        其余都是从0开始到减1结束
44      星期:日 一 二     六
45            0  1  2      6
46      月份:1月 2月    11月 12月
47            0   1      10   11
48      Date计算:2中
49     1.两日期对象可直接相减,结果毫秒差
50     2.对任意分量做加减:先get出来-》计算-》再set回去*直接修改原日期对象*
51       date.set(date.getXXX()+-n)
52
53     补:创建日期对象第四种:复制日期对象
54     var date1=new Date();
55     var date2=new Date(date1.getTime());
56           //new Date(毫秒数)
57     date2.setXXX(date2.getXXX()+-n)

1.*错误/异常处理

 1 what:导致程序无法继续执行的异常状态
 2          js中一旦发生错误,就会自动创建一个error类型对象
 3     6种:
 4         SyntaxError:语法错误
 5         ReferenceError:引用错误,找不到变量或对象
 6         TypeError:类型错误,错误的使用了对象中的方法时
 7         RangeErroe:范围错误,参数超范围
 8         EVA了Error:调用eval函数出错
 9         URLError:URL错误
10     错误处理:在程序发生错误时,保证程序不退出或正常退出
11     如何错误处理
12     语法:tryCatch:
13          try{
14            可能出错的代码段
15         }catch(err){//仅在发生错误时才执行
16          //一旦发生错err中就会自动存入Error对象
17           1.记录/显示错误的信息
18           2.继续向调用者抛出异常
19         }[finally{
20           无论对错一定都会执行的代码段
21             释放资源
22         }]
23         建议:尽量优先使用if…else语句代替tryCatch块,已知的
24     try catch:解决浏览器兼容问题

2.***Function 对象

 1 js中一切都是对象
 2             连函数也是对象
 3             函数名其实是引用函数定义
 4
 5 **************************************************************************
 6
 7     1.*arguments对象:
 8       重载:程序中可定义多个相同函数名,不同参数列表的函数调用者不必区分每个函数的参数,执行时,程序根据传入的参数个数,自动判断选择哪个函数执行。
 9
10     js语法不支持重载!但可用arguments对象模拟重载效果
11     arguments对象:函数对象内,自动创建的专门接收所有参数值的类数组对象。
12     arguments[i]:获得传入的下标为i的参数值
13     arguments.length:获得传入的参数个数
14
15     即使定义了参数变量,arguments对象同样会收到所有参数值
16
17     2.****函数对象本质:
18       1.创建函数对象:3种:
19           1.声明方式:function 函数名(参数){
20                 函数体;
21                 return 返回值}
22         函数名和函数定义都被提前
23         在调用前后位置定义都行
24          2.函数直接量:var 函数名=function(参数){
25                 函数体;
26                 return 返回值}
27         仅函数名变量声明会提前,函数定义留在本地
28         必须定义在调用前!
29         3.使用new创建函数类型对象:
30         var 函数名=new function("a","b",...,"函数体");
31       2.***内存中的函数对象***
32          创建函数对象时:同时创建2个对象:
33             函数对象:函数的定义
34             作用域链对象:保存了函数对象可用的变量位置
35                     默认第一项指向window对象
36           调用函数时:又会创建一个新对象:
37             活动对象:专门保存局部变量的对象
38             在作用域链对象中追加指向活动对象的引用
39           调用后:默认仅释放活动对象
40             作用域链对象中活动对象的引用出栈
41     3.***匿名函数:定义时,不能指定函数名的函数
42        何时使用:2大用途:
43         1.匿名函数自调时:定义完,立刻执行 执行完立刻释放
44           何时使用:只有确定函数只执行一次时!
45           如何自调:(function(参数){
46                函数体
47             })(参数值);
48         2.匿名函数回调:先将函数作为对象传递给另一个函数,
49             由另一个函数自主决定在需要时调用
50           何时使用:只要将一个函数对象传递给其他方法调用时
51           如何回调:直接将匿名函数的声明传入另一函数中
52     4.****闭包:
53        问题:局部变量的全局变量的缺陷
54          全局变量:容易全局污染
55          局部变量:无法共享不能长久保存
56
57        既可以共享,长久保存,又不会全局污染---闭包
58     解决:3步:闭包3特点:
59     1.定义外层函数:封装被保存的局部变量
60     2.定义内层函数,执行对外层函数局部变量的操作
61     3.外层函数返回内层函数的对象
62       并且外层函数被调用,结果被保存在全局变量中
63
64     何时使用:既反复使用局部变量,又避免全部污染--->闭包(保护局部变量,占内存)
65     判断闭包3特点:
66      1.嵌套函数
67      2.内层函数操作了外层函数的局部变量
68      3.外层函数将内层函数返回到外部,被全局变量保存住
69
70     判断闭包执行结果:
71      1.外层函数被调用几次,就有几个受保护的局部变量的副本
72      2.反复调用来自一个闭包的函数,受保护的局部变量就变化几次
 1 1.面向对象:
 2     在程序中都是用一个对象来描述现实中的一个具体的东西。
 3     对象:封装多个数据的存储空间
 4     自定义对象:封装现实中一个东西的属性和功能的存储空间。
 5     现实中东西的属性会成为对象中的属性变量
 6     现实中东西的功能,会成为对象中的方法(函数)
 7      1.创建自定义对象
 8     3种:
 9     1.var obj={'属性名1':值1,'属性名2':值2,'功能名':function(){...}}
10     js中一切都是对象!所有对象的底层都是hash数组
11
12     属性:2种:obj.属性名  obj["属性名"]
13     访问对象中不存在的属性
14     (访问数组中不存在的下标):不会出错,返回undefined强行给不存在的属性赋值,不报错!js会自动创建同名属性
15
16     如何判断某个对象是否包含指定成员:3种
17     1.obj.hasOwnProperty("成员名")
18         如果找到,返回true,否则返回false!
19
20     方法:如何在方法中,访问当前对象自己:
21     ****this关键字:运行时,指代正在*调用*方法的对象
22                    (.前的对象)
23         this本质是window下唯一的指针,指向当前正在调用方法的对象
 1 2.****继承
 2       面向对象三大特点:封装 继承 多态
 3         封装:将描述同一个东西的属性和方法,定义在一个对象中
 4         继承:父对象中的属性和方法,子对象可以直接使用
 5         多态:同一个对象,在不同情况下,呈现不同的状态
 6         重载:同一方法名,传入参数不同,执行不同的操作
 7         重写:子对象觉得父对象的成员不好用,可自己定义一个,覆盖子对象
 8       创建对象:3中:
 9     1.var obj={"属性名":值,
10             ……,
11             "方法名":function(){…this.属性…}
12            }
13     2.var obj=new Object();//创建一个空对象
14       obj.属性名=值;
15       obj.方法名=function(){…this.属性名…}
16
17     3.利用构造函数*反复*批量*创建相同结构的对象
18       构造函数:描述一类对象结构的特殊函数
19       2步:
20       1.定义构造函数
21         function 构造函数|类型名(属性参数1,……){
22             this.属性名=属性参数1;
23             ...
24             this.方法名=function(){...this.属性名...}
25         }
26       2.利用构造函数创建对象
27         var obj=new 构造函数|类型名(属性值1,...);
28         new:1.创建一个空对象:new obj={  };
29             2.用空对象,调用构造函数
30             构造函数在空对象中添加属性和方法
31             3.设置新对象的_proto_指向构造函数的prototype
32             4.返回新对象的地址
33
34     继承:js中一切继承都是用原型对象实现的!
35     原型对象(prototype):每个函数对象都有一个原型对象
36             构造函数的原型对象负责保存所有子对象共享的成员!
37             ---避免重复定义方法对象,浪费内存。
38         说明:其实所有内置类型的API都是定义在类型.prototype
39
40
41     扩展对象:2种:
42     1.扩展共有属性:通过构造函数.prototype添加的属性
43     2.扩展自有属性:通过某一个具体子对象添加的属性
44     判断自有属性或共有属性:
45     1.自有属性:obj.hasOwnProperty("属性名")
46     2.共有属性:"属性名"in obj&&!obj.hasOwnProperty("属性名")
47          在原关系中包含   且   子对象没有
48
49     删除属性:delete对象.属性名
50         *仅能删除当前对象自己的属性,无法删除共有属性
51     全局变量:3种:
52     var n=1;  |  window.n=1  |  window["n"]=1
53     不能delete    不能delete     可被delete
54
55     原型链:由各级对象的_proto_逐级继承形成的关系
56     获得任意对象的父级原型对象:
57         Object.getPropertyOf(子对象)
58         ==>子对象._proto_
59
60
61     检查对象的父对象:父对象.isPrototypeOf(子对象)
 1 3.原形,原型链,继承:
 2     原型:保存所有子对象共有属性和方法的对象!
 3          所有函数都有prototype,指向自己的原型对象
 4          所有对象都有_proto_,指向自己父级原型对象
 5          所有原型对象都有constructor,指回原型对应的构造函数
 6
 7     原型链:所有父子级对象间由_proto_形成的多级引用关系-->*多级*继承
 8
 9     原型相关API:
10     1.判断自有属性和共有属性:
11         1.自有:obj.hasOwnProperty("属性名");
12         2.判断原型链上的属性:2种:
13            判断不包含:if(!("属性"in obj))
14               if(obj.属性名==undefined)
15               if(!obj.属性名)
16         3.仅判断共有:必须满足两个条件
17         !obj.hasOwnProperty("属性名")
18         &&
19         obj.属性名
20            2.获得任意对象的原型:
21         obj._proto_ X
22         onject.getPropertyOf(obj)
23     3.判断父对象是否在子对象的原型链上
24          父对象.isPrototypeOf(子对象)
 1 ***检测一个对象是不是数组类型:4种
 2     1.Array.prototype.isPrototypeOf(obj);
 3     2.obj instanceof Array
 4          对象  是不是   构造函数  的实例
 5     3.obj.constructor==Array仅判断直接父级
 6     4.利用当前对象,强行调用原始的toString方法
 7     Object.prototype.toString.call(obj)=="[object Array]"
 8                  .apply(obj)
 9
10     继承:代码重用!
11     1.直接继承对象:想法设法修改对象的_proto_
12        3种:
13        1.仅修改一个对象的_proto_
14           Object.setPrototypeOf(子对象,父对象)
15        2.通过修改构造函数的原型对象,实现批量修改后续子对象的继承关系。
16         构造函数.prototype=父对象
17            强调:仅影响之后创建的对象的继承关系
18        3.var obj=Object.create(父对象[,{属性列表}])
19           创建一个空对象
20           继承父对象中的属性
21           继承同时可再扩展属性和方法
22     2.仅继承结构
23        function 父类型构造函数(属性参数1,属性参数2){
24         this.属性1=属性参数1;
25         this.属性2=属性参数2;
26        }
27        function 子类型构造函数(属性参数1,属性参数2,属性参数3){
28             父类型构造函数.call(this,属性参数1,属性参数2);
29         this.属性3=属性参数3;
30            }
31        var obj=new 子类型构造函数(值1,值2,值3){
32
33        }
01-20 06:35