三周

113 阅读13分钟

五颗星***** 正则表达式

什么是正则表达式:定义字符串中【字符出现规则】的表达式
何时使用:切割、替换、***验证
如何定义正则表达式:
语法:/正则表达式/
最简单的正则:关键字原文本身:"no"   /no/ig
   i:忽略大小写
   g:全部
   
   
备选字符集:一个备选字符集:规定了【一位】字符可用的备选字符列表
   如何:/[备选字符列表]/
   强调:1、一个中括号,只能匹配一位字符
       2、正则默认只要满足后,就不再管理后续操作,后续用户可以乱输入-不合理
       解决:只要是做验证!!!必须/^[备选字符集]$/,前加^后加$代表要求从头到尾完全匹配 - 用户输入的东西必须和我规定的东西一样
       特殊:如果备选字符串集中,unicode号是连续,那么中间部分可用-代替
       比如:一位数字:【0-9】
           一位字母:【A-Za-z】
           一位数字、字母、下划线:【0-9A-Za-z_】
           一位汉子:【\u4e00-\u9fa5】
           除了xxx之外,其他都可以:-很少使用,范围太广了
           【^xxx】
           【^0-9
预定义字符集:前辈们提供好了一些常用的字符集的简化写法:
一位数字: \d ==>   [0-9]
一位数字、字母、下划线:\w ==> [0-9A-Za-z]
一位空白字符: \s ==> 空格、制表符、换行
一位除了换行外的任意字符: . - 范围太广了
建议:优先使用预定义字符集,如果预定义字符集没有,在用备选字符集补充
强调:不管是备选字符集,还是预定义字符集,一个都只管一位

量词:规定了一个字符集出现的次数
有明确数量
字符集{n,m}:前边相邻的字符集,最少出现n次,最多出现m次
字符集{n,}前边相邻的字符集,最少出现n次,多了不限
字符集{n}:前边相邻的字符集,必须出现n次
没有明确的数量
字符集?:前边相邻的字符集,可有可无,最多一次
字符集*:前边相邻的字符集,可有可无,多了不限
字符集+:前边相邻的字符集,至少一次,多了不限
指定匹配的位置:
^:以xxx开头
$:以xxx结尾
特殊:如果^和$同时出现:前加^h后加$,代表要求从头到尾完全匹配-只要是做 验证必须加
选择和分组:
选择:规则1|规则2 -可以再多个规则中选择满足的规则进行执行
分组:添加子规则:(规则1|规则2)

预判:密码强度:2-4位字母和数字的组合,至少一位大写字母和一位数字
公式:
   (?![0-9]+$)字符集量词 - 不能全由数字组成
   (?![0-9A-Z]+$)字符集量词 - 不能全由数字组成、不能全由大写组成、不能全由数字和大写的组合组成
   (?![a-z0-9]+$)(?![a-zA-Z]+$)0-9A-Za-z){2,4}-
         不能是纯数字、纯大写、纯小写
         也不能是小写和数字的组合
         也不能是小写和大写的组合
         也不能是数字和大写的组合
   

---------------------------------------------------------------------------
---------------------------------------------------------------------------

字符串中支持正则表达式的 API:分割、替换:
分割字符串
var arr=str.split(reg);

五星*****替换字符串:

基本替换法:
    var newStr=str.replace(reg,"新内容");
    特殊:默认只会替换第一个关键字,想要替换所有记得加上后缀g
    替换的内容只能是一个固定的新内容
高级替换法
    var newStr=str.replace(/[我卧窝][槽5操艹草肏去]+/g,function(a,b,c)){
    console.log(a);正则匹配到的关键字
    console.log(b);//正则匹配到的关键字的下标
    console.log(c);//原文本身
    return a.length==2?"**":"***";
    });
 格式化:如果替换API使用正则时,并且里面带有分组,那么你会得到更多的形参
 var newStr=str.replace(reg,function(a,b,c...){
     console.log(a);//正则匹配到的关键字
     console.log(b);//第一个分组获取到的内容
     console.log(c);//第二分组获取到的内容
     return "格式化的东西"
     });
     常出现:笔试题中
     
    
