高阶函数的面试

news2024/11/23 15:14:00
  1. 说说JS原型和原型链

原型:函数都有prototype(显示原型)属性,而prototype会自动初始化一个空对象,这个对象就是原型对象

原型对象中会有一个constructor属性,这个属性将指向了函数本身

实例化对象都有一个_proto_(隐式原型)属性,_proto_属性指向原型对象

原型链:从实例对象往上找构造这个实例的相关对象,然后这个关联的对象再往上找,找到创造它的上一级的原型对象,以此类推,一直到object.prototype原型对象终止,原型链结束.

原型链中的原型对象中的内容,是会被不同的实例,所共有的

 

  1. ☆call和apply的区别和作用?

apply和call都是调用一个对象的一个方法,用另一个对象替换当前对象。

相同点:方法的含义是一样的,即方法功能是一样的。并且第一个参数的作用是一样的

不同点:call可以传入多个参数、apply只能传入两个参数,所以其第二个参数往往是作为数组形式传入

存在意义:实现(多重)继承

  1. 继承的方法有哪些?手写ES6 class继承

原型链继承、构造继承、实例继承、拷贝继承、组合继承、寄生组合继承

//定义一个类

        class Children{

            constructor(skin,language){

                this.skin = skin;

                this.language = language;

            }

            say(){

                console.log("I'm a Person")

            }

        }   

        class American extends Children{

            constructor(skin,language){

                super(skin,language)

            }

            aboutMe(){

                console.log(this.skin+" "+this.language)

            }

        }

        var m = new American("张三","中文");

        m.say();

     m.aboutMe();

1)子类没有constructor

子类American继承父类Person,子类没用定义constructor则默认添加一个,并且在constructor中调用super函数,相当于调用父类的构造函数。调用super函数是为了在子类中获取父类的this,调用之后this指向子类。也就是父类prototype.constructor.call(this)

  1. 子类有constructor

子类必须在constructor方法中调用super方法,否则new实例时会报错。因为子类没有自己的this对象,而是继承父类的this对象。如果不调用super函数,子类就得不到this对象。super()作为父类的构造函数,只能出现在子类的constructor()中,但是super指向父类的原型对象,可以调用父类的属性和方法。

  1. ☆什么是闭包?闭包有什么作用?

由于在js中,变量到的作用域属于函数作用域,在函数执行后作用域会被清除、内存也会随之被回收,但是由于闭包是建立在一个函数内部的子函数,由于其可访问上级作用域的原因,即使上级函数执行完,作用域也不会随之销毁,这时的子函数---也就是闭包,便拥有了访问上级作用域中的变量权限,即使上级函数执行完后,作用域内的值也不会被销毁。

闭包解决了什么:在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

由于闭包可以缓存上级作用域,那么就使得函数外部打破了“函数作用域”的束缚,可以访问函数内部的变量。以平时使用的Ajax成功回调为例,这里其实就是个闭包,由于上述的特性,回调就拥有了整个上级作用域的访问和操作能力,提高了几大的便利。开发者不用去写钩子函数来操作审计函数作用域内部的变量了。

闭包有哪些应用场景:

闭包随处可见,一个Ajax请求的成功回调,一个事件绑定的回调函数,一个setTimeout的延时回调,或者一个函数内部返回另一个匿名函数,这些都是闭包。简而言之,无论使用何种方式对函数类型的值进行传递,当函数在别处被调用时都有闭包的身影

闭包的缺陷:由于闭包打破了函数作用域的束缚,导致里面的数据无法清除销毁,当数据过大时会导致数据溢出

  1. ☆new操作符在创建实例的时候经历了哪几个阶段

new创建了一个对象,共经历了4个阶段:

  1. 创建一个空对象
  2. 设置原型链
  3. 让实例化对象中的this指向对象,并执行函数体
  4. 判断实例化对象的返回值类型

  1. 什么是深拷贝和浅拷贝?
  1. 深拷贝和浅拷贝值针对Object和Array这样的复杂类型
  2. a和b指向了同一块内存,所以修改其中任意一个值,另外一个值也会随之变化,这是浅拷贝
  3. a和b指向同一块内存,但是修改其中任意一个值,另外一个调用的变量,不会受到影响,这是深拷贝
  4. 浅拷贝:“Object.assign()”方法用于将所有可枚举的属性的值从一个或多个源对象复制到目标对象,它将返回目标对象
  5. 深拷贝:JSON.parse( )和JSON.stringify( )给了我们一个基本的解决办法。但是函数不能被正确处理

  1. 列举常用的ES6特性
  1. let、const
  2. 箭头函数
  3. class类的支持
  4. 字符串模块
  5. symbol
  6. Promise

  1. let、const、var的区别

var声明变量的作用域限制在其声明位置的上下文中,而非声明变量总是全局的

  由于变量声明(以及其他声明)总是在任意代码执行之前处理的,所以在代码中的任意位置声明变量总是等效于在代码开头声明;

let是更完美的var,不是全局变量,具有块级函数作用域,大多数情况不会发生变量提升。

  1. let声明的变量具有块级作用域
  2. let生命的变量不能通过window.变量名访问
  3. 形如for(let x...)的循环是每次迭代都为x创建新的绑定
  4. let约束了变量提升
  5. let不允许在相同作用域内重复声明同一个变量名,var是允许的

