复盘Js

本文深入探讨JavaScript中的核心概念,包括call、apply、bind的用法,函数的节流与防抖,原型链及其继承方式,对象与数组的操作,以及HTTP协议的理解。详细解析了call、apply、bind的异同,介绍了节流和防抖在处理事件时的应用,讲解了如何通过原型链实现继承,同时阐述了对象属性的判断方法和数组的各种操作技巧,如扁平化、去重和排序。此外,还讨论了Proxy在对象拦截和数据绑定中的角色,以及HTTP请求的过程和状态码。
摘要由CSDN通过智能技术生成

1、call,apply和bind

call和apply可以调用函数,改变this,实现继承和借用别的对象的方法;

1.1 call和apply用法

  • 间接调用函数,改变作用域的this值
  • 劫持其他对象的方法
var foo = {
  name:"张三",
  logName:function(){
    console.log(this.name);
  }
}
var bar={
  name:"李四"
};
foo.logName.call(bar);//李四
// 实质是call改变了foo的this指向为bar,并调用该函数
  • 两个函数实现继承
function Animal(name){   
  this.name = name;   
  this.showName = function(){   
    console.log(this.name);   
  }   
}   
function Cat(name){  
  Animal.call(this, name);  
}    
var cat = new Cat("Black Cat");   
cat.showName(); //Black Cat
  • 为类数组(arguments和nodeList)添加数组方法push,pop
(function(){
  Array.prototype.push.call(arguments,'王五');
  console.log(arguments);//['张三','李四','王五']
})('张三','李四')
  • 合并数组
let arr1=[1,2,3]; 
let arr2=[4,5,6]; 
Array.prototype.push.apply(arr1,arr2); //将arr2合并到了arr1中
  • 求数组最大值
Math.max.apply(null,arr)
  • 判断数据类型(这种方式比较常用)
Object.prototype.toString.call({})

1.2 bind

bind()方法主要就是将函数绑定到某个对象,bind()会创建一个函数,函数体内的this对象的值会被绑定到传入bind()第一个参数的值,例如,f.bind(obj),实际上可以理解为obj.f(),这时,f函数体内的this自然指向的是obj。

详解:bind方法

this.name = "test";
let testObj = {
	name:'zhangsan',
	introduce:function(){
		return this.name;
	}
}
let test = {
	name:"lisi"
}
let test1 = {
	name:"wangwu"
}
let fn = testObj.introduce;
console.log(fn());//test   
console.log(fn.bind(test)());//lisi
console.log(fn.bind(test1)());//王五

 1.3 三者异同

  • 同:都是改变this指向,都可接收参数
  • 异:bind和call是接收单个参数,apply是接收数组

 

2、函数的节流和防抖

2.1 节流

  • 概念:事件触发后每隔一段时间触发一次,可触发多次
  • 应用:scroll,resize事件一段时间触发多次
// 节流函数
let throttle = function(func, delay) {
  let timer = null;
  return function() {
    if (!timer) {
      timer = setTimeout(() => {
        func.apply(this, arguments);
        // 或者直接 func()
        timer = null;
      }, delay);
    }
  };
};

// 处理函数
function handle() {
  console.log(arguments);
  console.log(Math.random());
}
// 测试用例
document
  .getElementsByClassName("scroll-box")[0]
  .addEventListener("scroll", throttle(handle, 3000));

2.2 防抖

  • 概念:事件触发动作完成后一段时间触发一次
  • 应用:scroll,resize事件触发完后一段时间触发
// 防抖函数
let debounce = function(fn, wait) {
  let timeout = null;
  return function() {
    if (timeout !&
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值