JavaScript - day14

29 阅读2分钟

一、事件的取消

  • 如果你使用的是elem.onclick=()=>{},取消就用elem.onclick=null
  • 如果你使用elem.addEventListener("事件名",回调函数),取消就用elem.removeEventListener("事件名",回调函数),事件名和回调函数,必须和添加时的一模一样。
<script>
    // 取消绑定事件方法一
    /* // btn1绑定点击事件
    btn1.onclick = function () {
        console.log(1);
    }
    // 点击btn2的时候取消btn1的点击事件
    btn2.onclick = function () {
        btn1.onclick = null
    } */
    // 取消绑定事件方法二
    //给btn1绑定点击事件
    btn1.addEventListener('click',f1)
    btn1.addEventListener('click',f2)
    // 点击btn2的时候取消btn1的点击事件
    btn2.onclick = function () {
        btn1.removeEventListener('click',f1)
    }
    function f1() {
        console.log(11);
    }
    function f2() {
        console.log(22);
    }
</script>

二、this的指向

  • 单个元素绑定事件this->这个元素
  • 多个元素绑定事件this->当前元素
  • 箭头函数中的this->外部对象
  • 函数中的this->当前正在调用函数的这个人
  • 定时器的this->window
<script>
    // this的指向
    function f1(){
        console.log(this);
    }
    f1();//Window

    setInterval(function(){
        console.log(this);//Window
    },1000)

    var th={
        "name":"田浩",
    }
    var ljm={
        "name":"刘金明",
    }
    Object.prototype.zwjs=function(){
        return "我的名字叫"+this.name
    }
    console.log(th.zwjs())
    console.log(ljm.zwjs())
</script>

三、ES5强制改变this指向

  • call/apply:临时的替换了函数的this - 借用。相当于立刻调用函数,立即执行的。
    语法
    1. 函数名.call(借用的对象,实参,...); - 单独传入每个实参
    2. 函数名.apply(借用的对象,arr); - 只能传入一个实参要求是一个数组,apply其实会悄悄的打散数组
  • bind:永久替换了函数中的this - 买
    1. 创建了一个和原函数功能完全相同的新函数
    2. 将新函数的this永久绑定为了指定对象,别人都借不走
    3. 将新函数的部分参数永久固定
  • 语法
    var 新函数=函数名.bind(永久对象,永久实参,...); - 不是立刻执行,需要自己调用 bind绑定的新函数没办法被call/apply再次借走
<script>
    // 改变this的指向
    function calc(base, bonus1, bonus2) {
        console.log(this);
        return this.name + "的总工资为:" + (base + bonus1 + bonus2);
    }
    var th = {
        "name": "张三",
    }
    var ljm = {
        "name": "李四",
    }
    console.log(th.name);//张三
    console.log(calc());//Window
    // call
    console.log(calc.call(th,100,100,100));
    console.log(calc.call(ljm,100,100,200));
    // apply
    console.log(calc.apply(th,[100,100,100]));
    console.log(calc.apply(ljm,[100,400,100]));
    // bind
    var th_calc = calc.bind(th)
    console.log(th_calc(500,55,555));
</script>
  • 数组获取最大值或最小值
Math.max/min.apply(Math,arr)
  • 判断x是不是数组 - 绝对不能使用typeof:只能判断原始/标准类型,不能判断引用类型
Object.prototype.toString.call/apply(x)==="[object Array]";
  • 类数组转为普通数组
    1. 接住=Array.prototype.slice.call/apply(类数组对象)
    2. 接住=Array.from(类数组对象)
<script>
    // 1.数组获取最大值或最小值
    var arr = [1,22,3,44,6,23,4,55]
    console.log(Math.max.apply(Math,arr));//55
    // 2.判断x是不是数组 - 绝对不能使用typeof:只能判断原始/标准类型,不能判断引用类型
    var str = '1111'
    console.log(Object.prototype.toString.call(arr) == '[object Array]');//true
    console.log(Object.prototype.toString.call(str) == '[object Array]');//false
    // 3.类数组转为普通数组
    var lis = document.querySelectorAll('li')
    console.log(Array.prototype.slice.apply(lis));
    lis = Array.from(lis)
    console.log(lis);
</script>

四、ES6

  • 模板字符串:可以直接识别变量,不再需要+运算去拼接了,而且实现了一个简答的js环境,甚至支持再里面书写API
<script>
    var price = 5
    var count = 3
    console.log(`单格为:${price};数量为:${count};总价为:${price*count}`);
</script>
  • 解构赋值:解析结构再进行赋值 - 赋值的新方式,并且得到了增强
    语法
  1. 类似数组的解构赋值: let [a,b,c]=[1,2,3];
let [a,b,c] = [1,2,3]
console.log(a,b,c)//1 2 3
  1. 类似对象的解构赋值: let {a,b=默认值,c}={c:3,a:1,b:2};//形参可以设置默认值,如果自己传入了,就用自己的
let {name,age,gender} = {name:'张三',age:18,gender:'男'}
console.log(name)//张三
console.log(age)//18
console.log(gender)//男
  1. 调用函数时,传递实参的顺序无所谓了
function getSalary({n1,n2,n3}) {
    return `总薪资为:${n1}+${n2}+${n3}`
}
console.log(getSalary({n2:2000,n1:5000,n3:9000}))
  1. 函数的返回的结果,可以有多个
function getArr() {
    var a = 1
    var b = 2
    return [a,b]
}
var [a,b] = getArr()
console.log(a,b)//1 2

五、Set和Map新的数据类型

Set:类似于数组的一种数据格式 - 【去重数组,然后再转回数组】

  1. var s=new Set(arr);
  2. ...s - 三个点扩展运算符,可以脱掉数组的外套
var arr = [1,2,3,4,5,1,2,3,4,5]
var s = new Set(arr)
console.log(s);//{1, 2, 3, 4, 5}
console.log(...s);//1 2 3 4 5
console.log([...s]);//[1, 2, 3, 4, 5]
  • Map:类似于对象的一种数据格式
  1. var m=new Map();
  2. 添加:m.set("键","值");
  3. 获取:m.get("键");
  4. 清空:m.clear();
  5. 删除:m.delete("键");
var m = new Map()
m.set('name','张三')
console.log(m);//{'name' => '张三'}

六、for..of循环

for(var v of arr){
        v;//值
}

只能遍历索引数组,不能遍历hash数组,意味着也不能遍历对象

<script>
    var arr = [1,2,3,4,5,8,8,9,55]
    for (var v of arr) {
        console.log(v)//v拿到的是数组的每一项
    }
</script>