const定义的常量值,不能够重新赋值,如果值是一个对象,可以改变对象里边的属性值。const变量声明的时候必须初始化

  1. 简单介绍一下promise和async/await

Promise

简单来说就是一个容器,里面保存着某个未来才会结束的时间(通常是一个异步操作的结果)

基本语法:  let p = new Promise((resolve,reject) => {

        //...

        resolve('success')

    });

    

    p.then(result => {

        console.log(result);//success

});

promise共有三个状态: pending(执行中)/success(成功)/rejected(失败)

async/await:

简洁: 异步编程的最高境界就是不关心它是否是异步.async await很好的解决了这一点,将异步强行转换为同步处理.

async/await与promise不存在谁代替谁的说法,因为async、await是寄生于Promise、Generater的语法糖

用法:

1. async和await是配对使用的,await存在于async的内部,否则报错

2. await表示在这里等待一个promise返回,再接下来执行

区别:

  1. promise是ES6,async、await是ES7
  2. async/await相对于promise来讲,写法更加优雅
  3. reject状态
    1. promise错误可以通过catch来捕捉,建议尾部捕获错误
    2. async、await既可以用.then又可以用try-catch捕捉
  1. 什么是面向对象?

面向过程就是分析出解决问题所需要的步骤,然后用函数吧这些步骤一步一步实现,使用的时候一个一个一次调用就可以了

面向对象是把构成问题事务分解成各个对象,建立帝乡的目的不是为了完成一个步骤,而是为了描述某个事务在整个解决问题的步骤中的行为

面向对象的三大特性:

1、封装
隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。
2、继承
提高代码复用性;继承是多态的前提。
3、多态
父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性。

五大基本原则:

1、单一职责原则SRP(Single Responsibility Principle)
类的功能要单一,不能包罗万象,跟杂货铺似的。
2、开放封闭原则OCP(Open-Close Principle)
一个模块对于拓展是开放的,对于修改是封闭的,想要增加功能热烈欢迎,想要修改,哼,一万个不乐意。
3、里式替换原则LSP(the Liskov Substitution Principle LSP)
子类可以替换父类出现在父类能够出现的任何地方。比如你能代表你爸去你姥姥家干活。哈哈~~
4、依赖倒置原则DIP(the Dependency Inversion Principle DIP)
高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。就是你出国要说你是中国人,而不能说你是哪个村子的。比如说中国人是抽象的,下面有具体的xx省,xx市,xx县。你要依赖的是抽象的中国人,而不是你是xx村的。
5、接口分离原则ISP(the Interface Segregation Principle ISP)
设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。就比如一个手机拥有打电话,看视频,玩游戏等功能,把这几个功能拆分成不同的接口,比在一个接口里要好的多。

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

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

相关文章

Spring基于注解读取和存储对象

目录 一. 存储 Bean 对象 1. 前置工作:配置扫描路径 2. 使用五大类注解存储Bean对象 Controller 命名规则 Service Repository Compoent Configuration 五大类注解之间的关系 3. 使用方法注解存储Bean对象 二. 获取 Bean 对象 1. 属性注入 优点分析 缺…

详解C语言string.h中常用的14个库函数(二)

本篇博客继续讲解string.h中的库函数。在上一篇博客中,我介绍了strlen, strcpy, strcat, strcmp这4个字符串操作函数,本篇博客会继续介绍strncpy, strncat, strncmp这3个类似的函数。 strcpy, strcat, strcmp这3个函数是长度不受限制的字符串操作函数&a…

预算约束下营销效果优化的端到端框架(快手)

目录 翻译:预算约束下营销效果优化的端到端框架 1介绍 2 .相关工作 2.1预算分配 2.2梯度估计 3我们的端到端框架 3.1符号 ​3.2两阶段范式 3.3 Marketing Goal as a Regularizer 3.4梯度估计 ​3.5训练 4实验结果 4.1数据集 4.2评价指标 4.3实现细节 …

Windows环境下NVM安装后Node/NPM命令无法使用

问题:Windows环境下安装nvm后,使用nvm安装node,无法使用node相关命令。 解决方案:注意安装的时候有两个路径,第一个是nvm所在的路径,第二个是nodejs所在的路径,大家需要在对应的目录下找到路径…

基于SSM的电影订票管理系统

有需要请私信或看评论链接哦 可远程调试 基于SSM的电影订票管理系统 一 介绍 基于SSM的电影订票管理系统,本项目分为前台和后台,登录角色分为普通用户和管理员。用户可注册登录,个人中心,搜索电影,选座购票&#xff…

机器学习——损失函数(lossfunction)

问:非监督式机器学习算法使用样本集中的标签构建损失函数。 答:错误。非监督式机器学习算法不使用样本集中的标签构建损失函数。这是因为非监督式学习算法的目的是在没有标签的情况下发现数据集中的特定结构和模式,因此它们依赖于不同于监督…

QMS-云质说质量 - 5 解决中小企业质量问题的钥匙在哪里?

