JS-高级-05

回顾

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<children.length;i++){
      var child=children[i];
      //调用函数显示节点名字
      showNodeName(child);
      //判断child下面有没有子节点,如果还有子节点,那么就继续的遍历
      child.children&&forDOM(child);
    }
  }
  --------------------------------------------------------
  // 输出根节点的名字
  function showNodeName(node) {
	console.log("节点的名字:"+node.nodeName);
  }
  ---------------------------------------------------------------

正则(规则)表达式

方法:
	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.验证用户输入的是否是邮箱
	请您输入邮箱地址:<input type="text" value="" id="email"/> *<br/>
	<script>
	  //如果输入的是邮箱,那么背景颜色为绿色,否则为红色
	  //获取文本框,注册失去焦点的事件
	  document.getElementById("email").onblur = function () {
	    //判断这个文本框中输入的是不是邮箱
	    var reg = /^[0-9a-zA-Z_.-]+[@][0-9a-zA-Z_.-]+([.][a-zA-Z]+){1,2}$/;
	    if (reg.test(this.value)) {
	      this.style.backgroundColor = "green";
	    } else {
	      this.style.backgroundColor = "red";
	    }
	  };
3.验证用户输入的是不是中文名
	请输入您的名字:<input type="text" value="" id="userName" />*<br/>
	<script>
	  //是中文名字,则绿色,否则红色
	  document.getElementById("userName").onblur=function () {
	    var reg=/^[\u4e00-\u9fa5]{2,6}$/;
	    if(reg.test(this.value)){
	      this.style.backgroundColor="green";
	    }else{
	      this.style.backgroundColor="pink";
	    }
	  };
	  //[\u4e00-\u9fa5]    [一-龥]---中文对应ASCII表范围
	</script>

//escape("中文")----------->输出"中文"所对应的ACSCII编码
//unescape("ASCII编码")======》输出ASCII编码所对应的中文
数组和伪数组
伪数组和数组的区别
    真数组的长度是可变的
    伪数组的长度不可变
    真数组可以使用数组中的方法
    伪数组不可以使用数组中的方法

猜你喜欢

转载自blog.csdn.net/weixin_42966943/article/details/88662901