20200915-叶梦宇-
学习心得
正则表达式
正则表达式是规定一个字符串中字符出现规律的规则,专门描述字符串中出现规则的表达式
当使用规则验证用户输入的格式时,我们就要使用正则表达式
字符集
常用字符集
[abcdef](备选字符集)
找方括号之间的任意字符,找到一个就是匹配成功
注意:如果 [] 中部分备选字符连续,可用 - 省略中间字符,例如:[a-f]
实例:利用字符集验证手机号规则
结果:1[3-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
[A-Za-z]
匹配一位字母
共52个
[A-Za-z0-9]
匹配一位字母或数字
共62个
[\u4e00-\u9fa5]
匹配一位汉字
19969~40869,共20902个
实例:利用字符集简写定义车牌号规则
分析:车牌号一共八位,第一位是一个汉字,第二位是1个大写字母,第三位一个 “ · ”,后面的五位每一位都是1位大写字母或数字
结果:[\u4e00-\u9fa5][A-Z]·[A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z
[xyz]
负值字符集合。匹配未包含的任意字符。例如, '[abc]' 可以匹配 "plain" 中的'p'、'l'、'i'、'n'除了abc以外的所有字符
[a-z]
负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符
预定义字符集
\d 匹配一位数字,等效于 [0-9]
\w 匹配一位数字、字母或_,等效于 [A-Za-z0-9_]
\s 匹配一位空字符,空格,制表符Tab等空白字符
. 通配符,匹配除换行符 \n 之外的任何单字符,换行符平时看不见,但却是存在的
非打印字符
\b 匹配单词的开始或结束
\n 匹配一个换行符。等价于 \x0a 和 \cJ
\s 匹配任何空白字符,包括空格、制表符、换页符等等
注意 Unicode 正则表达式会匹配全角空格符
\S 匹配任何非空白字符
\t 匹配一个制表符tab tab键
\f 匹配一个换页符
\v 匹配一个垂直制表符
\r 匹配一个回车符
数量词
字符集量词
当需要规定一个字符集出现次数时,就需要使用量词
注意:默认仅修饰相邻的前一个字符集
\d{5}匹配数字重复五次
实例改写车牌号
[\u4e00-\u9fa5][A-Z].[0-9A-Z]{5}
字符集{n,m}
字符集至少重复n次,最多重复m次,比如: \d{4,6} 表示4到6位数字
实例:匹配手机短信中的验证码(连续的4位~6位数字)
\d{4,6}
字符集{n,}
字符集匹配的内容至少重复n次,多了不限,比如:\d{6,} 表示6位以上数字
没有明确边界
字符集? 可有可无,最多一次,相当于{0,1} \d?
字符集* 可有可无,多了不限,相当于{0,} \d*
字符集+ 至少一次,多了不限。相当于{1,} \d+
\s+
匹配字符串中的一组连续空字符
选择和分组
在多个子规则中选其一匹配,当我们需要在多个子规则中选其一匹配时,就要用
选择
子规则1|子规则2
| 选择符只分左右,不考虑单个字符
实例:我去|我qu,(wo|我)草,
(我|wo|卧)\s*(cao|操|草)
注意:| 选择符优先级最低
分组
将多个子规则视为一组,再和分组外的规则匹配,当我们希望将多个子规则视为一个整体,再和其它规则匹配时,就用
其他规则(多个子规则)
实例1:同时验证同音字或拼音
我([去取区]|qu)
实例2:“我” 字也可能是“卧”或“wo”
([我卧|wo])([去区取]|qu)
实例3:可能在中间加不确定个数的空字符
([我卧]|wo)\s*([去取区]|去)
匹配“微信”,“weixin”,“w x”等情况,并防止中间加空格
(微|w(ei)?)\s*(信|x(in)?)
(重要!!!!!!)面向对象oop
为了便于大量数据的维护和使用,今后,我们遇到的所有程序都要使用面向对象思想进行开发
面向对象三大特征
封装:
创建一个对象,集中存储一个事物的属性和功能。复杂的问题简单化,只考虑功能和结果,不考虑过程和内部细节。比如:jq库(函数库)的使用
继承
简单来说就是一个对象继承另一个对象的属性和方法。父对象中的成员,子对象无需重复创建,就可直接使用。比如:儿子能继承父亲的姓,孙子也能继承父亲的父亲的姓
多态
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。换句话说是引用类型在不同情况下的多种状态。即为同一事物,在不同情况下,表现出不同的状态。比如:在js中的 ‘+’,在字符串中是拼接作用,在数字中间是加法运算。多态最常见的三种方法:重载,重写,接口
封装(创建对象)
使用对象字面量
在创建对象时,如果已知对象的成员,就使用对象字面量来创建
var obj={**
属性名1 : 属性值1,
属性名2 : 属性值2,
... ,
方法名 : function(){
this.属性名
}
}
使用 {} 创建对象,属性名和属性值之间用冒号隔开,多组属性之间用逗号隔开,属性名中引号可加可不加,如果含有特殊字符必须加引号
ES6写法
var obj={
属性名1 : 属性值1,
属性名2 : 属性值2,
... ,
方法名(){
this.属性名
}
}
注意:
对象自己的函数,想要访问自己的属性,竟然报错 “ xxx is not deifined ”
原因:对象自己的方法,访问自己的属性,如果不加 this.变量,默认只能在函数作用域和全局作用域window中查找变量,也就是仅会在作用域链中找,不会在对象中找,不加 this.变量 是无权进入对象中查找属性的
对象名.属性名
在对象方法内写死"对象名.属性名",来指引js引擎先找到对象,再进入对象中查找属性
问题:紧耦合,万一对象名修改了,就要被迫跟着修改方法中的写死的对象名。一旦忘记修改方法中写死的对象名,依然会出错
解决
this.属性名
注意:只要对象自己的方法要访问自己的属性,必须用this.属性名。不带 this. 的变量,在作用域链中查找。this.属性 在当前对象和当前对象的原型链中找
松耦合:即使外部对象名修改了,方法内也不需要做任何修改,依然可以访问对象中的属性
方法 & 函数 的区别
相同点
都是function
不同点
独立于任何对象之外的,单独存在的function,称为对象
保存在对象内的function,才称为方法
使用内置构造函数
在创建对象时,暂时不知道对象的成员,就使用内置构造函数来创建
创建一个空对象 {}
var obj=new Object();
注意:new可省略,()可省略,但不能同时省略,可推广到其它内置对象
为新对象添加新属性
obj.属性名=属性值
obj.方法名=function(){
this.属性名
}
实例:克隆一个对象
var lijunfeng={
name:"李俊峰",
age:26
}
// 定义一个函数,接受一个旧对象,克隆出一个一模一样的新对象
function clone(oldObj){
// 1. 先创建一个新的空对象,准备接收旧对象中的属性和属性值/
var newObj={}
// 2. 遍历旧对象中每个属性和属性值
for(var key in oldObj){
// 3. 每遍历旧对象中一个属性,就为新对象强行赋值添加一个同名的新属性,属性值也等于旧对象中当前同名属性的值
newObj[key]=oldObj[key]
}
// 4. 克隆完毕,返回新对象
return newObj;
}
var lijunfeng2=clone(lijunfeng);
console.log(lijunfeng2==lijunfeng)
学习总结
学到了面向对象,算是进入了开发中的东西,努力学习吧
近期评论