JS面试题3

news2024/9/20 12:39:37

1、使用递归完成1~100的累加

// 1~100累加
    function addRes(x,y){
         if(x === y){
             return x
         }else{
           return y + addRes(x,y-1) // 第一次:3 + addRes(1,2) => 往后依次递减,到达目标值位置后依次计算累加值
         }
     }
     console.log(addRes(1,3))

// 斐波那契数列(兔子数列) => 第1,2位不参与计算,第3位开始是前两位数值的和:0,1,1,2,3,5,8,13,21,34
     function fn(x){
          if(x === 1){
              return 0; // 如果是第一位数则返回0 => 因为第0位数是固定的,也就是0
          }else if(x=== 2){
              return 1; // 如果是第二位数则返回1 => 因为第1位数是固定的,也就是1
          }else {
              return func(x-1)+ func(x-2); // 左边计算前一位值,右边计算前两位值,依次调用fn后递减得到目标值后计算两个值的和
          }
      }
      console.log(func(5)); // 第5位为3

2、浮点数精度的问题

为什么:console.1og(0.2+0.1==0.3)得到的值为:false

  1. 因为计算机在处理浮点数时有精度问题
  2. 0.2/0.1 这样的浮点数在二进制中不能被精确表示,所以0.2+0.1的结果实际上是一个非常接近0.3但不完全等于0.3的值
  3. 不仅Js,所有遵循IEEE 754规范的语言都是如此

3、什么是严格模式,及使用它的区别

3.1、概念:

  1. 严格模式是从ES5开始新增的一种:在代码执行时,采用更严格解析和错误处理的方式。
  2. 它可以通过在脚本(针对整个脚本文件)函数的开头添加"use strict" 声明来启用

3.2、区别:

  1. 变量声明
    • 普通模式:可以使用未声明的变量,这会隐式创建全局变量。
    • 严格模式:使用未声明的变量会抛出错误。
  2. this 绑定
    • 普通模式:在全局上下文中,this 绑定到全局对象(浏览器中是 window)。
    • 严格模式:在全局上下文中,this 是 undefined。
  3. 删除不可删除的属性
    • 普通模式:删除不可删除的属性不会报错。
    • 严格模式:尝试删除不可删除的属性会抛出错误。
  4. 重复参数
    • 普通模式:函数可以有重复的参数名。
    • 严格模式:函数参数名不能重复。
  5. 八进制字面量
    • 普通模式:允许八进制字面量(如 075)。
    • 严格模式:禁止八进制字面量。
  6. eval
    • 普通模式:eval 中创建的变量在外部作用域可见。
    • 严格模式:eval 有自己的独立作用域,变量不会泄露到外部作用域。
  7. 关键字保护
    • 普通模式:可以将 arguments 或 eval 作为变量名。
    • 严格模式:禁止使用 arguments 或 eval 作为变量名。
  8. 新增错误
    • 普通模式:一些错误被静默忽略。
    • 严格模式:抛出更多错误,帮助发现和修复问题。

4、JS的垃圾回收机制

4.1、 概念:

  1. javaScript具有自动垃圾回收机制,垃圾收集器会按照固定的时间间隔周期性的执行
  2. javaScript常见的垃圾回收方式:标记清除引用计数方式

4.2、垃圾回收方式:

  1. 标记清除方式
    • 当变量进入环境时,将这个变量标记为“进入环境”。
    • 当变量离开环境时,则将其标记为“离开环境”, 然后回收标记为“离开环境”的变量所占用的内存
  2. 引用计数方式
    • 跟踪记录每个值被引用的次数,当引用次数变为0时,释放该值的内存

5、weakmap对象

解释:weakmap对象map对象弱引用版本

  1. Map对象

Map 对象是一种存储键/值对的数据结构,类似于普通的对象,但有以下几个特点:

  • 键名唯一不可重复
  • 类似于集合,是键/值对的集合,任何值都可以作为一个键或者一个值。
  • 可以遍历,可以转换各种数据格式,方法有:get、set、has、delete
  1. WeakMap对象

WeakMap 对象也是用来存储键值对的,但与 Map 有几个关键区别:

  • 只接受对象为键名,不接受其他类型的值作为键名,键值可以是任意
  • 键名是弱引用,键名所指向的对象,会被垃圾回收机制回收
  • 不能遍历,方法有:get、set、has、delete

6、weakset对象

  1. Set对象

