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
每个都有个get和set操作,除了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];
}
5、this的指向:
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=新父对象; - 注意时机:先设置继承,在创建对象