第一天:正则对象
1.正则表达式:// :定义字符串的使用规则,使用场景在表单验证,字符串的replace,split
2.正则简单使用:表达式:关键字原文 "no" : /no/ig; i:忽略大小写 g:全部(global)全局
3.备选字符集:/[ ··· ]/;正则只要满足了,就不管后续操作;解决方法:
1.一个[ ]只会管一个字符,
2.前加^;后加$,里面的类容就需要从头到尾完全满足我们的要求;一般用在表单验证
3. 连续的字符串可省略中间的字,0-9,a-z,A-Z ;等·····
4.预定义字符集:前辈们定义好的
1.数字:\d;
2.字母,数字,下划线:\w
3.空字符:\s,包括了空格,换行,tab制表符
4.量词:规定一个字符集出现的次数
1.明确数量:
1.{m,n}:表示最少m个,最多n个;
2.{m,}:表示最少m个,多了不限
3.{m}:表示只能是m个;
2.没有明确的数量:
1.? :表示可有可无,最多一次
2. * :表示可有可无,多了不限
3.+ :表示最少一次,多了不限
5.选择和分组:
1.选择:在多个规则中选一:规则1 | 规则2
2.分组:将多个字符集组成一个子规则,(规则1 | 规则2)
6.预判公式:
1.(?![] + $)[中间放着不需要的字符集];
7.字符串中支持正则的API
1.切割:var arr=str.split(str/reg);
2.替换:
1、基础:
str.replace(/reg/g,"新内容")
2、高级:
str=str.replace(/[关键字1][关键字2]+/g,
function(a,b,c){
a正则匹配到的关键字
b正则匹配到的关键字的下标
c是原文
return a.length==2?"**":"***";
});
3、格式化:
str=str.replace(/(\d{6})(\d{4})(\d{2})(\d{2})(\d{4})/,function(a,b,c,d,e,f,g,h){
在replace的时候,正则出现了分组,
在形参a的后面就会出现n个形参,具体看你有多少个分组,最后肯定有两个前一个代表下标,后一个代表原文
第一个分组获得的内容会保存在第二个形参中
第二个分组获得的内容会保存在第三个形参中
return b+"年"+c+"月"+d+"日";
})
8.正则的创建方式:
1.直接量:var reg = /正则/后缀;
2.构造函数:var reg = new RegExp("正则","后缀");
第二天:数学对象
1.Math:对象:专门提供数学计算的Api
1.取整Api:
1.上取整:var num1=Math.ceil(number);
2.下取整:var num2= Math.floor(number);
3.四舍五入:var num3=Math.round(number);
2.乘方和开方:
1.乘方:var num1=Math.pow(底数,幂数);
2.开方:var num2=Math.sqrt(number);
3.最大值和最小值:
1.var max/min=Math.max/min(x,y,z):xyz为数字:该方法不支持数组:解决方法
var var max/min=Math.max/min. apply(Math. arr);
4.绝对值:Math.abs(number);
5.*****随机数:Math.random():在0-1之间取一个小数,但取不到最大值;
公式:parentint(Math. random()*(max-min+1)+min);
第三天:日期对象,错误对象
1.日期的创建方式:五种
1.创建当前日期:var newdate=new Date();
2.创建自定义日期:var time=new Date(xxx - xx - xx h:m:s);
3.复制时间:var now=new Date(start);日期对象都是直接修改原数组的;
2.日期的操作API:
1.日期可以相减,获得的是一个毫秒差:
2.日期的分量:时间单位:Fullyear,Month,Date,Day,Hours,Minute,seconds,
3.每一对分量都有get和set方法:Day(星期)没有;
4.Month的取值范围:0-11;Date的范围:0-31
5.格式化转为字符串:var str= date. tolocalestring();
3.四种错误对象:
1.语法错误:SyntaxError:符号,语法错误
2.引用错误:ReferenceErroe:没有创建就使用;
3.类型错误:typeError:方法用错了;
4.范围错误:rangeerror:num. tofixed(n),这里的n只能在0-100之间;
第四天:函数-结束,面向对象开始
1.函数的重载(overload):相同的函数名,根据传入的实参不同,选着不同的执行结果
1.函数内部有一个arguments对象,该对象在函数调用时内部创建,一个类数组,专门接受传入的实参;
作用:可根据arguments类数组的长度不同:执行不同的操作,可不写实参
2.匿名函数:即没有名字的函数,使用一次自动释放
1.匿名函数的自调:(function ( ) { 代码 } ( ):以后的代码可以写在 “代码” 中,自动释放内存
2.匿名函数的回调:匿名函数 ,不是自调就是回调,像数组排序的API: sort() 以及 字符串的替换API:replace 和绑定函数
3.函数的闭包:
1.函数的执行原理:
0.在函数执行前,会创建一个执行环境栈,保存函数调用顺序的数组,首先压入全局执行环境(全局EC),全局EC引用着全局window,window中保存着全局变量
1.定义函数时,创建函数对象,在对象中定义作用域属性(scope),记录函数来自的作用域,全局函数的作用域是window
2.函数调用前,压入新的函数的EC,创建函数的活动对象AO,保存着该函数的局部变量,函数EC中添加scope chain 属性引用着AO,设置AO的parent属性为函数的scope引用对象
3.调用时优先使用自己的,没有再顺着作用域链去找,最后是全局window
4.调用完:EC会自动出栈,AO自动释放
2.闭包:想创建一个受保护的局部变量,可以兼容全局变量和局部变量的优点,实现方法如下
1.两个函数的嵌套
2.创建一个受保护的变量;
3.外层函数return 出内层函数,
4.内层函数引用着受保护的变量;
3.闭包使用场景:一般用在防抖和节流中:mousemove事件,input事件,resize事件(window可用);
4.闭包防抖节流使用公式:function bb() {
var xx;//创建一个未赋值的变量
return function (){
if(xx){clearTimeout(xx)}
xx=settimeout(function (){ 操作 },1000)
}
}
var event=bb();
elms.onclick=function(){ event(); }
4.面向对象:开发方式:一是面向过程,二是面向对象,面向对象的三大特点:1.封装 2.继承 3.多态
1.封装:即创建Object的方法
1.直接量方式:var obj={ "属性" :属性值,"方法名" :function(){}, }。js的对象底层都是哈希数组
2.访问对象的属性和方法:obj. 属性名(方法名) obj[ "属性名"("方法名")]();在对象中使用自己的属性必须用:this
3.this的指向问题:
1.单个元素绑定事件,this指向该元素
2.多个元素绑定事件,this指向当前元素
3.函数中的this,谁调用了此函数,this就指向谁
4.定时器中的this,永远指向window
5.构造函数中的this,指向当前创建的函数
4.自定义构造函数的方式创建对象:
function obj (){ 形参1,形参2,···· }{
this. 形参1=形参1;
this. 形参2=形参2;
````````````````````````
}
var newobj=new obj(形参);
第五天:Object的继承特性
继承:就是父对象的方法和属性,子对象页可以用
1.找原型的方法:1.对象名.__proto__;//必须是对象才可用 2.构造函数名. prototype;//除了Math,其他对象都有
2.最顶层的对象是 Object 的原型;
3.判断自有还是共有:
if(obj. hasOwnprototype("属性名")){
log(“自有”)
}else{
if(obj. hasOwnprototype("属性名")===false && "属性名" in obj){
log(“共有”) }
else{ log(“没有”) }
}
4.删除修改 自有 或 共有:
1.删除自有:delete obj. 属性名(方法名) 修改就是重新赋值
2.删除共有:delete obj.prototype.属性名(方法名) 修改也是重新赋值
5.判断xx是不是一个 数组 或 其他对象
1.Array.prototype.isprototypeof(xx):true->是数组,否则不是
2. xx instanceof Array; true->是数组
3.Array.isArray(xx); - ES5新提供:老IE都不支持;
4.对象的字符串形式
Object的原型上有原始的toString方法
原始的toString方法,默认输出 - [object Object]
多态:同一个函数名拥有多种形态
方法:借用:if(Object.prototype.toString.apply(x)==="[object Array]"){数组}
6.实现自定义继承:
1.两个对象之间的方法:子对象. __proto__=原型对象;
2.多个对象认父:先设置关系,在来构造对象