正则对象:
创建正则对象:2个
 直接量:var reg=/正则表达式、后缀
 构造函数:var reg=new RegExp"正则表达式""后缀")
 方法:var bool=reg.rest(user);
   布尔值如果是ture,说明用户输入的符合我们的要求,false说明不通过
  

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Math:专门提供了数学计算的API
强调:不能创建,不需要创建,直接使用
唯一的属性:Math.PI
API:
取整:3种
上取整:只要超过一点点,就会取下一个整数,此方法小数位数不能超过15位否则会失效:Math.ceil(num);
 下取整:不管超过多少,都会省略掉小数部分,此方法小数位数不能超过15位否则会失效:Math.floor(num);
 四舍五入取整:Math.round(num);
 问题:四舍五入虽然不错,但是以上三个API只能取整
 解决方法:棒的:parseFloat(num.toFixed(d));//既有四舍五入功能,又具有保留自定义小数位数的操作,结果是一个字符串
 笔试题:*封装一个函数,实现可以自定义保留小数位数并且四舍五入的功能,但是不允许使用toFixed?
`  
 function round(num,d){
    num*=Math.pow(10,d);
    num=Math.round(num)
    num/=Math.pow(10,d);
    return num.toString();
}
    
乘方和开方
  *乘方:Math.pow(底数,幂); - 简化连续的乘法
   开方:Math.sqrt(num); - 只能开平方
       
       
最大值和最小值
   语法:Math.max/min(a,b,c,d,e,f....);
   获取到最大的一个数或者最小的一个数
   问题:不支持数组参数
  *解决:Math.max/min.apply(Math,arr);
     apply:自己没有的方法可以去借用	 
            可以将数组打散为单个参数悄悄进行传入  
4、绝对值:将负数转为整数
	Math.abs(num);
            
三星***随机数:只要页面上具有随机的功能,底层一定用到了随机数
	Math.random() 已经是一个随机数了,随机的小数0-1,有可能取到0,但是绝对不可能取到1 - 意味着能取到最小值,但是取不到最大值
	公式:parseInt(Math.random()*(max-min+1)+min); 

      还具有三角函数
          
Date:封装了一个日期对象,提供了对日期事件进行操作的API
何时使用:以后只要网页上跟事件日期相关的,我们都要使用date对象
1、创建日期对象:4*创建当前时间:
		var now=new Date();

*创建自定义时间:
		var birth=new Date("yyyy/MM/dd hh:mm:ss");

创建自定义时间:
		var birth=new Date(yyyy,MM,dd,hh,mm,ss);
		缺点:月份需要修正:计算机中月份是从0开始到11的

复制一个日期对象:
		为什么:日期对象的API都是直接修改原日期对象,使用API后,无法同时保存住旧的日期对象
		何时使用:在调用日期对象的API之前都要先复制,在使用API
		语法:var end=new Date(now);

var xxx=new Date(毫秒数);
		计算器其实保存的就是从197011日至今的毫秒数

`	操作:
   两个日期对象之间可以相减,得到毫秒差,换算出你想要的任何一部分,看出细节:其实日期对象保存的就是一个毫秒数
   API:
	分量:时间单位
		FullYear Month Date Day
		Hours Minutes Seconds
	每一个分量都有一对儿方法:getXXX()/setXXX()
		特殊:1、取值范围:
			 年:当前年份
			 月:0-11
			 日:1-31
			 时:0-23
			 分:0-59
			 星期:0-60代表星期天

		      2、星期只有get,没有set
	
	固定套路:对着某个日期直接做加减				
		date.setXXX(date.getXXX()+3)


	格式化为字符串:
	国际化日期格式化为本地化日期:date.toLocaleString(); - 垃圾:1、具有浏览器的兼容性问题 2、则不可以再使用日期对象的API,也不会再带有进制操作了
								       解决:自定义format格式化     好处:转为了字符串可用字符串的API

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Error:错误对象:
1、*浏览器自带4种错误类型:
语法错误:SyntaxError - 多半都是哪里的符号写错了
引用错误:ReferenceError - 根本就没有创建过,就去使用了
类型错误:TypeError - 不是你的方法,你却使用了
范围错误:RangeError - 只有一个API:num.toFixed(d);//d的范围只是0-100之间

