面试题 三

一、this

在这里插入图片描述
在这里插入图片描述

  1. 手写call
    在这里插入图片描述
//1、定义myCall方法
//3、接收剩余参数并返回结果
Function.prototype.myCall = function (thisArg, ...arg) {// console.log(thisArg);  //person对象// console.log(this);     //func方法//2、设置this并调用原函数//下面三行代码有个缺陷就是如果person上有属性f,这里会把原有的f覆盖掉,可以用symbol规避该问题// thisArg.f = this;// let result = thisArg.f(...arg)// delete thisArg.f//4、使用symbol调优let key = Symbol("key");thisArg[key] = this;let result = thisArg[key](...arg)delete thisArg[key]// console.log(arg);return result
}
let person = { name: "张三" }
function func(a,b) {console.log(this);  //person对象console.log(a,b); //1  2return a + b;
}
let result = func.myCall(person, 1,2)
console.log(result);  //3
  1. 手写applay
/**
* 1、定义myApply方法论
* 2、设置this并调用原函数
* 3、接收参数并返回结果
* **/
Function.prototype.myApply = function (thisArg, args) {const key = Symbol("key");thisArg[key] = this;let result = thisArg[key](...args)delete thisArg[key]return result
}const person = { name: "张三" }
function func(a,b) {console.log(this);console.log(a,b);return a + b
}let res = func.myApply(person, [2,8]);
console.log("返回值:"+res);

在这里插入图片描述

  1. 手写bind方法
/**
* 手写bind方法
* 1、定义myBind方法
* 2、返回绑定this的心函数
* 3、合并绑定和新传入的参数
* **/
Function.prototype.myBind = function (thisArg, ...args) {console.log(this);//因为下面bingDunc要作为方法执行,所以这里要返回一个方法return (...reargs) => {//改变this的指向并返回数据return this.call(thisArg, ...args, ...reargs)}
}const person = { name: "张三" }
function func(a,b,c,d) {console.log(this);console.log(a,b,c,d);return a + b + c + d
}
const bindFunc = func.myBind(person, 1,2)
const res = bindFunc(3,4)
console.log("返回值:", res);

二、class

  1. 基本使用
class Person {constructor(name) {this.name = name}sayHi(){console.log("我的名字是"+this.name);}
}
let p = new Person("张三")
p.sayHi()//我的名字是张三
  1. class继承
    在这里插入图片描述
    注:
    1)子类有自己额外的属性是,需要在 constructor 里调用 super 方法,参数要传父类所需要的参数
    2)当父类、子类有同名方法时,子类优先父类
