学习JS第三周总结

93 阅读8分钟

location对象

保存当前窗口的正在打开的url(现在的url)

***程序员必备常识:一个url由几部分组成?分别每个部分是什么?有什么作用?

5部分组成:

    1.协议:http(未加密)/https(加密)/ftp(传输文件的)/ws(直播)…

    前两个都属于请求 – 响应 模型。专门用于网站开发的。

    2.主机号/域名/IP地址:域名是需要花钱购买的,主机号和ip地址是免费,127.0.0.1才叫主机号,只能自己访问自己。

    3.端口号:https默认端口为443,http默认端口:8080,只有默认端口可以不写。

    4.***文件的相对路径/路由:百度加密了 – 如果以后学习了服务器端,我们可以配置一些选项,用户就可以在自己电脑上看到我们的东西。

5.     ***查询字符串/请求消息:前端传输到后端的东西,也叫做请求,其实就是form表单提交,而且是get提交带来的东西。

协议://域名:端口号/文件的相对路径?请求消息

属性:获取url的五个部分的内容,直接输出location对象即可查看。 协议:location.protocol(); 域名:location.hostname   端口号:location.port();

方法:只有一个  跳转:location=“新url”; 刷新:location.reload();

递归

简单来说,就是在函数之中调用了自己,但是迟早有一天要让他停下来。
何时使用:专门用于【遍历层级不明确】的情况 – DOM树和【数据】
如何使用:
       固定思路:function 函数名(root){
                1. 第一层要做什么直接做
                2. 判断有没有下一层,如果有下一层再次调用此方法,但是传入的实参是自己的下一层
                }

函数名(实际的根元素)
算法:深度优先算法!优先遍历当前节点的子节点,子节点遍历完毕才会跳到兄弟节点
缺点:不要过多使用,性能相对较差,同时开启大量的函数调用,浪费内存,我们只在一个情况使用它:【遍历层级不明确】。

获取事件对象

1. 主流:会自动作为事件处理函数的第一个形参传入e
2. 老IE:window.event;
3. 兼容:event;//不光老ie可以用,主流也可以用
得到事件event可以做什么?首先获取e
1. ***获取鼠标的坐标/位置:3种写法:
获取相对于屏幕的坐标:e.screenX/Y;
获取鼠标相对于浏览器窗口/客户端/文档显示区域的坐标:e.clientX/Y;
获取鼠标相对于网页的坐标e.pageX/Y;
2. ***阻止冒泡:
主流:e.stopPropagation();
老IE:e.cancelBubble =true;
兼容:e.cancelBubble =true;//不光老ie可以用,主流也可以用
      3.*****事件委托/利用冒泡:开发中常用,提升网页的性能
             优化:如果多个子元素定义了相同或相似的事件操作,那么最好只给【父元素】绑一次。
             为什么:每一次绑定一个事件函数,其实都是创建了一个事件对象,创建的对象越多,网页性能越差。
             淘汰了this,认识一个新的人叫做目标元素。
             目标元素:实际触发事件的元素。
             主流:e.target;
             老IE:e.srcElement;
             兼容:e.srcElement;
脱掉字符串的衣服:eval(str) - 会悄悄的脱掉字符串的衣服再运算!
判断标签名字:elem.nodeName - 注意返回的标签名是纯大写组成的。
      4.***阻止浏览器的默认行为
             比如:a标签默认可以跳转、提交按钮可以提交表单form,右键自带一个弹出菜单框。
             主流:e.preventDefault();
             老IE:e.returnValue=false;
             兼容:e.returnValue=false;            
             新学了事件:
                    1、右键事件 - window.oncontextmenu
                    2、键盘事件:一般用于游戏开发比较多 + 都要搭配上键盘的键码
                           window.onkeydown - 按下和按住都会触发,而且任何按键都会触发!
                      window.onkeypress - 按下和按住都会触发,但是只有数字、字母、回车、空格可以触发,其他不行!
                      window.onkeyup - 松开的时候才会触发,而且任何按键都会触发!比手速的游戏才会用他。
      5.***获取键盘的键码。
             e.keyCode – 可以获取到按了哪个键,每个键都有自己的键码,但不需要记忆,要么输出看,要么百度看e.keyCode表。
             为什么都加*号:BOM就三个重点,如果是笔试面试中event出现的机率极大

ES5强制改变this的指向

笔试面试中,开发中偶尔用到。
       call/apply:临时替换函数之中的this – 借用
       语法: 1.函数名.call(借用的对象,实参,…); 单独传入每个实参
             2.函数名.apply(借用的对象,arr); 只能传入一个实参,要求必须是一个数组,apply会悄悄把数组打散。
       强调:call和apply,相当于立刻调用函数,是会立刻执行的,而且会还给别人,才叫借用。
       bind:永久的替换了函数中的this – 买
       语法:函数名.bind(指定对象,永久固定的实参);
       3件事:
            1.创建了一个和原函数功能完全相同的新函数

            2. 将新函数中的this永久绑定为了指定对象,别人借不走

            3.将新函数的部分参数永久固定
            强调:
            1.bind绑定的新函数没办法被call/apply再次借走
            2. 买是不会立刻调用,需要自己手动调用。
                   以后哪怕不是自己的方法,也可以使用。
三个固定套路:
    1.Math.max.apply(Math,arr);
    2. 类数组转为普通数组: 新方法:接住=Array.from(类数组);
    老方法:接住=Array.prototype.slice.call/apply(类数组);
    3. 面试笔试题:判断是不是一个类数组?
千万不要用typeof,它只能判断原始类型。
Object.prototype.toString.call(x)= =“[object Array]”,只要得到的结果为true说明是一个数组。其实人人都有toString,但是元始的toString长相最特别,借用了最原始的toString。

