每天10个前端小知识 【Day 9】

news2024/11/28 6:54:04

在这里插入图片描述

前端面试基础知识题

1. bind、call、apply 有什么区别?如何实现一个bind?

apply、call、bind三者的区别在于:

  • 三者都可以改变函数的this对象指向
  • 三者第一个参数都是this要指向的对象,如果如果没有这个参数或参数为undefined或null,则默认指向全局window
  • 三者都可以传参,但是apply是数组,而call是参数列表,且apply和call是一次性传入参数,而bind可以分为多次传入
  • bind 是返回绑定this之后的函数,apply 、call 则是立即执行

实现bind的步骤,我们可以分解成为三部分:

  • 修改this指向
  • 动态传递参数
// 方式一:只在bind中传递函数参数
fn.bind(obj,1,2)()

// 方式二:在bind中传递函数参数,也在返回函数中传递参数
fn.bind(obj,1)(2)
  • 兼容new关键字

整体实现代码如下:

Function.prototype.myBind = function (context) {
    // 判断调用对象是否为函数
    if (typeof this !== "function") {
        throw new TypeError("Error");
    }

    // 获取参数
    const args = [...arguments].slice(1),
          fn = this;

    return function Fn() {
        // 根据调用方式,传入不同绑定值
        return fn.apply(this instanceof Fn ? new fn(...arguments) : context, args.concat(...arguments)); 
    }
}

2. 说说ajax的原理,以及如何实现?

AJAX 全称(Async Javascript and XML)

即异步的 JavaScript 和 XML,是一种创建交互式网页应用的网页开发技术,可以在不重新加载整个网页的情况下,与服务器交换数据,并且更新部分网页

Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用JavaScript来操作DOM而更新页面

流程图如下
在这里插入图片描述
下面举个例子:领导想找小李汇报一下工作,就委托秘书去叫小李,自己就接着做其他事情,直到秘书告诉他小李已经到了,最后小李跟领导汇报工作
Ajax请求数据流程与“领导想找小李汇报一下工作”类似,上述秘书就相当于XMLHttpRequest对象,领导相当于浏览器,响应数据相当于小李.浏览器可以发送HTTP请求后,接着做其他事情,等收到XHR返回来的数据再进行操作
实现 Ajax 异步交互需要服务器逻辑进行配合,需要完成以下步骤:

  • 创建 Ajax 的核心对象 XMLHttpRequest 对象
  • 通过 XMLHttpRequest 对象的 open() 方法与服务端建立连接
  • 构建请求所需的数据内容,并通过 XMLHttpRequest 对象的 send() 方法发送给服务器端
  • 通过 XMLHttpRequest 对象提供的 onreadystatechange 事件监听服务器端你的通信状态
  • 接受并处理服务端向客户端响应的数据结果
  • 将处理结果更新到 HTML 页面中

3. Javascript如何实现继承?

继承(inheritance)是面向对象软件技术当中的一个概念。如果一个类别B“继承自”另一个类别A,就把这个B称为“A的子类”,而把A称为“B的父类别”也可以称“A是B的超类”。继承可以使得子类具有父类别的各种属性和方法,而不需要再次编写相同的代码。在子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能。虽然JavaScript并不是真正的面向对象语言,但它天生的灵活性,使应用场景更加丰富。
JavaScripy常见的继承方式:

  • 原型链继承
  • 构造函数继承(借助 call)
  • 组合继承
  • 原型式继承
  • 寄生式继承
  • 寄生组合式继承
    在这里插入图片描述
    通过Object.create 来划分不同的继承方式,最后的寄生式组合继承方式是通过组合继承改造之后的最优继承方式,而 extends 的语法糖和寄生组合继承的方式基本类似。

4. ES5怎么实现继承

继承这个概念在面向对象编程思想里面十分重要,也是面试必考的考点之一。javascript的继承主要是依托其原型与原型链的概念来实现的。

ECMAscript将原型链作为实现继承的主要方法。

ES6提供了Class关键字来实现类的定义,Class 可以通过extends关键字实现继承,让子类继承父类的属性和方法。

ES5的四种常用的实现方式:原型链继承、构造函数继承、组合式继承、寄生式组合继承。

  • 说到js继承,最开始想到的应该是是原型链继承,通过把子类实例的原型指向父类实例来继承父类的属性和方法,但原型链继承的缺陷在于对子类实例继承的引用类型的修改会影响到所有的实例对象以及无法向父类的构造方法传参。
  • 构造函数继承, 通过在子类构造函数中调用父类构造函数并传入子类this来获取父类的属性和方法,但构造函数继承也存在缺陷,构造函数继承不能继承到父类原型链上的属性和方法。
  • 后面有了组合式继承,但也有了新的问题,每次都会执行两次父类的构造方法,最终有了寄生式组合式继承。