云质QMS原创 转载请注明来源 作者:王洪石 引言 一个小小的质量问题可能引发蝴蝶效应 日常生活中,我们每天都会遇到各种各样的问题,并随着它们喜怒哀乐。企业也不例外,即使有很好的管理体系以及非常高素质的员工,一些错…

XGBoost模型详解

1.什么是XGBoost? GBDT,它是一种基于boosting增强策略的加法模型,训练的时候采用前向分布算法进行贪婪的学习,每次迭代都学习一棵CART树来拟合之前 t − 1 t-1 t−1 棵树的预测结果与训练样本真实值的残差。XGBoost对GBDT进行了一…

C/C++每日一练(20230424)

目录 1. 只出现一次的数字 🌟 2. 有效的括号 🌟🌟 3. 递归反序正整数 🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 只出现一次…

《站在巨人的肩膀上学习Java》

Java从诞生距今已经有28年了,在这段时间里,随着Java版本的不断迭代,Java新特性的不断出现,使得Java被使用的越来越广泛。在工程界Java语言一直是大家最喜欢的语言之一,Java一直排行在编程语言热门程度的前3名。 可想而…

ora_scm0导致主机负载高

今天不知道了,几个12.2 RAC出问题,有现场反馈主机负载高,之前连接过该环境,知道是12.2环境,直接top查看,发现ora_scm0经常cpu使用率100%了,查看hydb1主机负载正常 直接上mos文档 12.2 RAC DB B…

字节和阿里,谁的管理模式更先进?

有人说,字节跳动的成功,是商业模式和管理模式的成功。不无道理,相比阿里巴巴以KPI绩效考核、强制淘汰的组织管理模式来说,字节的模式有其先进的地方。 在商业模式上,字节用算法的方式,10倍速地提升了信息分…

2023.04.24 c++第六讲

作业&#xff1a; 1. 手动实现顺序栈&#xff0c;要求实现数据结构中&#xff0c;所有栈的相关操作 #include <iostream> #define MAXSIZE 20 //宏定义&#xff0c;栈的最大容量 using namespace std;template <typename T> class stacklink { pri…

ESXi8.0安装Windows10系统教程

本篇教程主要教大家怎么在ESXi虚拟机上安装Windows10系统&#xff0c;首先安装Windows10需要准备一个ISO系统镜像文件&#xff0c;我们可以去MSDN或者是微软官网下载。 镜像下载教程&#xff1a; 下两种方法都可以下载ISO镜像文件&#xff0c;任选其一下载即可 方法一&#xf…

BDD110 HNLP205879R1设备控制、监视、报警及打印报表等管理功能

​ BDD110 HNLP205879R1设备控制、监视、报警及打印报表等管理功能 基于ABB AC500系列PLC的水泥生产线控制系统 随着中国经济的迅速发展&#xff0c;各行各业对水泥的需求日益增加。目前国内外各大水泥企业纷纷在华兴建大型干法旋窑水泥生产线&#xff0c;这为水泥行业的发展提…

【SWAT水文模型】ArcSWAT安装

SWAT水文模型-ArcSWAT安装 安装ArcSWAT1.1 下载ArcSWAT1.2 安装ArcSWAT1.3 加载ArcSWAT 参考 SWAT水文模型原理及数据库简介可参见另一博客文章-【水文模型】SWAT水文模型原理及数据库简介。 本博客主要介绍ArcSWAT的安装。 安装ArcSWAT 1.1 下载ArcSWAT 安装之前&#xff0…

广域通信网 - 差错控制(停等 ARQ 协议、选择重发 ARQ 协议、后退 N 帧 ARQ 协议)

文章目录 1 概述2 差错控制的办法2.1 停等 ARQ 协议2.2 选择重发 ARQ 协议2.3 后退 N 帧 ARQ 协议 3 扩展3.1 流量控制3.2 网工软考真题 1 概述 #mermaid-svg-ju8w1gQxodkcBbaB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#me…

【应急响应】后门攻击检测指南Rookit内存马权限维持WINLinux

文章目录 Windows实验常规后门&#xff1a; 网络对外连接查看 自启动测试&#xff1a;隐藏账户映像劫持屏保&登录 Linux实验常规后门&#xff1a;Rootkit后门&#xff1a;GScan rkhunter权限维持后门&#xff1a;GScan rkhunter Web层面&#xff1a;通用系统层面 主机层面后…

网络设备发现工具

什么是网络设备发现 网络设备发现是识别和映射网络基础架构&#xff08;如路由器、交换机、集线器、防火墙、无线接入点、服务器、虚拟机等&#xff09;中存在的设备和接口的过程。网络发现是网络管理的第一步&#xff0c;也是成功监控解决方案的关键。该过程不仅涉及发现网络…

【超算/先进计算学习】日报6

目录 今日已完成任务列表遇到的问题及解决方案任务完成详细笔记传统性能优化从体系结构角度理解四种计算优化途径-主频/缓存/流水线/超标量优化途径的有效适用条件存储墙与层次式存储结构数据局部性与cache循环合并循环展开循环交换循环分布循环不变量外提循环分块循环分裂 优化…