ES6 面试题 | 13.精选 ES6 面试题

在这里插入图片描述

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6
🍨 阿珊和她的猫_CSDN个人主页
🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》
🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

    • 解释ES6中的尾调用和尾递归的概念及其区别
      • 尾调用
      • 尾递归
    • 在编写代码时,如何避免尾调用和尾递归带来的问题?
    • 在ES6中,如何实现尾递归?
    • 递归和迭代有什么不同?
    • 除了尾递归,还有哪些情况会导致栈溢出?

解释ES6中的尾调用和尾递归的概念及其区别

尾调用

尾调用是指一个函数作为另一个函数的最后一条return语句被调用

以下是尾调用和尾递归的代码示例:

const sum = (n, prevSum = 0) => {if (n <= 1) return n + prevSum;return sum(n - 1, n + prevSum);
}

在这个示例中,sum函数是尾递归的,因为它在递归调用时作为最后一个操作。在每次递归调用时,prevSum参数都会被传递给下一次调用,以便在递归结束时计算最终的总和。

尾递归

尾递归是指函数调用自身,如果尾调用自身,就称为尾递归

在ES6中,尾递归不会发生栈溢出,相对节省内存,优化了性能。

尾调用的代码示例:

const fn1 = (a) => {let b = a + 1;return b;
};

在这个示例中,fn1函数作为另一个函数fn2的最后一步被调用,因此它是尾调用。

在编写代码时,如何避免尾调用和尾递归带来的问题?

在编写代码时,可以通过以下方式避免尾调用和尾递归带来的问题:

  • 尽量使用原生方法。
  • 使用switch语句替代if-else语句。
  • 简化变量声明。
  • 合并语句。
  • 使用数组和对象字面量。
  • 去除注释和空行。
  • 减少页面的重排(回流)和重绘。
  • 使用文档碎片减少DOM交互。
  • 多次样式改变属性合并。
  • 使用innerHTML缓存多次使用的特殊属性。
  • 避免使用document.write
  • 优化循环,减少循环中对变量的反复使用。

在这里插入图片描述

这些方法可以帮助你编写更高效、更可靠的代码,避免尾调用和尾递归带来的问题。

在ES6中,如何实现尾递归?

在ES6中,可以使用柯里化实现尾递归。尾递归的实现,往往需要改写递归函数,确保最后一步只调用自身。做到这一点的方法,就是把所有用到的内部变量改写成函数的参数。

函数式编程有一个概念,叫做柯里化(currying),意思是将多参数的函数转换成单参数的形式。例如,要计算n的阶乘,可以将递归函数改写为:

function weiJieCheng(n, total=1) {if (n === 1) {return total;} else {return weiJieCheng(n - 1, n * total);}
}

这样就将尾递归的中间变量改写成了函数的参数,只保存了一个调用记录,复杂度为O(1)。

递归和迭代有什么不同?

递归和迭代是两种常见的算法设计技术,它们在解决问题时有着不同的思路和实现方式。

递归

  • 递归是一种通过自身不断调用自身来解决问题的方法

  • 它将问题分解为更小的子问题,并通过递归调用自身来解决这些子问题。

  • 在递归过程中,每一次调用都会创建一个新的栈帧,用于保存当前的状态信息。

  • 当递归调用返回时,栈帧会依次弹出,直到回到最外层的调用。

  • 递归的优点是代码简洁、易于理解

  • 缺点是可能会导致栈溢出、效率较低

迭代

  • 迭代则是一种通过循环来解决问题的方法
  • 它通过不断执行循环体来逐步解决问题,每次循环都会更新状态信息。
  • 在迭代过程中,不需要创建新的栈帧,因此不会出现栈溢出的问题。
  • 迭代的优点是效率较高、不会出现栈溢出的问题
  • 缺点是代码相对复杂、不易理解

以下是一个使用递归和迭代两种方式计算斐波那契数列的前 10 项的代码示例:

递归方式:

function fibonacci(n) {if (n <= 1) {return n;} else {return fibonacci(n - 1) + fibonacci(n - 2);}
}console.log(fibonacci(10));

迭代方式:

function fibonacci(n) {let fib = [0, 1];for (let i = 2; i < n; i++) {fib.push(fib[i - 1] + fib[i - 2]);}return fib;
}console.log(fibonacci(10));

在这个示例中,递归方式通过不断调用自身来计算斐波那契数列的每一项,而迭代方式则通过循环来计算每一项。

两种方式都可以计算出斐波那契数列的前 10 项,但是递归方式可能会导致栈溢出,而迭代方式则不会。

在实际应用中,需要根据具体情况选择使用递归还是迭代。

如果问题可以通过递归的方式简洁地描述和解决,且不会出现栈溢出的问题,那么可以使用递归。

如果问题需要高效地解决,或者递归可能会导致栈溢出的问题,那么可以使用迭代。

除了尾递归,还有哪些情况会导致栈溢出?

除了尾递归,还有以下情况可能导致栈溢出:

  • 局部数组过大:当函数内部的数组过大时,有可能导致堆栈溢出。
  • 递归调用层次太多:递归函数在运行时会执行压栈操作,当压栈次数太多时,也会导致堆栈溢出。
  • 指针或数组越界:这种情况比较常见,例如进行字符串拷贝,或处理用户输入时,如果对指针或数组的使用超出了其分配的内存空间,也会导致栈溢出。

为了避免栈溢出,可以通过增加栈空间或使用动态分配来解决。同时,在编写代码时,合理地使用递归和循环,以及注意数组和指针的使用边界,也可以减少栈溢出的风险。

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

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

相关文章

深度神经网络在作为人类听觉模型方面显示出了前景

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

android Retrofit2.0请求 延长超时操作