5. JavaScript中的原型,原型链分别是什么?

原型
JavaScript 常被描述为一种基于原型的语言——每个对象拥有一个原型对象
当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。准确地说,这些属性和方法定义在Object的构造器函数(constructor functions)之上的prototype属性上,而非实例对象本身
下面举个例子:
函数可以有属性。 每个函数都有一个特殊的属性叫作原型prototype

function doSomething(){}
console.log( doSomething.prototype );

控制台输出

{
    constructor: ƒ doSomething(),
    __proto__: {
        constructor: ƒ Object(),
        hasOwnProperty: ƒ hasOwnProperty(),
        isPrototypeOf: ƒ isPrototypeOf(),
        propertyIsEnumerable: ƒ propertyIsEnumerable(),
        toLocaleString: ƒ toLocaleString(),
        toString: ƒ toString(),
        valueOf: ƒ valueOf()
    }
}

上面这个对象,就是大家常说的原型对象。可以看到,原型对象有一个自有属性constructor,这个属性指向该函数,如下图关系展示:
原型链
在这里插入图片描述

原型对象也可能拥有原型,并从中继承方法和属性,一层一层、以此类推。这种关系常被称为原型链 (prototype chain),它解释了为何一个对象会拥有定义在其他对象中的属性和方法。在对象实例和它的构造器之间建立一个链接(它是__proto__属性,是从构造函数的prototype属性派生的),之后通过上溯原型链,在构造器中找到这些属性和方法

下面举个例子:

function Person(name) {
    this.name = name;
    this.age = 18;
    this.sayName = function() {
        console.log(this.name);
    }
}
// 第二步 创建实例
var person = new Person('person')

根据代码,我们可以得到下图
在这里插入图片描述

下面分析一下:

  • 构造函数Person存在原型对象Person.prototype
  • 构造函数生成实例对象person,person的__proto__指向构造函数Person原型对象
  • Person.prototype.proto 指向内置对象,因为 Person.prototype 是个对象,默认是由 Object 函数作为类创建的,而 Object.prototype 为内置对象
  • Person.proto 指向内置匿名函数 anonymous,因为 Person 是个函数对象,默认由 Function 作为类创建
  • Function.prototype 和 Function.proto 同时指向内置匿名函数 anonymous,这样原型链的终点就是 null

总结

下面首先要看几个概念:
__proto__作为不同对象之间的桥梁,用来指向创建它的构造函数的原型对象的
在这里插入图片描述

每个对象的__proto__都是指向它的构造函数的原型对象prototype的

1person1.__proto__ === Person.prototype

构造函数是一个函数对象,是通过 Function 构造器产生的

1Person.__proto__ === Function.prototype

原型对象本身是一个普通对象,而普通对象的构造函数都是Object

1Person.prototype.__proto__ === Object.prototype

刚刚上面说了,所有的构造器都是函数对象,函数对象都是 Function 构造产生的

1Object.__proto__ === Function.prototype

Object 的原型对象也有__proto__属性指向null,null是原型链的顶端

1Object.prototype.__proto__ === null

下面作出总结:

  • 一切对象都是继承自Object对象,Object 对象直接继承根源对象 null
  • 一切的函数对象(包括 Object 对象),都是继承自 Function 对象
  • Object 对象直接继承自 Function 对象
  • Function对象的__proto__会指向自己的原型对象,最终还是继承自Object对象

6. 怎么预防按钮的重复点击?

先看看在那些场景会导致重复请求:

1.手速快,不小心双击操作按钮。
2.很小心的点击了一次按钮,因为请求响应比较慢,页面没有任何提示,怀疑上次点击没生效,再次点击操作按钮。
3.很小心的点击了一次按钮,因为请求响应比较慢,页面没有任何提示,刷新页面,再次点击操作按钮。

前端方案

我们可以对症下药:

1.控制按钮,在短时间内被多次点击,第一次以后的点击无效。
2.控制按钮,在点击按钮触发的请求响应之前,再次点击无效。
3.配置特殊的URL,然后控制这些URL请求的最小时间间隔。如果再次请求跟前一次请求间隔很小,弹窗二次提示,是否继续操作。

7. 岛屿数量

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。