正则表达式

定义字符串中字符出现规则的表达式
何时使用:切割、替换、【验证】
如何使用:语法:/正则表达式/;
   1.最简单的正则就是关键字原文:“no” -> /no/后缀
后缀:g:找全部;i:忽略大小写    gi或ig顺序无所谓。
   2.备选字符集:/[备选字符集]/;
强调:① 一个中括号[]只管一个字符
     ② 问题:正则表达式默认只要满足了就不管后续了,而我们做验证的人,希望的是用户从头到尾完全按着我们的要求来,希望完全匹配。
       解决:前加 ^后加$,两者同时使用,代表要求从头到尾【完全匹配】
/^[备选字符集]$/;
特殊:
        如果备选字符集中ASCII码是连续的,那么可用 – 省略掉中间部分
               比如: 一位数字:/^[0-9]$/;一位字母:/^[a-zA-Z]$/;一位数字、字母、下划线:/^[0-9a-zA-Z_]$/;一位汉字/^[\u4e00-\u9fa5]$/;
除了xxx之外的:[^0-9] – 很少使用,范围太广了。这里叫除了数字不要。
3. 预定义字符集:已经被开发人员提前定义了的字符集。
语法:一位数字:/^\d$/;** **一位数字、字母、下划线:/^\w$/;**
一位空白字符:/^\s$/** **什么叫空白字符:空格、制表符、换行**
一位除了换行外的任意字符:/^.$/;   -** **很少使用,范围太广**
*建议:优先使用预定义字符集,预定义满足不了再用备选字符集补充。**
问题:不管备选字符集还是预定义字符集,一个都只管一位。
4.量词:规定一个字符集出现的次数
    **①** **有明确数量:**
    **字符集{n,m}   -** **前面相邻的字符集最少出现n** **个,最多出现m** **个。**
    **字符集{n,}   -** **前边相邻的字符集最少出现n** **个,多了不限**
    **字符集{n}**
    ****
    **②** **无明确数量:**
    **字符集?:前边相邻的字符集,可有可无,最多一个。**
    **字符集*** **:前边相邻的字符集,可有可无,最多不限。**
    **字符集+** **:前边相邻的字符集,至少一个,多了不限。**
    **5.** **选择和分组**
    **选择:在多个规则中选一个,选择往往都要和分组搭配。**
    ******规则1|** **规则2**
    **分组:将多个规则临时组成一个子规则**
    ******(规则1|** **规则2** **)**
    **6.** **指定匹配的位置**
    **开头:^**
    **结尾:$**
    ***** **特殊:两者同时使用,前加^** **后加$,** **表示从头到尾要求完全匹配 –** **只要你做【验证】。**
    **验证:reg.test();**
    **7.** **密码强度验证:**
    **2-4** **位,可以输入数字、字母,但必须出现一位大写和一位数字?**
    ****
    **预判公式:(?![0-9]+$)  ->** **不能全由数字组成,可能有大写、小写、汉字、日文、韩文、特殊符号...**
    **  (?![a-zA-Z]+$)** **不能全由数字组成,也不能全由小写组成,也不能全由数字和小写的组合组成,可能有大写、汉字、日文、韩文、特殊符号...**
    **(?![0-9A-Za-z]+$) ->** **不能全由数字组成,也不能全由小写组成,也不能全由数字和小写的组合组成,也不能全由数字和大写的组合组成,也不能全由大字和小写的组合组成,也不能全由数字和大写和小写的组合组成。**
    ****
    **//2-4** **,可以输入数字、字母、但是必须出现一位大写和一位数字的组合?**
    **var reg=/^(?![0-9a-z]+$)(?![A-Za-z]+$)[0-9A-Za-z]{2,4}$/;**
    **//2-4** **,可以输入数字、字母、但是必须出现3** **者的组合?**
    **var reg=/^(?![0-9a-z]+$)(?![A-Za-z]+$)(?![A-Z0-9]+$)[0-9A-Za-z]{2,4}$/;**
    ****
    ## 1.1 *****支持正则的字符串API
    1. *切割:var arr=str.split(/[自定义符号]/); var arr=str.split("固定切割符"/RegExp);
    2. *****替换:很有可能出现再笔试面试中,而且真实开发中也会用到。
            ① 基础替换法:
            var newStr=str.replace(RegExp,"新内容");
            ② 高级替换法:
            var newStr=str.replace(/[卧我握窝][槽肏操草曹糙去]+/g,function(key,i,str){
                           console.log(key);//关键字
                           console.log(i);//关键字的下标
                           console.log(str);//原文本身
                           return a.length==2?"**":"***";
            });
            ③ 格式化
            var idCard="500103198602215933";
               var reg=/(\d{6})(\d{4})(\d{2})(\d{2})(\d{4})/;
               var newStr=idCard.replace(reg,function(a,b,c,d,e,f,g,h){
               //在replace的时候,如果正则中出现了分组,那我们会得到更多的形参
                //在形参key的后面就会出现n形参,具体有多少个,看你有多少个分组
                //第1个分组获得的内容会保存到第2个形参之中
                //第2个分组获得的内容会保存到第3个形参之中
                //第3个分组获得的内容会保存到第4个形参之中
                //...
                //倒数第二个是下标
                //倒数第一个是原文
                return `${c}年${d}月${e}日`;
            })
    *正则对象:
           创建:
                1. 直接量:var reg = /正则表达式/后缀;
                2. 构造函数:var reg=new RegExp("正则表达式","后缀");
          API:
                 验证:var bool=reg.test(str);
                    true->验证成功  false->验证失败