回顾
apply和call方法的使用和区别
* 都可以改变this指向的
* 使用方式:
* 函数名.apply(对象,[参数1,参数2,参数3,...]);
* 函数名.call(对象,参数1,参数2,参数3,....);
* 我想要使用其他对象的某个方法,其他对象.方法名.apply(当前对象,参数,...);
* 这个方法就会被当前的对象所使用,同时这个方法中的this就是当前的对象,在调用方法的时候改变了this的指向
bind方法的使用和区别
* 复制一个方法或者是函数,是在复制的同时改变了this的指向
* 使用方式:
* 函数名.bind(对象,参数1,参数2,...);------>返回值是复制之后的这个函数
高阶函数---->函数的使用的方式:函数作为参数使用,函数作为返回值使用
* 函数作为参数使用的时候,这个函数可以是匿名函数,也可以是命名函数
闭包:函数中有另一个函数,或者是一个函数中有另一个对象,里面的函数或者是对象都可以使用外面函数中定义的变量或者数据,此时形成闭包
闭包模式:函数模式闭包,对象模式的闭包
闭包的作用:缓存数据,延长作用域链,同时也是缺点,函数中的变量不能及时的释放
沙箱/(自调用函数):就是一个环境,也可以叫黑盒,在这个环境中模拟外面真实的开发环境,完成需求,效果和外面的真实的开发环境是一样的
* 沙箱避免命名冲突
递归:函数中调用函数自己,递归一定要有结束的条件,否则就是死循环
递归轻易不要用,效率很低,
浅拷贝、深拷贝
浅拷贝:拷贝就是复制,就相当于把一个对象中的所有的内容,复制一份给另一个对象,直接复制;
或者说,就是把一个对象的地址给了另一个对象,他们指向相同;
两个对象之间有共同的属性或者方法,都可以使用
-------------------------------------------------------
//写一个函数,作用:把一个对象的属性复制到另一个对象中,浅拷贝
//把a对象中的所有的属性复制到对象b中
function extend(a,b) {
for(var key in a){
b[key]=a[key];
}
}
=====================================================================
深拷贝:拷贝还是复制,深:把一个对象中所有的属性或者方法,一个一个的找到;
并且在另一个对象中开辟相应的空间,一个一个的存储到另一个对象中
-------------------------------------------------------------
//通过函数实现,把对象a中的所有的数据深拷贝到对象b中
function extend(a,b) {
for(var key in a){
//先获取a对象中每个属性的值
var item=a[key];
//判断这个属性的值是不是数组
if(item instanceof Array){
//如果是数组,那么在b对象中添加一个新的属性,并且这个属性值也是数组
b[key]=[];
//调用这个方法,把a对象中这个数组的属性值一个一个的复制到b对象的这个数组属性中
extend(item,b[key]);
}else if(item instanceof Object){ //判断这个值是不是对象类型的
//如果是对象类型的,那么在b对象中添加一个属性,是一个空对象
b[key]={};
//再次调用这个函数,把a对象中的属性对象的值一个一个的复制到b对象的这个属性对象中
extend(item,b[key]);
}else{
//如果值是普通的数据,直接复制到b对象的这个属性中
b[key]=item;
}
}
}
遍历DOM树
//获取页面中的根节点--根标签
var root=document.documentElement; //-->html
forDOM(root);
--------------------------------------------------
//函数遍历DOM树
// 获取传入节点对象的所有子节点
function forDOM(nodeObj) {
//调用showNodeName,显示的是节点的名字
showNodeName(nodeObj);
var children=nodeObj.children;
//调用遍历所有子节点的函数
forChildren(children);
}
---------------------------------------------------------------
//传入子节点集,将所有的子节点显示出来
function forChildren(children) {
for(var i=0;i
正则(规则)表达式
方法:
1.正则表达式.test("str"); //返回值--Boolean
2.var array = str.match("/正则表达式/gi") //返回值--字符串中与正则匹配的字符放入数组
//正则末尾加 g 代表全局模式匹配---返回字符串中所有符合字符串到数组,否则只返回第一个
//正则末尾加 i 代表字母忽略大小写匹配
3.RegExp.$1 获取字符串中符合正则的第一个分组的字符
4.str.replace() //字符串中某些方法也可以使用正则表达式
var str="小苏好帅哦,真的是太帅了,帅,就是真帅";
str=str.replace(/帅/g,"猥琐");
console.log(str);
5.str.trim();
var str=" 哦买噶的 ,太幸福了 ";
str=str.trim();
console.log("==="+str+"===");
------------------------------------------效果一样
var str = " 哦买噶的 ,太幸福了 ";
str = str.replace(/\s+/g, "");
console.log("===" + str + "===");
6.var array = 正则表达式.exec(str)
获取匹配字符串中匹配该正则的字符,存入数组
var str = "中国移动:10086,中国联通:10010,中国电信:10000";
var reg=/\d{5}/g;
//通过正则表达式匹配这个字符串
var array=reg.exec(str);
while (array!=null){
//输出匹配的内容
console.log(array[0]);
array=reg.exec(str);
}
按照一定的规则组成的一个表达式,用于匹配字符串
适用于大多数语言
组成:元字符(限字符)组成的一个式子
元字符:
. 表示的是:除了\n以外的任意的一个字符 "fdsfs238"
[] 表示的是:范围
[0-9] 表示的是0到9之间的任意的一个数字, "789" [0-9]
[1-7] 表示的是1到7之间的任意的一个数字
[a-z] 表示的是:所有的小写的字母中的任意的一个
[A-Z] 表示的是:所有的大写的字母中的任意的一个
[a-zA-Z] 表示的是:所有的字母的任意的一个
[0-9a-zA-Z] 表示的是: 所有的数字或者是字母中的一个
[] 另一个函数: 把正则表达式中元字符的意义干掉 [.] 就是一个.
| 或者
[0-9]|[a-z] 表示的是要么是一个数字,要么是一个小写的字母
() 分组
提升优先级 [0-9]|([a-z])|[A-Z]
([0-9])([1-5])([a-z]) 三组, 从最左边开始计算
(()(()))
都是元字符,但也叫限定符
* 表示的是:前面的表达式出现了0次到多次
[a-z][0-9]* 小写字母中的任意一个 后面是要么是没有数字的,要么是多个数字的
"fdsfs3223323" [a-z][0-9]*
+ 表示的是:前面的表达式出现了1次到多次
[a-z][9]+ 小写字母一个后面最少一个9,或者多个9
? 表示的是:前面的表达式出现了0次到1次,最少是0次,最多1次 ,另一个含义:阻止贪婪模式
[4][a-z]? "1231234ij"
限定符:限定前面的表达式出现的次数
{} 更加的明确前面的表达式出现的次数
{0,} 表示的是前面的表达式出现了0次到多次,和 *一样的
{1,} 表示的是前面的表达式出现了1次到多次,和 +一样的
{0,1} 表示的是前面的表达式出现了0次到1次,和 ?一样的
{5,10} 表示的是前面的表达式出现了5次到10次
{4} 前面的表达式出现了4次
{,10} 错误的========不能这么写
^ 表示的是以什么开始,或者是取非(取反) ^[0-9] 以数字开头
^[a-z] 以小写字母开始
[^0-9] 取反,非数字
[^a-z] 非小写字母
[^0-9a-zA-Z_]
$ 表示的是以什么结束 [0-9][a-z]$ 必须以小写字母结束
^[0-9][a-z]$ 相当于是严格模式 "3f2432e" "4f"
\d 数字中的任意一个,
\D 非数字中的一个
\s 空白符中的一个
\S 非空白符
\w 非特殊符号 _
\W 特殊符号
\b 单词的边界
案例--常见正则==============================================
1.座机号码的正则表达式
* 010-19876754
* 0431-87123490
--------------------------------
* [0-9]{3,4}[-][0-9]{8}
* \d{3,4}[-]\d{8}
2.qq号码的正则表达式
* [1-9][0-9]{4,10}
* \d{5,11}
3.手机号码的正则表达式
* 130 131 132 133 134 135 136 137 138 139
* 143 147
* 150 151 152 153 154 155 156 157 158 159
* 170 171 173 176 177
* 180 181 182 183 184 185 186 187 188 189
* ([1][358][0-9][0-9]{8})|([1][4][37][0-9]{8})|([1][7][01367][0-9]{8})
* \d{11}
4.邮箱的正则表达式,必须要记住的 !!!!!
[0-9a-zA-Z_.-]+[@][0-9a-zA-Z_-]+([.][a-zA-Z]+){1,2}
5.中文的正则表达式
^[\u4e00-\u9fa5]$
创建正则表达式对象
1.
//对象创建完毕---
var reg=new RegExp(/\d{5}/);
//字符串
var str="我的电话是10086";
//调用方法验证字符串是否匹配
var flag=reg.test(str);
console.log(flag);
2.
//对象创建完毕---
var reg=new RegExp(/\d{5}/);
//调用方法验证字符串是否匹配
var flag=reg.test("我的电话是10086");
console.log(flag);
3.
//字面量的方式创建正则表达式对象
var reg=/\d{1,5}/;
var flag=reg.test("小苏的幸运数字:888");
console.log(flag);
案例
1.验证密码强度
2.验证用户输入的是否是邮箱
请您输入邮箱地址: *
//escape("中文")----------->输出"中文"所对应的ACSCII编码
//unescape("ASCII编码")======》输出ASCII编码所对应的中文
数组和伪数组
伪数组和数组的区别
真数组的长度是可变的
伪数组的长度不可变
真数组可以使用数组中的方法
伪数组不可以使用数组中的方法