day001
1、事件的取消绑定:
- 如果使用
elem.on事件名=()=>{},那么写成:elem.on事件名=null;可以取消事件绑定 - 如果你使用
elem.addEventListener("事件名",callback); 那么写成 elem.removeEventListener("事件名",callback);- 事件名和回调函数,【必须和添加时是一模一样的】
// btn.onclick=e=>{
// console.log(1)
// }
// btn.onclick=null
function f1(){
console.log(1)
btn.removeEventListener("click",f1)
}
btn.addEventListener("click",f1)
2、this的指向
- 单个元素绑定事件this->这个元素
- 多个元素绑定事件this->当前元素
- 箭头函数中this->外部对象
- 函数中的this->当前正在调用函数的这个对象
- 定时器的this->window
ES5强制改变this的指向
call/apply:临时的替换了函数之中的this - 借用
语法:
函数名.call(借用的对象,实参,...) - 单独传入每个实参函数名.apply(借用的对象,arr) - 只能传入一个事件要求必须是一个数组,apply可以将数组打散
强调:call/apply:相当于立刻调用函数,立刻执行的
bind:永久替换了函数中的this -
-
创建了一个和原函数功能完全相同的新函数
-
将新函数的this永久绑定为了指定对象
-
将新函数的部分参数永久固定
语法:
var 新函数名=函数名.bind(永久对象,永久实参,...) - 不是立刻执行,需要调用
强调:bind绑定得到的新函数没办法被call/apply再次借走!
三个固定套路:
Math.max/min.apply(Math,arr) ===> Math.max/min(...arr)Object.prototype.toString.call/apply(arr)=="\[object Array]"//toString不需要传入实参- 类数组转为普通数组:
老方式:接住=Array.prototype.slice.call/apply(类数组对象);
新方法:接住=Array.from(类数组对象)
ES6
let、const关键字、箭头函数
模板字符串:
`可以直接识别变量,不再需要+运算去拼接了,而且实现了一个简单的js环境,甚至支持在里面做运算写API都可以
`
var name="张衡",age=18
console.log(`我是${name},年龄${age}`)
解构赋值:
顾名思义:解析结构再进行赋值 - 赋值的新方式,并且得到了增强!
如果赋值符号,左右两边的结构一样,就会解开结构再一一进行赋值
- 类似数组的解构赋值
let [a,b,c]=[2,3,4]
console.log(a)
console.log(b)
console.log(c)
- 类似对象的解构赋值
let {a,b=默认值,c}={c:3,a:1,b:2}
console.log(a);
console.log(b);
console.log(c);
- 调用函数时
function zwjs({name="无名氏",age,hobby}){
return `我的名字叫${name},今年${age}岁,喜欢${hobby}`;
}
console.log(zwjs({age:18,hobby:"学习"}))
- 函数的返回的结果,可以有多个
function f1(){
var a=1;
var b=2;
return [a,b];
}
var [a,b]=f1();
console.log(a);
console.log(b);
新的循环:
for(var val of 数组名){
//val - 值
}
缺陷:
1、没有提供过下标,意味着不能修改原数组
2、只能遍历索引数组,不能遍历hash数组,意味着也不能遍历对象
Set和Map:两个新的数据类型:
Set: 类似于数组的一种数据格式 - 去重数组,然后再转回数组
[...new Set(arr)]
... - 三个点扩展运算符,可以脱掉数组/对象的外套
Map: 类似于对象的一种数据格式
var m=new Map();
添加:m.set("键","值");
获取:m.get("键");
删除:m.delete("键");
清空:m.clear();
遍历:m.forEach(callback);