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
得到事件event可以做什么?首先获取e
1. ***获取鼠标的坐标/位置:3种写法:
获取相对于屏幕的坐标:e.screenX/Y
获取鼠标相对于浏览器窗口/客户端/文档显示区域的坐标:e.clientX/Y
获取鼠标相对于网页的坐标e.pageX/Y
2. ***阻止冒泡:
主流:e.stopPropagation()
老IE:e.cancelBubble =true
兼容:e.cancelBubble =true
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]$/
除了xxx之外的:[^0-9] – 很少使用,范围太广了。这里叫除了数字不要。
3. 预定义字符集:已经被开发人员提前定义了的字符集。
语法:一位数字:/^\d$/
一位空白字符:/^\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. *切割:var arr=str.split(/[自定义符号]/)
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->验证失败