8. promise.catch后面的.then还会执行吗?

会继续执行。

虽然Promise是开发过程中使用非常频繁的一个技术点,但是它的一些细节可能很多人都没有去关注过。我们都知道.then, .catch, .finally都可以链式调用,其本质上是因为返回了一个新的Promise实例。

catch的语法形式如下:

1p.catch(onRejected);

.catch只会处理rejected的情况,并且也会返回一个新的Promise实例。
.catch(onRejected)与then(undefined, onRejected)在表现上是一致的。
事实上,catch(onRejected)从内部调用了then(undefined, onRejected)。

  • 如果.catch(onRejected)的onRejected回调中返回了一个状态为rejected的Promise实例,那么.catch返回的Promise实例的状态也将变成rejected。
  • 如果.catch(onRejected)的onRejected回调中抛出了异常,那么.catch返回的Promise实例的状态也将变成rejected。
  • 其他情况下,.catch返回的Promise实例的状态将是fulfilled。

9. 前端怎么实现跨域请求?

CORS、Nginx代理跨域、Node中间件代理跨域、WebSocket、postMessage、JSONP
具体描述请点击此链接

10. 怎么实现图片懒加载?

懒加载是一种网页性能优化的方式,它能极大的提升用户体验。就比如说图片,图片一直是影响网页性能的主要元凶,现在一张图片超过几兆已经是很经常的事了。如果每次进入页面就请求所有的图片资源,那么可能等图片加载出来用户也早就走了。所以,我们需要懒加载,进入页面的时候,只请求可视区域的图片资源。

总结出来就两个点:

全部加载的话会影响用户体验
浪费用户的流量,有些用户并不想全部看完,全部加载会耗费大量流量。

html 实现:实现方式是给 img 标签加上 loading=“lazy”

js 实现:原理通过js监听页面的滚动也能实现。

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

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

相关文章

智能硬件的工作原理与发展定位

一、硬件概述 智能硬件是以平台性底层软硬件为基础,以智能传感互联、人机交互、新型显示及大数据处理等新一代信息技术为特征,以新设计、新材料、新工艺硬件为载体的新型智能终端产品及服务。 与传统硬件相比,智能硬件相比传统硬件&#xf…

【LeetCode每日一题】【2023/2/9】1797. 设计一个验证系统

