二阶段 3周

145 阅读6分钟

1、正则表达式:规定字符出现的规则 1、最简单的正则:/原文/后缀 g:全部 i:忽略大小写

2、备选字符集:/^[0-9]$/

3、预定义字符集:
	一位数字:\d
	一位数字,字母,下划线:\w
	一位空白字符:\s

4、量词:
     有明确数量:
	{n,m}:最少n次,最多m次
	{n,}:最少n次,多了不限
	{n}:只能n次

     无明确数量:
	?:可有可无,最多一次
	+:至少一次,多了不限
	*:可有可无,多了不限

5、选择和分组:
	(规则1|规则2)

6、指定匹配位置
	^:开头
	$:结尾
	特殊:两者同时出现,做验证:从头到尾完全按照我们程序员的规则来进行输入 - 完全匹配

7、预判:密码强度
	/^(?![0-9A-Za-z]+$)[0-9a-zA-Z\u4e00-\u9fa5]{4}$/ - 至少要有一位汉字

2、字符串的支持正则的API 1、切割:var arr=str.split(/正则/)

2、替换:
	基本替换法:var newStr=str.replace(/正则/后缀,"新内容") - 替换的新内容是一样

	高级替换法:
		var newStr=str.replace(/正则/后缀,function(a){
			return a.length==2?"**":"***";
		})

	格式化:如果正则中搭配上了分组,那么会得到更多的形参
		var newStr=str.replace(/正则/后缀,function(a,b,c...){
			//第二个形参保存的是第一个分组匹配到的关键字部分
			//第三个形参保存的是第2个分组匹配到的关键字部分
			//...
			return a.length==2?"**":"***";
		})

3、正则对象: 创建:var reg=/正则表达式/后缀; var reg=new RegExp("正则表达式","后缀")

API:验证:var bool=reg.test(user);

4、真正做注册: 1、onfocus - 获取焦点事件 - 提示用户的 2、onblur - 失去焦点事件 - 拿用户的和正则比对 3、onsubmit - 提交事件,用于阻止提交return false;

1、Math: 1、不需要创建,直接使用 - 有浏览器的JS解释器自动创建

2、属性:Math.PI

3、API:
	1、取整:
		上:Math.ceil(num);
		下:Math.floor(num);
		四舍五入:Math.round(num);
		*parseFloat(num.toFixed(d));

	2、乘方和开方
		Math.pow(底数,幂);
		Math.sqrt(num);

	3、最大值最小值:Math.max/min(a,b,c,d,e,f...);
		数组比较:Math.max/min.apply(Math,arr);

	4、绝对值:Math.abs(-1);

	5、***随机整数公式:parseInt(Math.random()*(max-min+1)+min)

2、Date:- 以后来做一个倒计时 1、创建 当前时间:var now=new Date(); 自定义时间:var xxx=new Date("yyyy/MM/dd hh:mm:ss") var xxx=new Date(yyyy,MM-1,dd,hh,mm,ss) 复制时间:var end=new Date(start); var xxx=new Date(毫秒数);//计算机保存的是从1970年1月1日至今的毫秒数

2、操作
      1、两个日期之间可以相减,得到毫秒差可以换算出想要的任何一部分分量
      2、API:FullYear Month Date Day Hours Minutes Seconds Milliseconds
	每个都有个getset操作,除了Day没有set
	date.setXXX(date.getXXX()+/-n)

      3、格式化为字符串:date.toLocaleString(); - 建议自定义格式化方法,此方法有兼容性问题

未来一切的效果都是数据渲染
未来一切的效果都是很容易实现的,因为网上有一大把插件/组件库
    
    
    
    

1、Error: 1、浏览器自带四种错误类型: SyntaxError - 语法错误:符号写错了 ReferenceError - 引用错误:没有创建 TypeError - 类型错误:不是你的方法,你使用了 - undefined和null RangeError - 范围错误:num.toFixed(0-100);

2、错误处理:遇到错误,不要抛出错误,而给一个错误提示
	try{
		【可能】出错的代码
	}catch(err){
		err -> 错误信息,但是是英文的,一般我们自己写一个错误提示
	}

	效率低:还不如if...else提前判断,甚至我们以前学的!isNaN,正则都是为了控制用户去输入