import okhttp3.OkHttpClient; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory;public class MyApiClient {private static final String BASE_URL "https://api.example.com/";// 创建 OkHttpClient&#xff0c;并设置超时时间…

普冉(PUYA)单片机开发笔记(10): I2C通信-配置从机

概述 I2C 常用在某些型号的传感器和 MCU 的连接&#xff0c;速率要求不高&#xff0c;距离很短&#xff0c;使用简便。 I2C的通信基础知识请参见《基础通信协议之 IIC详细讲解 - 知乎》。 PY32F003 可以复用出一个 I2C 接口&#xff08;PA3&#xff1a;SCL&#xff0c;PA2&a…

C++ 运算符重载

目录 前言 算术运算符重载 加号运算符 位运算符重载 左移运算符 自增自减运算符重载 前置自增运算符 后置自增运算符 赋值运算符重载 等号赋值运算符重 关系运算符重载 相等 不等 函数调用运算符重载 总结 前言 在C中&#xff0c;运算符重载是一种强大的特性…

C语言经典错误总结(三)

一.指针与数组理解 我们都知道定义一个数组然后对其进行各种想要的操作&#xff0c;但是你真的能够区分那些是对数组的操作&#xff0c;那些是通过指针实现的吗&#xff1f; 例如;arr[1]10;这个是纯粹对数组操作实现的吗&#xff1f; 答案肯定不是&#xff0c;实际上我们定义…

目标检测YOLO实战应用案例100讲-自动驾驶复杂场景下目标检测(续)

目录 3.2 YOLOv5框架的分析 3.3改进算法的基本思想 3.4改进聚类算法 3.5重构损失函数模型和NMS算法<

HiveSql语法优化四 :Bucket Map Join和Sort Merge Bucket Map Join优化

Bucket Map Join 之前的map join适用场景是大表join小表的情况&#xff0c;但是两张表都相对较大&#xff0c;若采用普通的Map Join算法&#xff0c;则Map端需要较多的内存来缓存数据&#xff0c;当然可以选择为Map段分配更多的内存&#xff0c;来保证任务运行成功。但是&#…

数据可视化---柱状图

import matplotlib.pyplot as plt import numpy as npdef plot_bar_chart(data, labels, colorsNone, title"Bar Chart", xlabel"X-Axis", ylabel"Y-Axis"):"""绘制柱状图&#xff0c;并在柱子上显示数量和比例。:param data: 包…

pytest之allure测试报告03:allure动态自定义报告

1、测试用例模块中引入allure&#xff1a;import allure 2、yaml文件中定义添加title、story的值&#xff1a; 3、测试用例中读取调用。eg:allure.dynamic.title() 4、运行报告查看&#xff1a;成功动态展示yaml文件中配置的story、title

共同编辑文档功能实现(websocket)

目录 前言 websocket封装 wangeditor下载 共同编辑文档代码实现 HTML样式部分 JS部分 css部分 前言 功能&#xff1a;实现文档共同编辑功能&#xff0c;可以实时接收到其他人的信息 思路&#xff1a;先调用接口获取相应的数据进行渲染&#xff0c;然后通过webSocket建…

当 Sealos 遇上区块链

当 Sealos 遇上区块链 拿着区块链技术不一定是去发币&#xff0c;很多业务系统也适合用这些技术&#xff0c;比如做个统一支付系统&#xff0c;积分系统等&#xff0c;可以做为一家公司的金融基础设施&#xff0c;或支付中台。拿链的技术去做有很多好处&#xff1a; 高可用&a…

【图的应用一:最小生成树】- 用 C 语言实现普里姆算法

目录 一、最小生成树 二、普里姆算法的构造过程 三、普里姆算法的实现 一、最小生成树 假设要在 n 个城市之间建立通信联络网&#xff0c;则连通 n 个城市只需要 n - 1 条线路。这时&#xff0c;自然会考虑这样一个问题&#xff0c;如何在最节省经费的前提下建立这个通信…

AUTOSAR汽车电子嵌入式编程精讲300篇-车载CAN总线网关的网络安全协议设计(续)

目录 3.2 网关过滤功能模块设计 3.3 车载网关ID安全等级分类 3.3.1 ID安全等级划分标准

Ansible运行临时命令

Ansible服务的强大之处在于只需要一条命令&#xff0c;便可以操控成千上万台的主机节点&#xff0c;而ansible命令便是最得力的工具之一。前文提到&#xff0c;Ansible服务实际上只是一个框架&#xff0c;能够完成工作的是模块化功能代码。Ansible的常用模块大致有20多个&#…

机器学习之无监督学习

聚类&#xff1a;发掘纵向结构的某种模式信息&#xff0c;某些x属于相同的分布或者类别 特征学习&#xff1a;发掘横向结构的某种模式信息&#xff0c;每一行都可以看成是一种属性或特征 密度估计&#xff1a;发掘底层数据分布&#xff0c;x都是从某个未知分布p(x)采出来的&a…

代码随想录 474. 一和零

题目 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度&#xff0c;该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素&#xff0c;集合 x 是集合 y 的 子集 。 示例 1&#xff1a; 输入&#xff1a;strs [“10…

vue实现悬浮窗拖动的自定义指令

首先在自己的项目根目录下建一个 src --> config --> drag.js 然后在main.js中全局引入 //鼠标拖动 import drag from /config/drag; Vue.use(drag); drag.js文件相关代码 import Vue from vue; //使用Vue.directive()定义一个全局指令 //1.参数一&#xff1a;指令的…

(四)STM32 操作 GPIO 点亮 LED灯 / GPIO工作模式

目录 1. STM32 工程模板中的工程目录介绍 2. GPIO 简介 3. GPIO 框图剖析 1&#xff09;保护二极管及上、下拉电阻 2&#xff09; P-MOS 管和 N-MOS 管 3&#xff09;输出数据寄存器 3.1&#xff09;ODR 端口输出数据寄存器 3.2&#xff09;BSRR 端口位设置/清除寄存器 4&a…

实验六 排序相关典型算法实现

一 实验目的 1&#xff0e;熟悉并掌握各种排序方法的设计思路。 2&#xff0e;掌握各种具体排序算法在计算机上的实现。 3&#xff0e;掌握各种排序方法的性能比较。 二 实验内容及要求 实验内容&#xff1a; 1. 编程实现如下功能&#xff1a; &#xff08;1&#xff09…

CGAL的手柄和循环器

1、手柄 CGAL中的大多数数据结构在其用户界面中使用Handles 的概念来引用它们存储的元素。这个概念描述了有时被称为琐碎迭代器的东西。Handle类似于指向对象的指针&#xff0c;提供解引用运算符*&#xff08;&#xff09;和成员访问运算符->&#xff08;&#xff09;&#…