需要记忆错误类型,帮助我们快速找错。
   2、错误处理:当程序发生错误时,保证程序不会异常中断的机制
为什么:只要报错,就会导致后续代码终止(闪退),用户体验感降低
  如何:try...catch...语句
    try{
	可能出错的代码
    }catch(err){
	console.log(err);//提示用户错误的原因是什么
    }

    后续代码都可以执行到

不推荐:try...catch...的执行效率非常的低下,更推荐的是if...else
想要用if...else去预判用户的错误的前提:丰富的经验(其实我一直在带你们防用户!isNaN、正则)
  3、抛出自定义错误:
throw new Error("自定义错误信息");

*****Function:函数对象 - 方法

    创建:31、声明方式
	function 函数名(形参列表){函数体;return 结果;}
	具有完整的声明提前	

  2、直接量方式
	var 函数名=function(形参列表){函数体;return 结果;}
	也有声明提前,但是赋值留在原地

  3、构造函数方式 - 函数体不是固定的
	var 函数名=new Function("形参1","形参2",...,"函数体");
	函数体是动态拼接时候,注意不能省略""部分

调用:
  函数名();
  元素.onclick();

考点:
  1、***创建:
2、***作用域:全局(成员哪里都可以使用)、函数(成员只能在函数调用时内部可用)
	     变量的使用规则:优先使用局部的,局部没有找全局,全局没有就报错
3、***声明提前:在程序正式执行之前,会将var声明的变量和function声明的函数集中提前到当前作用域的顶部,但是赋值留在原地,变量比函数轻
4、***按值传递:如果传递的是原始类型,互不影响。如果传递的是引用类型,相互影响。
5、***重载:相同的函数,根据传入的实参的不同,会自动选择对应的函数执行
	为什么:减少程序员的负担
	问题:JS不支持重载,JS不允许同时存在多个同名函数,如果存在,最后的一个会覆盖之前的所有函数
	解决:arguments对象 - 只能在函数内部可用,是一个类数组对象:
		作用:接住所有的实参,【以后甚至不用形参都可以了】
		只有3点相同:
			1、支持下标
			2、支持length
			3、支持遍历
	变相实现重载:通过判断arguments的不同,执行不同的操作
6、***匿名函数:理解概念
	没有名字的函数,没有变量名/函数名引用着,调用完毕后会立马释放 - 一次性函数
	2种:
	1、匿名函数自调:代替全局作用域
		(function(){
			函数体; - 好处:调用完毕会【立刻释放】
		})()

	2、匿名函数回调:某个函数调用时,传入的实参又是一个函数,而且不需要我们调用自动执行
		比如:
		  arr.sort(function(a,b){return a-b})
		  str.replace(reg,function(){})
***要认识什么叫做回调函数:
			匿名函数,不是自调,就一定是回调 - 以后会学习箭头函数:简化一切的回调函数

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

五星*****面对对象

*****继承:父对象的成员(属性和方法):子对象可以直接使用

为什么继承:代码重用!节约内存空间!

何时继承:只要多个子对象公用的属性和【方法】,都应该集中定义在父对象中

JS的面向对象是基于原型(父对象)的
什么是原型:保存一类子对象共有属性和共有方法的原型对象(父对象)
1、如何去找到原型对象:
	对象名.__proto__ - 至少要创建一个对象才可以使用
	构造函数名.prototype
	new 构造函数(Object RegExp Date Function String Number Boolean...)
在原型对象中添加共有属性和共有方法
	原型对象.属性名=属性值
	原型对象.方法名=function(){}
每一个对象都有一个.__proto__的属性指向着自己的原型
每一个构造函数都有一个.prototype属性指向着自己的原型
面试题:两链一包:
	原型链:自己没有的属性和方法,可以顺着原型链一直向上找,直到最顶层:Object.prototype - 万物皆对象
	作用:查找属性和方法
