第四周JS学习

64 阅读6分钟

1、event:事件对象 - BOM的最重要的一个对象:

1、事件周期:3个

1、捕获阶段:由外向内,记录着要发生的事件有哪些

2、目标优先触发:目标元素->实际发生事件的元素

3、冒泡触发:由内向外,依次执行记录着的事件

2、获取事件对象event:

主流:事件函数的第一个形参会自动接住event对象

老IE:event;

兼容:event;

获取到事件对象event可以做5个操作:

1、阻止冒泡:

主流:e.stopPropagation();

老IE:e.cancelBubble=true;

兼容:e.cancelBubble=true;

2、事件委托/利用冒泡:绑定的事件越多,创建的事件对象就会越多,网页的性能就会越低下,把事件委托在父元素身上一次即可

父元素.on事件名=e=>{

目标元素:

主流:e.target; -> 代替掉了this,甚至可以搭配上nodeName判断标签->返回的是一个全大写组成的标签名

老IE:e.srcElement;

兼容:e.srcElement;

}

3、阻止浏览器的默认行为:

主流:e.preventDefault();

老IE:e.returnValue=false;

兼容:e.returnValue=false;

新接触到的事件:

右键:window.oncontextmenu

键盘:window.onkeydown/press/up

4、获取键盘的键码:

e.keyCode;

5、获取鼠标的位置:

获取相对于屏幕的坐标:e.screenX/Y

获取相对于文档显示区域的坐标:e.clientX/Y

获取相对于页面的坐标:e.pageX/Y

1、事件取消:

1、elem.on事件名=null;

2、elem.removeEventListener("事件名",当初添加时的回调函数);

2、this的指向:

单个元素绑定事件:this->这个元素 可用target代替

多个元素绑定事件:this->当前元素 可用target代替

定时器中的this->window

箭头函数中的this->外部对象

函数中出现了this->正在调用此函数的对象

3、其实不是自己的方法,也可以用,强制改变this的指向

call/apply:临时替换了函数中的this

语法:函数.call(借用的人,实参,...);

函数.apply(借用的人,arr);

借用相当于就是立刻调用

bind:永久替换了函数中的this

语法:var 新函数=函数.bind(指定的人,永久实参);

完成了3件事:

1、创建了一个和原函数完全相同的新函数

2、this被永久指定为了指定的人,其他人都借不走

3、甚至可以永久固定一些实参

买,是不会立刻执行的,需要自己调用

3个固定套路:

1、数组也可以获取最大值和最小值:Math.max/min.apply(Math,arr); ===> Math.max/min(...arr);

2、判断x是不是数组:Object.prototype.toString.call/apply(x)=="[object Array]"

3、类数组转为普通数组:普通数组=Array.prototype.slice.call/apply(类数组对象) ===> 普通数组=Array.from(类数组对象);

4、let、const、箭头函数

5、解构赋值:

1、类似数组的解构赋值

var [c,b,a]=[1,2,3] - return可以返回多个数据

2、类似对象的解构赋值

var {c,b=默认值,a}={a:1,b:2,c:3} - 衍生了传递实参的顺序其实无所谓了

6、模板字符串:

我的名字叫${name};

7、for(var v of arr){

v-值

}

缺陷:

1、没提供过下标,无法修改原数组

2、无法遍历hash数组,也无法遍历对象

8、Set和Map

[...new Set(arr)] - 使用Set数组去重,在从Set转回Array

1、正则表达式:规定了字符串的字符出现的规则

真实开发中:优先面向百度开发,学习正则的目的(1、看得懂可以改 2、笔试和面试)

何时使用:切割、替换(加g)、验证(前加^后加$)

如何使用:

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]+)[09AZaz4˘e009˘fa5]4)[0-9A-Za-z\u4e00-\u9fa5]{4}/

2、字符串支持正则的API:

1、切割:var arr=str.split(RegExp);

2、替换:

基础替换法:

str=str.replace(RegExp,"固定新内容")

高级替换法:

str=str.replace(RegExp,a=>{

return 通过判断a关键字的长度的不同,返回不同的内容;

})

格式化:

str=str.replace(RegExp,(a,...)=>{

如果正则里有分组,我们就会得到更多的形参,有几个分组,就会多出几个形参!

始终:

第2个形参保存的是第1个分组匹配到的内容

...

})

3、正则对象:

创建:

直接量:var reg=/正则表达式/后缀

构造函数:var reg=new RegExp("正则表达式","后缀");

API:

验证:var bool=reg.test(user); - 这个bool仅仅就是给出一个正确或错误的提示

4、新学的事件:

1、每个input都有一个onfocus获取焦点事件 - 提示用户

2、每个input都有一个onblur失去焦点事件 - 验证用户

3、form有一个onsubmit提交事件 - 阻止提交return false;

4、oninput - 只要内容发生了变化都会触发

1、面向对象:三大特点:封装、继承、多态

1、封装:其实就是创建

1、直接量:

var obj={

"属性名":属性值,

...

"方法名":function(){},

...

}

2、预定义构造函数

var obj=new Object();//空对象

obj.属性名=属性值;

obj.方法名=function(){};

3、自定义构造函数 - 批量创建对象,创建了一个类

1、创建自定义构造函数

function h52302(name,age,hobby){

this.name=name;

this.age=age;

this.hobby=hobby;

}

2、调用自定义构造函数,创建对象

var obj=new h52302(实参,...);

4、使用:

访问:obj.属性名/方法名();

访问到不存在的:返回undefined

遍历:for in

如果对象的函数,想要使用对象自己的属性,要写为this.属性名;

this的指向:

1、单个元素绑定事件this->这个元素

2、多个元素绑定事件this->当前元素

3、定时器中this->window

4、箭头函数中this->外部对象

5、函数中的this->正在调用此函数的对象

6、构造函数中的this->正在创建的对象

2、继承:原型对象(父对象)的东西,子对象可以直接使用

作用:代码重用

如何:

1、找到原型对象(父对象):

对象名.proto;

构造函数名.prototype;

2、原型链:每个对象都有一个属性.proto,可以一层一层的找到每个人父亲,形成了一条链式结构

作用:找属性和方法的,哪怕自己没有会悄悄的向上查找,如果最顶层也没有才会报错

最顶层是Object的原型,甚至上面放着我们眼熟的API - toString,怪不得人人都可以使用

3、找到原型对象可以设置共有属性和共有方法

原型对象.属性名=属性值;

原型对象.方法名=function(){};