Set 对象是一种特殊的集合,用来存储唯一的值,无论是原始值还是对象。它有以下特点:

  1. 成员唯一,无序且不会重复
  2. 类似于数组集合,键值和键名是一致的(只有键值。没有键名)
  3. 可以遍历,方法有:add、delete、hasWeakSet
  4. WeakSet对象

WeakSet是一个类似Set的集合,但有一些重要区别:

  1. 只能存储对应引用,不能存放值
  2. 成员都是弱引用,会被垃圾回收机制回收
  3. 不能遍历,方法有:add、delete、has

7、深/浅拷贝的区别及如何实现?

7.1、浅拷贝:

  1. 定义
    • 创建一个新对象,新对象的属性是原对象属性的引用。
    • 对于对象属性,浅拷贝不会复制内部对象,只复制引用。
  2. 实现
    • 使用 Object.assign
    • 展开运算符({ …obj })进行拷贝。
    • Array.prototype.slice(用于数组)
    • Array.from(用于数组)
  3. 结果
    • 修改新对象中的嵌套对象会影响原对象中的嵌套对象。

7.2、深拷贝:

  1. 定义
    • 创建一个新对象,新对象的所有属性(包括嵌套对象)都是原对象的副本,完全独立于原对象
  2. 实现
    • 使用递归函数手动复制每一层对象。
    • 使用JSON.parse(JSON.stringify(obj))方法,注意:适用于简单对象,不支持函数、undefined 和循环引用
    • 使用第三方库(如 Lodash)
  3. 结果
    • 修改新对象中的嵌套对象不会影响原对象中的嵌套对象。

7.3、总结:

  1. 浅拷贝:复制对象的第一层属性,嵌套对象保持引用。
  2. 深拷贝:递归复制所有层级的属性,完全独立于原对象。

8、JS中的eval方法是什么?一般在什么时候使用?

  1. 定义
    • eval 是一个Js函数,用于将字符串(但要是字符串版的js)当作Js代码执行
  2. 使用场景
    • 动态代码执行,在运行时构建和执行代码。
  3. 注意事项
    • 安全风险:eval 会执行任意代码,可能导致安全漏洞。
    • 性能问题:eval 会影响性能,尽量避免使用。
    • 替代方法:通常可以使用 JSON.parse、Function 构造函数或其他方法代替。

9、什么是函数柯里化

  1. 定义
    • 函数柯里化是:将一个接受多个参数的函数,转换成一系列每次接受一个参数的函数。
  2. 使用场景
    • 参数复用:让函数更灵活,可以在不同的场景中复用参数。
    • 延迟计算:可以分步传递参数,有助于延迟计算和更好地控制函数的执行。
  3. 简单示例:
    函数柯里化简示

10、Node.js中的事件循环,以及和浏览器的事件循环有何不同?

10.1、浏览器的事件循环

  1. 概念
    • 事件循环是:浏览器处理任务的机制。
    • 简单来说:它确保了代码的顺序执行,并处理用户交互和异步任务。
  2. 执行步骤
    • 执行全局代码:
      ■ 浏览器首先会执行你写的同步代码
      ■ 比如在 <script> 标签内的代码,这些代码会按顺序执行,直到完成。
    • 执行微任务:
      ■ 微任务包括Promise的.then/catch().finally() 回调MutationObserver
      ■ 这些任务会在当前执行的脚本结束后立即执行。微任务的优先级高于宏任务(如定时器回调)
    • 执行宏任务
      ■ 宏任务包括 setTimeout、setInterval、setImmediate、I/O 操作等。
      ■ 这些任务会被放到宏任务队列中等待执行。
      ■ 每次循环迭代时,事件循环会从宏任务队列中取出一个任务来执行。
    • 渲染更新
      ■ 如果需要,浏览器会在执行宏任务后进行渲染更新,例如,更新页面布局、绘制新的内容等。
      ■ 这通常在每个事件循环的迭代过程中进行,确保用户看到最新的页面状态。
    • 返回第一步
      ■ 事件循环会继续循环,从步骤 1 开始执行下一个任务,直到所有任务完成。

10.2、Node.js的事件循环

Node.js的事件循环机制基于libuv库(c++库)实现,其执行步骤如下:

  1. 执行全局代码
  2. 执行微任务
  3. 执行宏任务
  4. 事件循环阶段——Node.js的事件循环主要分为六个阶段:
    • timers:执行定时器回调。
    • pending callbacks:执行系统级别的回调。
    • idleprepare:node.js内部使用。
    • poll:处理除了 timers 和 setImmediate 以外的所有回调,比如 I/O 操作。
    • check:执行 setImmediate 的回调。
    • close callbacks:执行一些关闭的回调,比如 socket 的关闭。
  5. 渲染更新
  6. 重复执行