3、自定义抛出错误:throw new Error

2、Function: 1、创建: 构造函数方式:var 函数名=new Function("形参1","形参2","函数体 return 返回值");

2、重载:相同函数名,根据传入的实参的不同,自动选择对应的函数执行,但是JS不支持多个同名函数
	解决:arguments类数组对象,不需要自己创建,只能在函数内部使用
	           作用:可以接住所有的实参 - 变相实现重载

3、匿名函数:
	自调:只能执行一次,就跟你把代码放在全局的效果是一样,但是他会自动释放
		(function(){操作})()

	回调:我们只学习如何使用,知道哪些叫做回调函数
		xxx.API(function(){})
		xxx.on事件名=function(){}
                    
                    

1、Function闭包:保护一个可以反复使用的局部变量的一种词法结构 全局:缺点:容易被污染 函数:缺点:一次性 语法: function outer(){ 受保护的变量; return function(){ 操作受保护的变量 } }

	var inner1=outer();

	注意:1、外层函数调用几次,就创建了几个闭包,受保护的变量就有了几个副本
	           2、同一次外层函数调用创建的变量,是可以反复使用的
	缺点:1、内层泄露
	使用场景:防抖节流:
		1、input.oninput
		2、elem.onmousemove
		3、window.onresize

2、面向对象:三大特性:封装、继承、多态 1、封装、创建:

	1、直接量:
		var obj={
			属性名:属性值,
			...,
			方法名:function(){},
			...
		}

	2、预定义的构造函数:
		var obj=new Object();//空对象
		obj.属性名=属性值
		obj.方法名=function(){}

	3、批量创建多个元素:自定义构造函数方式:
		1、创建构造函数
			function 类名(name,age,salary){
				this.name=name;
				this.age=age;
				this.salary=salary;
			}

		2、调用构造函数
			var dy=new 类名("代老湿",18,35000000);
			var dls=new 类名("代老湿",18,35000000);

	4、访问&遍历
		访问:obj.属性名 或者 obj.方法名();
		遍历:for(var i in obj){
			obj[i];
		           }

	5this的指向:
		1、单个元素绑定事件:this->这个元素
		2、多个元素绑定事件:this->当前元素
		3、函数中出现了this->谁在调用就是谁
		4、定时器this->window
		5、箭头函数this->外部对象
		6、构造函数中的this->当前正在创建的对象
                    
                    
                    

1、*****继承:子对象可以直接使用父对象的属性和【方法】 为什么:代码重用 如何使用:1、找原型对象:2种 1、对象名.proto 2、构造函数名.prototype

           2、设置共有属性和共有方法
		原型对象.属性名=属性值;
		原型对象.方法名=function(){}

           3、原型链:每一个对象都有一个属性.__proto__,找到自己的爸爸甚至祖先,形成的一条链式结构就称之为叫做原型链,
	             哪怕自己没有此方法也可以通过原型链看看祖先上面有没有,作用:查找属性和方法
	             最顶层就是Object.prototype

           4、笔试题:
	1、判断自有还是共有
		if(obj.hasOwnProperty("属性名")){
			//自有
		}else{
			if("属性名" in obj){
				//共有
			}else{
				//没有
			}
		}

	2、修改和删除自有共有
		自有:修改:obj.属性名=新属性值
		          删除:delete obj.属性名;
	
		共有:修改:obj.__proto__.属性名=新属性值
		          删除:delete obj.__proto__.属性名;

	3、为一类人添加方法:
		构造函数名.prototype.API=function(){
			操作
		}

	4、判断x是不是数组:
		1、判断是否继承自Array.prototype
			Array.prototype.isPrototypeOf(x);

		2、判断是否由Array构造函数创建
			x instanceof Array

		3、是不是数组:Array.isArray(x); - 只有数组可用

		4、多态:同一个函数名,但是表现出来的形式形态完全不一样,其实根本就不是同一个方法,属于的对象其实不一样
			同样的toString,但是arr和obj的表现形式不要一样
			Object.prototype.toString.apply(x)==="[object Array]"

	5、自定义继承:
		obj.__proto__=新父对象;
		构造函数名.prototype=新父对象; - 注意时机:先设置继承,在创建对象