day11
一:正则表达式
含义:定义字符串中字符出现规则的表达式
何时:切割、替换、【验证】
如何:
语法:/正则表达式/
1: 最简单的正则:
关键字原文"no" ——>/no/后缀;
后缀:
g:global 全部
i:忽略大小写
2:备选字符集:
/^[备选字符集]$/
强调:a:一个中括号,只能管以为字符
b:正则表达式默认只要满足就不管后续,我们希望从头到尾完全匹配
解决:前^后加$ ——>只要是做验证就必须加
特殊:
如果备选字符集中的ascii码是连续的,那么可用——省略中间部分
例如:
一位数字:[0-9]
一位字母:[A-Za-z]
一位字母、数字、下划线:[0-9A-Za-z_]
一位汉字:[\u4e00-\u9fa5]
3:预定义字符集:前辈们提前定义了一些字符集,方便我们简化备选字符集
一位数字:\d===[0-9]
一位数字、字母、下划线:\w===[0-9A-Za-z]
一位空白字符:\s 包括:空格、换行、制表符
建议:优先使用预定义字符集,如果预定满足不了,自己再写备选字符集补充
问题:不管是预定义字符集还是备选字符集,一个都只能管一位
4:量词:规定一个字符集出现的次数
1):有明确数量:
字符集{n,m} 前边相邻的字符集,至少n个,最多m个;
字符集{n,} 前边相邻的字符集,至少n个,最多无限个
字符集{n} 前边相邻的字符集,必须n个
2):没有明确的数量:
? 前边相邻的字符集,可有可无,最多1个
* 前边相邻的字符集,可有可无,最多无限个
+ 前边相邻的字符集,至少一个,最多无限个
5:选择和分组
选择:在多个规则中选一个
规则1|规则2
分组:将多个子规则临时组成了一组规则
(规则1|规则2)
6:指定匹配位置
^ 开头
$ 结尾
特殊:
两者同时使用,前加^后加$,表示从头到尾要求完全匹配,只要做验证就必须这么写
7:密码强度验证
4位密码,数字和字母的组合,至少出现一位数字和大小写字母
如下:
/^[0-9A-Za-z]{4}$/
预判如下:
/^(?![0-9]+$)规则$/ 不能全由数字组成
/^(?![a-z]+$)规则$/ 不能全由小写字母组成
/^(?![0-9a-z]+$)[0-9A-Za-z]{4}$/ 不能全由数字组成,也不能全由小写字母组成,也不能由数字和小写字母组成,至少要有一个大写字母
//4位密码数字和字母的组合,至少出现一位数字和大写字母
var reg=/^[0-9a-z]+$)(?![A-Za-z]+$)[0-9A-Za-z]{4}$/
//4位密码,数字和字母的组合,至少出现一位数字和大写字母和小写字母
var reg=/^(?![0-9a-z]+$)(?![A-Za-z]+$)(?![A-Z0-9]+$)[0-9A-Za-z]{4}$/
二:支持正则的字符串的API: 替换 切割
1)切割:var arr=str.split(reg);
2)替换:鄙视题中
a:基本替换法: 缺陷:替换的东西都是固定的
str=str.replace(/正则表达式/后缀,"新内容")
//replace支持正则,并且搭配上后缀可以找到全部关键字进行替换
b:高级替换法:
str=str.replace(/正则表达式/后缀,fuction(a,b,c){
//a:第一个形参是正则匹配到的关键字
//b:正则匹配到的关键字下标
//c:原文本身
return a.length==2?"xx":"xxx";
});
c:格式化
例:
var str="500234199301096452";
var reg=/(\d{6})(\d{4})(\d{2})(\d{2})(\d{4})/;
str=str.replace(reg.function(a,b,c,d,e,f){
//在return时,正则出现多个分组,会得到更多的形参,由多少个分组,就会出现多少个形参
//a: 第一个形参是正则匹配到的关键字
//b: 第二个形参会得到第一个分组获取到的部分
//c: 第三个形参会得到第二个分组获取到的部分
......
return b+"年"+c+"月"+d+"日"
1993年01月09日
};
总结:前加^后加$ ——>验证 加后缀g ——>替换
三:正则对象:
1:创建:
直接量:var reg=/正则表达式/后缀;
构造函数: var reg=new RegExp("正则表达","后缀");
2: API验证:
var bool=reg.test(用户输入的内容);
true:验证通过
false:验证失败
input 绑定一个获取焦点事件: onfocus ——>显示文字
获取失去事件: onblur ——>获取用户输入内容
然后和正则判断给出正确或错误的样式
form绑定提交事件onsubmit: 阻止 return false;
day12
一:Math对象:专门提供了数学计算的API
强调:不需要创建直接使用
Math.pi===3.1415926 不需要创建,Math带有此属性
API:
1:取整方式:
a: 上取整:超过一点,取下个正数
Math.ceil(num);
Math.ceil(3.14); ——>4
b:下取整:无论超过多少,省略小数点部分
Math.floor(num);
Math.floor(3.1415); ——>3
c:四舍五入:
Math.round(num);
以上很少用到
取整方式:以上三种+parseInt+num.toFixed(d);
推荐:
num.toFixed(d); //d:表示保留几位小数,当d=0时,就是取整数。可用作四舍五入,保留指定小数位数,结果位字符串,搭配pareseFloat()用。
鄙视题:
不能用toFixed情况下,自己封装一个函数,实现toFixed功能,需求四舍五入,并保留小数功能
function round(num,d){
num*=Math.pow(10,d);
num=Math.round(num);
num/=Math.pow(10,d);
return num;
};
return result=round(3.5,0);
console.log(result);
2:乘方和开方:
**乘方:Math.pow(底数,幂); ——>代替连乘操作
开方:Math.sqrt(num); ——>只能开平方
3:最大值和最小值
var 最大的/最小的=Math.max/min(a,b,c,d,....);
问题:本身不支持数组参数
解决:固定用法:
var 最大/最小值=Math.max/min.apply(Math.arr);
apply: 1): 借用 2):打散数组为单个元素
4:绝对值
Math.abs(负数) ——>负数较为正数
5:随机数:
Math.random();在0-1之间取一个随机的小数
可取到0,但不可能取到1,意味着取不到最大值
公式:
parseInt(Math.random()*(max-min+1)+min);
二:Date对象:日期对象
1:创建:4种
1):创建一个当前日期:
var now=new Date();
2):创建一个自定义时间
var 函数名=new Date("yyyy/mm/dd hh:mm:ss");
xxxx年xx月xx日xx时xx分xx秒
3):创建自定义时间
var 函数名=new Date(yyyy,mm-1,dd,hh,mm,ss); ——>月份是从0开始,默认0-11月。
4):复制一个日期
原因:日期的所有API都是直接修改原日期对象,无法获取修改之前的日期,所以在执行API之前都要先复制,再操作复制后的日期
如何:
var end=new Date(starti);
操作:
a:两个日期可以相减,得到一个毫秒差,换算出自己想要的部分。——>不用,不好换算。
b:API:
分量:时间的单位
年(FullYear) 月(Month) 日(Date) 星期(Day) 时(Hours) 分(Minutes) 秒(Seconds)
每一个分量都有一对:getxxx
setxxx
其中:getxxx 负责获取某一个分量的值
setxxx 负责设置某一个分量的值
特殊:
a 取值:
FullYear:当前年份的数字
Month:0-11
Date:1-31
Day:0-6
Hours:0-23
Minutes:0-59
2、Day星期:没有set方法
3、如果希望对某个分量进行加减
date.setxxx(date.getxxx+/-n);
4、格式化日期为字符串,本地格式:
date.toLocaleString(); 本地日期格式,有兼容问题——>垃圾
day13
一Error对象:错误
1:浏览器自带4种错误类型,可以快速找到自己的错误
语法错误:SyntaxError 多半时符号错误
引用错误:ReferenceError 没有创建直接使用
类型错误:TypeError 方法错用
范围错误:RangeError 只有num.toFixed(d);会碰到,d的取值范围只能0-100之间
2:只要发生错误就会报错,导致后续代码终止
解决:就算发生错误,我们不希望报错,而是给一个错误提示,让后续代码继续执行
语法:
try{
只放入错误代码
}catch(err){
发生错误才会执行
console.log(err); //err错误提示,英文
console.log("中文的错误提示");
};
try..catch: 性能差,可用分支奇数代替
开发经验:防止客户恶意输入(!isNaN、正则)
3:抛出自定义错误:
throw new Error("自定义错误信息"); ——>报错就会卡住后续代码
二:Function对象:
1:创建:3种
*a:声明方式:
function 函数名(形参,....){
函数体;
return 返回值
}; ——>会完整的声明提前
b: 直接量:
var 函数名=function(形参,...){
函数体;
return 返回值
}; ——>只有函数名部分会提前,但是赋值留在原地的,通过这个方法我们看出来函数名其实就是一个变量名
*c: 构造函数
var 函数名=new Function("形参1","形参2",..."函数体;return 返回值");
何时用:如果你的函数体不是一个固定的而是动态拼接的一个字符串
例如:
var arr=[12,5,25,432,355,7,54,4312,41];
var user=prompt("请进行排序,如果输入a-b为升序排序,如果输入b-a为降序排列");
var compare=new Function("a","b","return"+user);
arr.sort(compare);
2:调用时:如果还有return,记得接住
var result=函数名(实参,...);
3:考点:
1):创建方式
2):作用域:变量使用规则:优先局部,再则全局,全局没有就报错
3):声明提前
4):按值传递
5):重载overload:
相同函数名,根据传入实参不同,可以自动选择对应的函数进行执行
为什么:
减轻开发压力
问题:JS不支持重载
解决:在【函数中】有一个对象: arguments对象
arguments: 只能在函数中使用,自动创建,是一个类数组对象(支持下标、length、遍历)
作用:可以接住所有传入的实参
arguments:
a:实现重载,通过在函数中内部判断arguments的不同,执行不同操作
b:以后有没有形参都无所谓
c:正式开发中,有可能将多个函数整合为一个函数
6):匿名函数:没有名字的函数
a:匿名函数自调:
为什么:节约内存
(function(){
可以代替全局代码写法,尽量不在外部写代码
})();
以后写网页先写上:
(function(){
})();
b:匿名函数回调:将函数作为了一个实参,传递给其它函数用
1):学习目的:明白哪些叫做回调函数,只要是匿名函数,没有自调,就是回调
例:
arr.sort(function(){ });
str.replace(reg.function(){ });
elem.onclick=function(){ };
2):以后ES6用箭头函数,简化一切回调函数
3):了解一下回调函数的原理