10.3、两者之前的不同

  1. 环境
    • Node.js:用于服务器端,事件循环由libuv库实现。
    • 浏览器:用于客户端,事件循环由浏览器引擎实现(如Chrome的V8和它的事件循环)。
  2. 任务队列
    • Node.js:有多个队列,包括微任务队列(微任务如process.nextTick、Promise的回调)和不同优先级的任务队列(如setImmediate、setTimeout)。
    • 浏览器:有宏任务队列(如setTimeout、setInterval)和微任务队列(如Promise的回调)。
  3. 执行顺序
    • Node.js:每个事件循环阶段处理特定类型的任务,然后处理微任务队列,依次循环。
    • 浏览器:每个事件循环中处理一个宏任务,然后处理所有的微任务。
  4. I/O处理
    • Node.js:高度优化的I/O处理能力,专为处理大量并发I/O操作设计。
    • 浏览器:用于处理用户交互和界面渲染,I/O操作通过异步API完成,如:XMLHttpRequest/fetch
  5. 总之
    • Node.js浏览器的事件循环都负责处理异步任务
    • 但它们的设计和执行顺序有所不同,以适应各自的应用场景。

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

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

相关文章

【HTML5+JavaScript+CSS3】3D空间环绕旋转特效(效果+源码+可理解的注释)

失去一个人,只是生命中的一段过程,天空不会永远都下雨,我们总会在最深的绝望里,看见最美的风景。 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3] 2022年度博客之星人…

案例研究|JumpServer堡垒机为金山办公信息安全保驾护航

金山办公&#xff08;KINGSOFT OFFICE&#xff09;是中国办公软件的领航者&#xff0c;其产品体系以旗舰产品WPS Office为核心&#xff0c;辅以金山文档、金山协作及金山词霸等产品&#xff0c;形成了全方位、高效能的办公生态系统&#xff0c;在中国乃至全球范围内拥有庞大的用…

项目问题 | CentOS 7停止维护导致yum失效的解决办法

目录 centos停止维护意味着yum相关源伴随失效。 报错&#xff1a; 解决方案&#xff1a;将图中四个文件替换掉/etc/yum.repos.d/目录下同名文件 资源提交在博客头部&#xff0c;博客结尾也提供文件源码内容 CentOS-Base.repo CentOS-SCLo-scl.repo CentOS-SCLo-scl-rh.rep…

云计算实训30——自动化运维(ansible)

自动化运维 ansible----自动化运维工具 特点&#xff1a; 部署简单&#xff0c;使用ssh管理 管理端与被管理端不需要启动服务 配置简单、功能强大&#xff0c;扩展性强 一、ansible环境搭建 准备四台机器 安装步骤 mo服务器&#xff1a; #下载epel [rootmo ~]# yum -y i…

mysql数据库连接时区设置UTC的坑?serverTimezone=UTC是什么意思?

Mysql数据库连接&#xff0c;设置时区为UTC的坑&#xff1a; UTC是世界统一时间&#xff0c;也就是世界协调时间&#xff08;UTC&#xff09;/格林尼治时间。比北京时间快8小时。 导致的问题&#xff1a;数据库连接时区设置为UTC之后&#xff0c;数据库里面的数据和系统里面的时…

计算机毕业设计PyHive+PySpark深圳共享单车预测系统 共享单车数据分析可视化大屏 共享单车爬虫 共享单车数据仓库 机器学习 深度学习 Hadoop

题目&#xff1a; 基于hadoop的共享单车布局规划 1. 论文选题的意义 共享单车是一个近年来很热门的新兴事物&#xff0c; 共享经济在我国发展迅速&#xff0c;收到了政府和广大民众的重大关注&#xff0c;而出现的很多问题也引起了众多学者的注意&#xff0c;关于共享单车的研…

【题解】—— LeetCode一周小结32

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结31 5.不含连续1的非负整数 题目链接&#xff1a;600. 不含连续…

Idea2024创建Meavn项目

因为现在Idea创建Meavn项目&#xff0c;文件夹下面是光秃秃的&#xff0c;没有默认文件&#xff0c;这里笔者用简单易懂的方式给大家创建一个带文件夹的项目 1. new -> project | 填写基本信息 2. 设置maven坐标 点击Add > Create 创建的文件没有任何结构 src.main.java…