class Person {// nameconstructor(name) {this.name = name}sayHi(){console.log("我的名字是"+this.name);}}class Student extends Person {constructor(name, age) {super(name)this.age = age}sayHi(){console.log("Student--我的名字是"+this.name);}sayHello() {console.log(`Student--我的名字是${this.name},我今年${this.age}`);}}let s = new Student("张三", 18)s.sayHi()//Student--我的名字是张三s.sayHello()//Student--我的名字是张三,我今年18岁
  1. 静态属性、方法和私有属性、方法
    在这里插入图片描述
 /*** 静态属性*  定义时:用 static 开头*  使用时:通过类访问,无法通过实例去使用* 私有属性*  定义时:以 # 开头*  使用时:以 # 开头,和定义的名字相同,只能在类的内部使用,无法通过实例调用*  注:chrome 的控制台中,可以直接访问私有属性和方法(便于调试)t.prInfo / t.prMethod()* **/class Test {static stInfo = "静态属性"static stMethod() {console.log("静态方法");}#prInfo = "私有属性"#prMethod() {console.log("私有方法");}testPr() {console.log(this.#prInfo);console.log(this.#prMethod());}}Test.stMethod()console.log(Test.stInfo);let t = new Test()t.testPr()

在这里插入图片描述

三、继承

在这里插入图片描述

//组合式继承:借用构造函数,原型链
//寄生:父类的原型中有子类的构造函数//父类function Person(name) {this.name = name}Person.prototype.sayHi = function () {console.log(`你好,我叫${this.name}`);}//寄生组合式继承核心代码//通过构造函数继承属性function Student(name) {Person.call(this, name)}//通过原型链继承方法//复制Person的原型链,并将construct改为Studentlet prototype = Object.create(Person.prototype, {//没有该配置的话,Person的construct是Studentconstructor: {value: Student}})//将创建的原型链赋值给子类的原型Student.prototype = prototypelet s = new Student("张三")s.sayHi()console.log(s);let p = new Person("李四")console.log(p);

在这里插入图片描述

四、fetch在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、Generator

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、手写Promise

  1. promise 基本
//1、定义类
class MyPromise {//2、添加构造函数constructor(func) {//3、定义resolve、rejectlet resolve = (res) => {console.log(res);}let reject = (res) => {console.log(res);}//4、执行回调函数func(resolve, reject)}
}const p = new MyPromise((resolve,reject) => {resolve("成功了");// reject("失败了");
})
  1. 处理promise的状态和原因
const PENDING = "pending"
const FULFILLED = "fulfilled"
const REJECTED = "rejected"
class MyPromise{//1、添加状态state = PENDING//2、添加原因result = undefinedconstructor(func) {//3、调整resolve、reject//4、状态不可逆//改状态:pending-》fulfilled//记录原因const resolve = (res) => {if(this.state === PENDING) {this.state = FULFILLEDthis.result = res}}//改状态:pending-》rejected//记录原因const reject = (res) => {if(this.state === PENDING) {this.state = REJECTEDthis.result = res}}func(resolve, reject)}
}const p = new MyPromise((resolve,reject) => {resolve("成功了");// reject("失败了");
})
  1. then
const PENDING = "pending"
const FULFILLED = "fulfilled"
const REJECTED = "rejected"
class MyPromise{//1.1、添加状态state = PENDING//1.2、添加原因result = undefinedconstructor(func) {//1.3、调整resolve、reject//1.4、状态不可逆//改状态:pending-》fulfilled//记录原因const resolve = (res) => {if(this.state === PENDING) {this.state = FULFILLEDthis.result = res}}//改状态:pending-》rejected//记录原因const reject = (res) => {if(this.state === PENDING) {this.state = REJECTEDthis.result = res}}func(resolve, reject)}then(onFulfilled, onRejected) {//2.1、参数判断(参考文档)onFulfilled = typeof onFulfilled === "function" ? onFulfilled : x => xonRejected = typeof onRejected === "function" ? onRejected : x => {throw err}//2.2、执行成功、失败的回调if(this.state === FULFILLED) {onFulfilled(this.result)} else if(this.state === REJECTED) {onRejected(this.result)}}
}const p = new MyPromise((resolve,reject) => {resolve("成功了");// reject("失败了");
})
p.then(res => {console.log("成功回调:",res);
}, res => {console.log("失败回调:",res);
})
  1. then 的异步及多次调用
const PENDING = "pending"
const FULFILLED = "fulfilled"
const REJECTED = "rejected"
class MyPromise{state = PENDINGresult = undefined//1、定义实例私有属性(只有实例可以访问)#handlers = [] //里面放then的成功、失败方法[{onFulfilled,onRejected}...]constructor(func) {const resolve = (res) => {if(this.state === PENDING) {this.state = FULFILLEDthis.result = res//3、调用成功回调this.#handlers.forEach(( {onFulfilled} )=> {onFulfilled(this.result)})}}const reject = (res) => {if(this.state === PENDING) {this.state = REJECTEDthis.result = res//4、调用失败回调this.#handlers.forEach(( {onRejected} )=> {onRejected(this.result)})}}func(resolve, reject)}then(onFulfilled, onRejected) {onFulfilled = typeof onFulfilled === "function" ? onFulfilled : x => xonRejected = typeof onRejected === "function" ? onRejected : x => {throw err}if(this.state === FULFILLED) {onFulfilled(this.result)} else if(this.state === REJECTED) {onRejected(this.result)} else if (this.state === PENDING) {//2、保存回调函数//如果是异步,。then这里的状态就是Pendingthis.#handlers.push({ onFulfilled, onRejected })}}
}const p = new MyPromise((resolve,reject) => {setTimeout(() => {resolve("成功了");// reject("失败了");},2000)
})
p.then(res => {console.log("成功回调111:",res);
}, res => {console.log("失败回调111:",res);
})
p.then(res => {console.log("成功回调222:",res);
}, res => {console.log("失败回调222:",res);
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/149110.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS算法练习 11.20

leetcode 2629 复合函数 请你编写一个函数,它接收一个函数数组 [f1, f2, f3,…, fn] ,并返回一个新的函数 fn ,它是函数数组的 复合函数 。 [f(x), g(x), h(x)] 的 复合函数 为 fn(x) f(g(h(…

「Verilog学习笔记」边沿检测

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 timescale 1ns/1ns module edge_detect(input clk,input rst_n,input a,output reg rise,output reg down );reg a_tem ; always (posedge clk or negedge rst_n) beginif…

Spark作业串行与并行提交job

在Scala中&#xff0c;您可以以串行和并行的方式提交Spark作业。看看如何使用for和par.foreach构造对应的例子。 串行Spark作业&#xff08;使用for&#xff09; // 串行Spark作业设置 for (tag <- tags) {spark.sparkContext.setJobGroup(tag.toString, s"Tag: $tag…

分布式原理

目录 1. 分布式原理1.1. 关系型数据库遵循 ACID 规则1.2. 分布式系统1.2.1. 分布式计算的优点1.2.2. 分布式计算的缺点 1.3. CAP 定理 (CAP theorem)1.4. BASE1.5. ACID vs BASE 1. 分布式原理 1.1. 关系型数据库遵循 ACID 规则 事务在英文中是 transaction, 和现实世界中的交…

我的256天创作纪念日

今天是我成为创作者的第256天纪念日&#xff0c;感谢CSDN官方的纪念信让我铭记这特殊的一天。 机缘 256天前&#xff0c;我怀着满满的好奇和期待&#xff0c;开始了我在CSDN的创作之旅。当时的我&#xff0c;是一个内向的计算机小白&#xff0c;对于写博客这件事还一无所知。…

Windows10 MYSQL Installer 安装(mysql-installer-community-5.7.19.0.msi)

分类 编程技术 1.进入官网找到自己所需的安装包&#xff1a;https://dev.mysql.com/ &#xff0c;路径&#xff1a;DOWNLOAD-->MYSQL Community Edition(GRL)-->MYSQL on Windows (Installer & Tool) 或直接点击 MySQL :: Download MySQL Installer 查看最新版本。…

uniapp+vue+Springboot 公司网站0~1搭建 前端前期设计篇

原型图 client https://www.xiaopiu.com/h5/byId?typeproject&id653bc791940bbb14e4feeecf admin 客户端 apph5 页面 首页展示 经典用户案例轮播图设计师轮播图 经典用户案例 经典案例搜索详情经典案例详情 设计师查询&#xff08;待定&#xff09; 后台管理 ​ …

bhosts 显示节点 “unreach“ 状态

4.1、bhosts简单使用 查看各节点情况&#xff0c;包括状态和正在运行的 Job 情况等 STATUS列展示节点状态 OK&#xff1a;可用——可接受新的作业的正常状态 unavail&#xff1a;不可用 可能原因&#xff1a;主机关闭&#xff0c;LIM和sbatchd不可达 unreach&#xff1a;无法连…

【笔记1-2】Qt系列:QkeyEvent 键盘事件 设定快捷键

参考文献 QKeyEvent 类用来描述一个键盘事件。当键盘按键被按下或者被释放时&#xff0c;键盘事件便会被发送给拥有键盘输人焦点的部件。QKeyEvent 的 key() 函数可以获取具体的按键关键字。需要特别说明的是&#xff0c;回车键在这里是 Qt::Key_Return&#xff1b;键盘上的一…

《LeetCode力扣练习》代码随想录——链表(链表相交---Java)

《LeetCode力扣练习》代码随想录——链表&#xff08;链表相交—Java&#xff09; 刷题思路来源于 代码随想录 面试题 02.07. 链表相交 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) {* …

基于SpringBoot的SSMP整合案例(业务层基础开发与快速开发)

业务层基础开发 接口类public interface BookService {boolean save(Book book);boolean update(Book book);boolean delete(Integer id);Book getById(Integer id);List<Book> getAll();IPage<Book> getByPage(int currentPage,int pageSize);IPage<Book> …

ARTS 打卡第一周

ARTS AlgorithmReviewTipShare Algorithm 题目 class Solution {func mergeAlternately(_ word1: String, _ word2: String) -> String {var ans ""var idx1 word1.startIndexvar inx2 word2.startIndexwhile idx1 < word1.endIndex || idx2 < word2.e…

【随想】每日两题Day.17

题目&#xff1a;232. 用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移…

Linux | C语言中volatile关键字的理解

目录 前言 一、代码引入 二、现象解释 三、具体引用 前言 本章主要讲解介绍volatile关键的作用与使用场合&#xff1b;深刻理解volatile关键字&#xff1b;本文你需要有信号相关的基础知识&#xff1b; Linux | 信号-CSDN博客 一、代码引入 首先&#xff0c;我们来查看下面…

upgrade k8s (by quqi99)

作者&#xff1a;张华 发表于&#xff1a;2023-11-17 版权声明&#xff1a;可以任意转载&#xff0c;转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明(http://blog.csdn.net/quqi99) 本文只是从网上搜索一些升级k8s的理论学习&#xff0c;下面的步骤未实际测…

基于C#实现最长公共子序列

一、作用 最长公共子序列的问题常用于解决字符串的相似度&#xff0c;是一个非常实用的算法&#xff0c;作为码农&#xff0c;此算法是我们的必备基本功。 二、概念 举个例子&#xff0c;cnblogs 这个字符串中子序列有多少个呢&#xff1f;很显然有 27 个&#xff0c;比如其…

分发糖果(贪心算法)

题目描述 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xff0c;计算并返回…

(二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、数据集二、导入数据以及展示部分1.导入数据集以及对数据集进行处理2.展示数据&#xff08;看看就好&#xff09; 三&#xff08;1&#xff09;、搭建网络进…

004 OpenCV akaze特征点检测匹配

目录 一、环境 二、akaze特征点算法 2.1、基本原理 2.2、实现过程 2.3、实际应用 2.4、优点与不足 三、代码 3.1、数据准备 3.2、完整代码 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、akaze特征点算法 特征点检测算法…

【数字图像处理】Gamma 变换

在数字图像处理中&#xff0c;Gamma 变换是一种重要的灰度变换方法&#xff0c;可以用于图像增强与 Gamma 校正。本文主要介绍数字图像 Gamma 变换的基本原理&#xff0c;并记录在紫光同创 PGL22G FPGA 平台的布署与实现过程。 目录 1. Gamma 变换原理 2. FPGA 布署与实现 2…