文章目录1797. 设计一个验证系统方法1:哈希表代码总体1797. 设计一个验证系统 LeetCode: 1797. 设计一个验证系统 中等\color{#FFB800}{中等}中等 你需要设计一个包含验证码的验证系统。每一次验证中,用户会收到一个新的验证码,这个验证码在…

java 线程池

线程池概念 线程池可以看做是一个池子,在这个池子中存储了很多线程,线程池也可以说是一个复用线程的技术。 线程池存在的意义 系统创建一个线程的成本是比较高的,因为它涉及到与操作系统交互,当程序中需要创建大量生存期很短暂的线…

ChatGPT edge/chrome浏览器离线安装

最近chatgpt又热了起来,数据显示很多朋友过来下载浏览器插件,由于大家无法直接访问谷歌应用市场,因此提供一个离线安装的方式。 火热程度 对于大多资本与巨头来说,入局ChatGPT赛道,看中的无疑是ChatGPT概念背后的…

【自学Docker】Docker push命令

大纲 Docker push命令 docker push命令教程 docker push 命令用于将本地的 Docker镜像 上传到 Docker镜像仓库。 docker push命令使用之前需要要先登陆到镜像仓库。docker push命令推送镜像的规范是:注册用户名/镜像名。 docker push命令语法 haicoder(www.hai…

矩阵理论复习(十一)

正交投影矩阵的应用 值域与零空间 证明向量二范数 如何由已知范数构造新的范数 椭圆范数 向量范数的分析性质 向量范数的等价性 在无限维线性空间中,两个向量范数可以是不等价的。 等价性的重要意义:处理向量问题时,可以基于一种范…

ASO优化之如何进行榜单优化

ASO优化有:搜索优化,榜单优化,转化率优化。今天我们主要来讲讲苹果应用商店的榜单优化。 榜单优化的核心内容就是提高应用商城的排名,把我们的APP提升到显眼的位置,增加曝光率,提升APP的下载量。 那我们具…

easyx的基本使用(万字解析)

easyx的基本使用一.基本框架1.创建文件2.创建窗体-initgraph,closegraph,getchar二.简单的绘制1.圆形-circle2.坐标系统-setorigin,setaspectratio三.简单图形1.绘制点-putpixel2.简单的直线-line3.矩形-rectangle4.椭圆-ellipse5.圆角矩形-roundrect6.扇形-pie7.圆弧-arc四.多…

目标检测回归损失函数 IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU损失函数分析

目标检测回归损失函数 IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU损失函数分析 一、IOU Loss 2016文章《UnitBox: An Advanced Object Detection Network》中提出了IOU Loss将4个点构成的box看成一个整体做回归。 函数特性 IOU Loss的定义是先求出预测框和真实框…

UML的分类

一、UML2.0的正式图型 UML标准术语:UML标准术语_pingcode的博客-CSDN博客 英文名中文术语目的联系Class Diagram类图类、特征与关系UML1.x中有Component Diagram构件图构件的结构和连接UML1.x中有Composite Structure Diagram组合结构图类的运行时刻分解UML2.0的新…

前端——http的三次握手四次挥手

首先要知道在客户端与服务器端进行一个 http 请求的发送和返回的过程当中,我们需要创建一个 TCP 连接(TCP connection);因为 http 只存在请求和响应,不存在连接这个概念的;请求和响应都是数据包&#xff0c…

牛客网 HJ56 完全数计算

前言:内容包括四大模块:题目,代码实现,大致思路,代码解读 题目: 描述 完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。 它所有的真因子…

sed和awk

文章目录1、sed的简单介绍2、sed的使用方法2.1 命令行格式2.2 案例2.3 sed结合正则使用2.4 脚本格式3、awk的简单介绍4、awk的使用方法4.1 命令行模式4.2 脚本模式5、awk内部相关变量5.1 案例6、awk工作原理7、awk进阶使用8、awk脚本编程8.1 案例1、sed的简单介绍 sed是流编辑…

【计算机网络】Linux环境中的网络套接字编程

文章目录前言一、预备知识理解源IP地址和目的IP地址认识端口号认识UDP协议和TCP协议了解网络字节序二、socket 套接字socket 常见APIsockaddr 和 sockaddr_in三、UDP Socket编程封装UdpSocket实现UDP通用服务器实现英译汉服务器实现UDP通用客户端实现英译汉客户端四、地址转换函…

一文详解Yolov5——基于Yolov5的火灾检测系统

✨原创不易,还希望各位大佬支持一下\textcolor{blue}{原创不易,还希望各位大佬支持一下}原创不易,还希望各位大佬支持一下 👍 点赞,你的认可是我创作的动力!\textcolor{green}{点赞,你的认可是…

SAP ERP系统实施隐式增强中“声明“和“代码“的区别和用途介绍

SAP ERP系统在实施隐式增强的时候会跳出一个增强模式选择“声明”或者“代码”,这步骤应该如何选择对于刚接触这类增强的开发人员通常会感到疑惑,不知道应该选择哪个(如下图)。 点击“信息”可以看到官方的英文的解释如下: 这两个选项有什…

通达信收费接口查询可申购新股c++源码分享

有很多股民在做股票交易时为了实现盈利会借助第三三方炒股工具帮助自己&#xff0c;那么通达信收费接口就是人们常用到的&#xff0c;今天小编来分享一下通达信收费接口查询可申购新股c源码&#xff1a; std::cout << " 查询可申购新股: category 12 \n"; c…

maven的学习与理解之 maven的下载与配置文件的修改

maven的学习之maven的下载与配置文件的修改 maven的下载 maven的下载地址&#xff1a; <http://us.mirrors.quenda.co/apache/maven/maven-3/3.5.4/binaries/maven的安装 zip文件下载之后 解压到没有中文的路径下 这个路径后面maven项目使用频繁 建议路径简单…

电商销量查询:鲸参谋2023年1月平板电视品牌销售数据

根据鲸参谋平台的电商数据显示&#xff0c;1月份在京东平台上各类大家电的销售中&#xff0c;平板电视销售量共计210万件左右&#xff0c;总销售量排名第一&#xff0c;环比增长了26.43%&#xff0c;领先于洗衣机、冰箱、冷柜和空调等热销大家电。 ​*数据源于鲸参谋-类目排行分…

C语言--数据的存储1

目录数据类型的介绍类型的意义类型的基本归类整形家族浮点型家族构造类型--自定义类型指针类型空类型整形在内存中的存储大小端大小端如何区分为什么会有大小端判断机器字节序从本章开始&#xff0c;我们将正式进入C语言的进阶学习中。本篇内容我们将学习 数据的存储数据类型的…