一个集成物联网、机器学习和大数据实践平台在电气工程课程中的应用

整理自《A Platform for Integrating Internet of Things, Machine Learning, and Big Data Practicum in Electrical Engineering Curricula》&#xff0c;由Nandana Jayachandran、Atef Abdrabou、Naod Yamane和Anwer Al-Dulaimi共同撰写&#xff0c;发表于2024年的《Compute…

【python数据分析05】——matplotlib绘图基础语法

matplotlib绘图基础语法 前言1 pyplot基础语法1.1 创建画布与创建子图1.2 添加画布内容1.3 保存与显示图形1.4 设置pyplot的动态rc参数 前言 matplotlib中应用最广的是matplotlib.pyplot模块&#xff0c;这个模块是一个命令风格函数的集合。 1 pyplot基础语法 大部分pyplot图…

Python文件管理器:一个基于wxPython的桌面应用

在当今的软件开发世界中&#xff0c;管理大量的源代码文件变得越来越重要。无论是个人项目还是大型团队协作&#xff0c;有一个强大而灵活的文件管理工具都可以大大提高工作效率。今天&#xff0c;我们要介绍一个基于Python和wxPython构建的文件管理器&#xff0c;它专门用于管…

GNS3 IOU: License section not found in iourc file /tmp/tmpj54abrhf/iourc

现象&#xff1a; License section not found in iourc file /tmp/tmpj54abrhf/iourc 解决方案&#xff1a; IOU 证书&#xff1a;&#xff08;直接复制进去即可&#xff09; [license] gns3-iouvm cd11acbc599f2364; gns3vm 73635fd3b0a13ad0;

记一个坑android Studio:Can‘t bind to local -1 for debugger

AndroidStudio 可编译,安装,设置管理 现象: 唯独 attach 或者调试时报错 Cant bind to local -1 for debugger 控制台日志: 2024-08-15 10:41:59,645 [ 9927] WARN - #com.android.ddmlib - * daemon not running; starting now at tcp:5037 2024-08-15 10:…

DRISSIONPAGE获取图书的封面并保存到本地

一、页面自动截图 二、最终结果 三、代码实现 from DrissionPage import ChromiumPage,ChromiumOptions co =ChromiumOptions().set_paths(browser_path=r"C:\Users\lenovo\AppData\Local\Google\Chrome\Application\chrome.exe") #这里指定浏览器 注意ChromiumOp…

【Oracle篇】统计信息和动态采样的深度剖析(第一篇,总共六篇)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…

广州南沙某工厂电力运维系统案例

一、引言 深圳拓扑未来基于物联网的电力运维系统将云计算、大数据与人工智能对采集的数据进行挖掘整合、共享交换&#xff0c;并以数字全息投影的信息技术手段将数据立体化呈现。满足用户监测众多电力回路运行状态和参数、配电室内环境温湿度、电缆及母线运行温度、现场设备或…

配置静态ip地址,也叫网络地址,linux安装tomcat,mysql,java的jdk,如何把java项目部署到linux上

3、linux 所需软件压缩包 4、防火墙的操作 5、Linux网络配置 接下来需要配置Linux系统的网络&#xff0c;这样才能保证软件能够正常安装上去 5.1 配置连接外网 进入etc/sysconfig/network-scripts目录&#xff0c;使用vi打开 ifcfg-ensXXX文件&#xff0c;进行编辑 cd /etc…

快速体验Ollama安装部署并支持AMD ROCm推理加速

序言 Ollama 是一个专注于本地运行大型语言模型&#xff08;LLM&#xff09;的框架&#xff0c;它使得用户能够在自己的计算机上轻松地部署和使用大型语言模型&#xff0c;而无需依赖昂贵的GPU资源。Ollama 提供了一系列的工具和服务&#xff0c;旨在简化大型语言模型的安装、…

阵列信号处理1_相控阵天线(CSDN_20240818)

与传统天线相比&#xff0c;相控阵天线的阵面是由许多阵元组成的&#xff0c;在这些阵元的基础上&#xff0c;相控阵天线可以利用一些精妙的算法在天线不旋转的条件下&#xff0c;自动形成波束并对准目标。通常&#xff0c;由相控阵天线形成的波束的质量要比普通天线波束的质量…

LeetCode //C - 319. Bulb Switcher

319. Bulb Switcher There are n bulbs that are initially off. You first turn on all the bulbs, then you turn off every second bulb. On the third round, you toggle every third bulb (turning on if it’s off or turning off if it’s on). For the $i^{th} $roun…