自有和共有
自有:保存在对象本地的
共有:保存在原型对象中的,子对象都可以直接使用
笔试题
判断一个属性是自有还是共有:
	判断自有:obj.hasOwnProperty("属性名");
		如果结果为true,说明是自有
		如果结果为false,可能是共有也可能是没有
	判断共有:2个条件
		obj.hasOwnProperty("属性名")==false;//可能是共有也可能是没有
		"属性名" in obj;//in关键字会查找自己的原型
		if(obj.hasOwnProperty("属性名")==false && "属性名" in obj){
			console.log("共有")
		}else{
			console.log("没有")
		}
	完整的:
		if(obj.hasOwnProperty("属性名")){
			console.log("自有");
		}else{
			if(obj.hasOwnProperty("属性名")==false && "属性名" in obj){
				console.log("共有")
			}else{
				console.log("没有")
			}
		}
  修改/删除属性
	自有:修改:obj.属性名=新值;
	      删除:delete obj.属性名;
	共有:修改:千万不要在本地做操作,那会导致在本地添加上一个同名属性,优先使用自己的,但并没有修改原型对象
	      删除:千万不要在本地做操作,那会导致白做没有任何效果
	      强调:一定要找到原型再做操作

  3、为一类人添加方法:
	比如:最常见的一道题:为老IE的数组添加indexOf方法 - 原本只有字符串可以使用,是后续升级数组才能使用的
		if(Array.prototype.indexOf === undefined){//老IE				Array.prototype.indexOf = function(key,starti){		starti===undefined&&(starti=0);
for(var i=starti;i<this.length;i++){
					if(this[i]==key){							return i;
					}
				}
				return -1;
			}
		}
	
	如:为一人添加共有方法
		构造函数名.prototype.函数名=function(){
			this->函数中的代表当前调用此函数的对象
		}
   4、判断x是不是一个数组:41、判断当前x对象是否是继承自Array.prototypeArray.prototype.isPrototypeOf(x);
		true说明是一个数组
	2、判断当前x对象是否是由此构造函数所创建
		x instanceof Array
		true说明是一个数组
	3Array.isArray(x); - 只有数组才有此方法
		true说明是一个数组
	4、最麻烦,但是我个人最喜欢
	   在Object的prototype中保存着最原始的toString方法
	   原始的toString输出的结果:[object 构造函数名]
	***多态:子对象觉得父对象提供的方法不好用,可以再本地定义一个同名成员,优先使用离自己更近的方法
		 同一个函数名,但根本不是同一个方法
	   固定套路:
		 if(Object.prototype.toString.apply(arr)==="[object Array]"){
			数组
		 }		
   如何设置自定义继承
    设置单个对象的继承:
		obj.__proto__=新对象
	设置多个对象的继承:
		构造函数名.prototype=新对象
		注意时机:在创建对象之前就设置好父对象

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Error 浏览器自带 4种错误类型: 1、语法错误:SyntaxError - 符号错了 2、引用错误:ReferenceError - 没有创建 3、类型错误:TypeError - 不是你的方法你却去使用了 4、范围错误:RangeError - num.toFixed(d);//d 0-100之间 抛出自定义错误: throw new Error("错误信息"); 错误处理:希望不要报错,而是给一个错误提示,不会打断后续代码 try{ 可能出错的代码 }catch(err){ console.log("错误提示"); } 还不如用if...else提前的预判 - 规定用户只能输入什么(!isNaN、正则、控制范围) Function 创建:构造函数:var 函数名=new Function("形参1","形参2",...,"函数体;return 结果"); 重载:同一个函数名,根据传入的实参的不同,执行对应的函数 arguments类数组对象:哪怕没有形参,接住所有的实参 arguments[0] - 第一个实参 arguments[1] - 第二个实参 ...

	function f1(){
		if(arguments.length==1){

		}else if(arguments.length==2){

		}...
	}

匿名函数:只会使用一次就会自动释放,因为没有函数名/变量名,没有变量引用着的引用类型对象会被垃圾回收器立刻释放 自调:代替全局作用域 (function(){ 开始写自己的代码 - 变量会自动释放 })();

回调:多半都是API里前辈提供好的,我们学习了就可以直接使用,以后回调函数可以简化箭头函数
		只要匿名函数,不是自调,一定就是回调
		arr.sort(function(a,b){return a-b})
		elem.onclick=function(){}