2024 高级前端面试题之 JS 「精选篇」

news2024/10/3 0:23:56

该内容主要整理关于 JS 的相关面试题,其他内容面试题请移步至 「最新最全的前端面试题集锦」 查看。

JS模块精选篇

  • 1. 数据类型基础
      • 1.1 JS内置类型
      • 1.2 null和undefined区别
      • 1.3 null是对象吗?为什么?
      • 1.4 '1'.toString()为什么可以调用?
      • 1.5 0.1+0.2为什么不等于0.3?如何让其相等
      • 1.6 如何理解BigInt
      • 1.7 JS 整数是怎么表示的
      • 1.8 Number() 的存储空间是多大?如果后台发送了一个超过最大自己的数字怎么办
  • 2. 数据类型检测
  • 3. 数据类型转换
  • 4. 闭包
  • 5. 原型和原型链链
  • 6. 继承
  • 7. this
  • 8. 内存机制
  • 9. 执行上下文
  • 10. 变量提升
  • 11. 模块化
  • 12. 异步编程
  • 13. 内存泄露
  • 14. 垃圾回收机制
  • 15. 深浅拷贝
  • 16. 对象的几种创建方式
  • 17. 数组相关
  • 18. 操作DOM
  • 19. Ajax总结
  • 20. 定时器
  • 21. 谈谈你对for in/for of的理解
  • 22. JavaScript 实现对上传图片的压缩?


1. 数据类型基础

1.1 JS内置类型

  • JS 中分为七种内置类型,七种内置类型又分为两大类型:基本类型和对象(Object)。

基本类型

  • 有七种: nullundefinedbooleannumberstringsymbol, bigint
    • Symbol 代表独一无二的值,最大的用法是用来定义对象的唯一属性名。
    • BigInt 可以表示任意大小的整数,是 ES10 新增的数据类型。
  • 其中 JS 的数字类型是浮点类型的,没有整型。并且浮点类型基于 IEEE 754 标准实现,在使用中会遇到某些 Bug。NaN 也属于 number 类型,并且 NaN 不等于自身。
  • 对于基本类型来说,如果使用字面量的方式,那么这个变量只是个字面量,只有在必要的时候才会转换为对应的类型。

引用数据类型

  • 对象Object(包含普通对象— Object,数组对象—Array,正则对象—RegExp,日期对象—Date,数学函数—Math,函数对象—Function

  • 对象(Object)是引用类型,在使用过程中会遇到 浅拷贝深拷贝 的问题。

    👇 示例

    function test(person) {
      person.age = 26
      person = {
        name: 'hzj',
        age: 18
      }
      return person
    }
    const p1 = {
      name: 'fyq',
      age: 19
    }
    const p2 = test(p1)
    console.log(p1) // -> ?
    console.log(p2) // -> ?
    

    👇 结果

    p1:{name: “fyq”, age: 26}
    p2:{name: “hzj”, age: 18}
    

    原因: 在函数传参的时候传递的是对象在堆中的内存地址值,test函数中的实参 person 是p1对象的内存地址,通过调用 person.age = 26 确实改变了p1的值,但随后 person 变成了另一块内存空间的地址,并且在最后将这另外一份内存空间的地址返回,赋给了p2。

1.2 null和undefined区别

Undefined

  • Undefined 类型只有一个值,即 undefined。当声明的变量还未被初始化时,变量的默认值为undefined

  • 用法:

    • 变量被声明了,但没有赋值时,就等于undefined
    • 调用函数时,应该提供的参数没有提供,该参数等于undefined
    • 对象没有赋值的属性,该属性的值为undefined
    • 函数没有返回值时,默认返回undefined

Null

  • Null类型也只有一个值,即nullnull用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。

  • 用法:

    • 作为函数的参数,表示该函数的参数不是对象。
    • 作为对象原型链的终点。

1.3 null是对象吗?为什么?

结论: null 不是对象。

解释: 虽然 typeof null 会输出 object,但是这只是 JS 存在的一个悠久 Bug。在 JS 的最初版本中使用的是 32 位系统,为了性能考虑使用低位存储变量的类型信息,000 开头代表是对象然而 null 表示为全零,所以将它错误的判断为 object

1.4 ‘1’.toString()为什么可以调用?

在这个语句运行的过程中做了这样几件事情:

var s = new Object('1');
s.toString();
s = null;

第一步: 创建 Object 类实例。注意为什么不是 String ? 由于 SymbolBigInt 的出现,对它们调用 new 都会报错,目前 ES6 规范也不建议用 new 来创建基本类型的包装类。
第二步: 调用实例方法。
第三步: 执行完方法立即销毁这个实例。

整个过程体现了基本包装类型的性质,而基本包装类型恰恰属于基本数据类型,包括 Boolean, NumberString

1.5 0.1+0.2为什么不等于0.3?如何让其相等

0.10.2 在转换成二进制后会无限循环,由于标准位数的限制后面多余的位数会被截掉,此时就已经出现了精度的损失,相加后因浮点数小数位的限制而截断的二进制数字在转换为十进制就会变成 0.30000000000000004

我们都知道计算机时是通过二进制来进行计算的,即 01

就拿 0.1 + 0.2 来说,0.1表示为 0.0001100110011001...,而 0.2 表示为0.0011001100110011...
而在二进制中 1 + 1 = 10,所以 0.1 + 0.2 = 0.0100110011001100...
转成10进制就近似表示为 0.30000000000000004

简单来说就是,浮点数转成二进制时丢失了精度,因此在二进制计算完再转回十进制时可能会和理论结果不同

如何让其相等?

  1. ES6提供的 Number.EPSILON 方法

    Number.EPSILON 的实质是一个可以接受的最小误差范围,一般来说为 Math.pow(2, -52)

    function isEqual(a, b) {
      return Math.abs(a - b) < Number.EPSILON;
    }
    
    console.log(isEqual(0.1 + 0.2, 0.3)); // true
    
  2. 乘以一个10的幂次方

    把需要计算的数字乘以10的n次方,让数值都变为整数,计算完后再除以10的n次方,这样就不会出现浮点数精度丢失问题

    (0.1*10 + 0.2*10) / 10 == 0.3 //true
    

1.6 如何理解BigInt

👉 什么是BigInt?

BigInt 是一种新的数据类型,用于当整数值大于 Number 数据类型支持的范围时。这种数据类型允许我们安全地对大整数执行算术操作,表示高分辨率的时间戳,使用大整数id,等等,而不需要使用库。

👉 为什么需要BigInt?

在JS中,所有的数字都以双精度 64 位浮点格式表示,这导致JS中的Number无法精确表示非常大的整数,它会将非常大的整数四舍五入,确切地说,JS中的 Number 类型只能安全地表示 -9007199254740991(-(2^53-1))9007199254740991((2^53-1)),任何超出此范围的整数值都可能失去精度。

console.log(999999999999999);  //=>10000000000000000

同时也会有一定的安全性问题:

9007199254740992 === 9007199254740993;    // → true 居然是true!

👉 如何创建并使用BigInt?

  1. 要创建 BigInt,只需要在数字末尾追加n即可

    console.log( 9007199254740995n );    // → 9007199254740995n	
    console.log( 9007199254740995 );     // → 9007199254740996
    
  2. 另一种创建 BigInt 的方法是用 BigInt() 构造函数

    BigInt("9007199254740995");    // → 9007199254740995n
    
  3. 简单使用如下:

    10n + 20n;    // → 30n	
    10n - 20n;    // → -10n	
    +10n;         // → TypeError: Cannot convert a BigInt value to a number	
    -10n;         // → -10n	
    10n * 20n;    // → 200n	
    20n / 10n;    // → 2n	
    23n % 10n;    // → 3n	
    10n ** 3n;    // → 1000n	
    
    const x = 10n;	
    ++x;          // → 11n	
    --x;          // → 9n
    console.log(typeof x);   //"bigint"
    

👉 值得警惕的点

  1. BigInt 不支持一元加号运算符, 这可能是某些程序可能依赖于 + 始终生成 Number 的不变量,或者抛出异常。另外,更改 + 的行为也会破坏 asm.js 代码。

    因为隐式类型转换可能丢失信息,所以不允许在 BigIntNumber 之间进行混合操作。当混合使用大整数和浮点数时,结果值可能无法由BigIntNumber精确表示。

    10 + 10n;    // → TypeError
    
  2. 不能将 BigInt 传递给 Web api 和内置的 JS 函数,这些函数需要一个 Number 类型的数字。尝试这样做会报 TypeError 错误。

    Math.max(2n, 4n, 6n);    // → TypeError
    
  3. Boolean 类型与 BigInt 类型相遇时,BigInt 的处理方式与 Number 类似,换句话说,只要不是 0nBigInt 就被视为 true 的值。

    if(0n){//条件判断为false}
    if(3n){//条件为true}
    

    元素都为BigInt的数组可以进行sort

    BigInt可以正常地进行位运算,如|&<<>>^

👉 浏览器兼容性

其实现在的兼容性并不怎么好,只有chrome67、firefox、Opera这些主流实现,要正式成为规范,其实还有很长的路要走

在这里插入图片描述

1.7 JS 整数是怎么表示的

通过 Number 类型来表示,遵循 IEEE754 标准,通过 64 位来表示一个数字,(1 + 11 + 52),最大安全数字是 Math.pow(2, 53) - 1,对于 16 位十进制。(符号位 + 指数位 + 小数部分有效位)

1.8 Number() 的存储空间是多大?如果后台发送了一个超过最大自己的数字怎么办

Math.pow(2, 53) ,53 为有效数字,会发生截断,等于 JS 能支持的最大数字。

----------- 未完待续 -----------

2. 数据类型检测

  • 2.1 typeof类型判断
  • 2.2 typeof 于 instanceof 区别
  • 2.3 Object.is和===的区别
  • 2.4 总结

3. 数据类型转换

  • 3.1 转化规则
  • 3.2 转Boolean
  • 3.3 对象转原始类型是根据什么流程运行的
  • 3.4 如何让if(a == 1 && a == 2)条件成立
  • 3.5 四则运算符
  • 3.6 比较运算符
  • 3.7 [] == ![]结果是什么?为什么?
  • 3.8 == 和 ===有什么区别

4. 闭包

  • 4.1 闭包产生的原因
  • 4.2 闭包有哪些表现形式
  • 4.3 如何解决下面的循环输出问题
  • 4.4 闭包的几种使用场景

5. 原型和原型链链

  • 5.1 原型/构造函数/实例
  • 5.2 原型对象和构造函数有何关系
  • 5.3 能不能描述一下原型链

6. 继承

  • 6.1 方式1: 借助call
  • 6.2 方式2: 借助原型链
  • 6.3 方式3:将前两种组合
  • 6.4 方式4: 组合继承的优化1
  • 6.5 方式5(最推荐使用): 组合继承的优化2
  • 6.6 ES6的extends被编译后的JavaScript代码
  • 6.7 从设计思想上谈谈继承本身的问题
  • 6.8 继承-简版

7. this

8. 内存机制

9. 执行上下文

10. 变量提升

11. 模块化

12. 异步编程

- 12.1 浏览器中的Event loop
- 12.2 Node 中的 Event loop
- 12.3 实现一个Promise A+ 规范
- 12.4 setTimeout、Promise、Async / Await 的区别
- 12.5 setTimeout(fn, 0)多久才执行,Event Loop
- 12.6 async原理

13. 内存泄露

- 13.1 Chrome devTools查看内存情况
- 13.2 内存泄漏的场景

14. 垃圾回收机制

15. 深浅拷贝

16. 对象的几种创建方式

- 16.1 工厂模式,创建方式
- 16.2 构造函数模式
- 16.3 使用原型模式
- 16.4 组合使用构造函数模式和原型模式
- 16.5 动态原型模式

17. 数组相关

- 17.1 数组常用方法
- 17.2 Array(3)和Array(3, 4)的区别?
- 17.3 请创建一个长度为100,值都为1的数组
- 17.4 请创建一个长度为100,值为对应下标的数组
- 17.5 如何转化类数组成数组
- 17.6 forEach中return有效果吗?如何中断forEach循环?
- 17.7 JS判断数组中是否包含某个值
- 17.8 JS中flat---数组扁平化

18. 操作DOM

- 18.1 说说有几种类型的DOM节点
- 18.2 操作DOM节点方法

19. Ajax总结

- 19.1 Ajax 有那些优缺点
- 19.2 关于http,XMLHttpRequest,Ajax的关系
- 19.3 XMLHttpRequest的发展历程是怎样的?
- 19.4 使用XMLHttpRequest封装一个get和post请求

20. 定时器

- 20.1 setInterval存在哪些问题?
- 20.2 链式调用setTimeout对比setInterval
- 20.3 实现比 setTimeout 快 80 倍的定时器
- 22.4 说一下requestAnimationFrame
- 22.5 requestAnimationFrame对比setTimeout

21. 谈谈你对for in/for of的理解

22. JavaScript 实现对上传图片的压缩?

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

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

相关文章

大模型学习与实践笔记(十三)

将训练好的模型权重上传到 OpenXLab 方式1&#xff1a; 先将Adapter 模型权重通过scp 传到本地&#xff0c;然后网页上传 步骤1. scp 到本地 命令为&#xff1a; scp -o StrictHostKeyCheckingno -r -P *** rootssh.intern-ai.org.cn:/root/data/ e/opencv/ 步骤2&#…

计算机网络体系架构认知--网络协议栈

文章目录 一.计算机网络分层架构各协议层和计算机系统的联系从整体上理解计算机网络通信计算机网络通信的本质 二.Mac地址,IP地址和进程端口号三.局域网通信与跨局域网通信局域网通信跨局域网通信全球互联的通信脉络 四.网络编程概述 一.计算机网络分层架构 实现计算机长距离网…

分页查询的使用

背景 在业务中我们在前端总是需要展示数据&#xff0c;将后端得到的数据进行分页处理&#xff0c;通过pagehelper实现动态的分页查询&#xff0c;将查询页数和分页数通过前端发送到后端&#xff0c;后端使用pagehelper&#xff0c;底层是封装threadlocal得到页数和分页数并动态…

Redis快的秘密,高性能设计epoll和IO多路复用探究

Redis快的原因&#xff0c;高性能设计epoll和IO多路复用探究 1、多路复用需要解决的问题 并发多客户端连接&#xff0c;在多路复用之前最简单和典型的方案&#xff1a;同步阻塞网络IO模型 这种模式的特点就是用一个进程来处理一个网络连接&#xff08;即一个用户请求&#x…

仅使用 Python 创建的 Web 应用程序(前端版本)第06章_登录页面

从本章开始,我们将创建每个页面。 本栏的例子 可以访问这里, WTS 首先是登录页面。 完成后的图像如下 创建过程如下 No类型内容1Model创建继承BaseDataModel的数据类User、Session2MockDB创建用户表并添加管理员/成员用户3Service创建AuthAPIClient、UserAPIClient4Page定义…

20240122面试练习题10

1. Redis为什么执行这么快&#xff1f; 二、Redis为什么这么快&#xff1f; 1、完全基于内存&#xff0c;数据存在内存中&#xff0c;绝大部分请求是纯粹的内存操作&#xff0c;非常快速&#xff0c;跟传统的磁盘文件数据存储相比&#xff0c;避免了通过磁盘IO读取到内存这部分…

(2024,-DAE,去噪 DM,去噪 AE,影响 SSRL 性能的关键成分,PCA 潜在空间)解构自监督学习的去噪扩散模型

Deconstructing Denoising Diffusion Models for Self-Supervised Learning 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 4. 解构去噪扩散模型 4.1. 用于自监督学习的重新…

洛谷C++简单题练习day6—P1830 城市轰炸

day6--P1830 城市轰炸--1.26 习题概述 题目背景 一个大小为 nm 的城市遭到了 x 次轰炸&#xff0c;每次都炸了一个每条边都与边界平行的矩形。 题目描述 在轰炸后&#xff0c;有 y 个关键点&#xff0c;指挥官想知道&#xff0c;它们有没有受到过轰炸&#xff0c;如果有&a…

Android Settings 显示电池点亮百分比

如题&#xff0c;Android 原生 Settings 里有个 电池电量百分比 的选项&#xff0c;打开后电池电量百分比会显示在状态栏。 基于 Android 13 &#xff0c; 代码在 ./packages/apps/Settings/src/com/android/settings/display/BatteryPercentagePreferenceController.java &am…

CSS如何设置谷歌浏览器字体小于12px

第一种方法 在浏览器的设置中修改&#xff0c;不过只能修改自己的浏览器字体大小&#xff0c;用户的不行 点击设置 找到自定义字体 修改字体大小 第二种方法 使用2D转换 scale() 当我们想设置字体大小为6px的时候 大家要记住&#xff0c;只能在块盒与行块盒中设置&#xf…

6.【SpringBoot3】登录优化-redis

1. SpringBoot 集成 redis 示例 在之前实现的登录接口中&#xff0c;用户登录成功后会生成一个令牌响应给浏览器&#xff0c;之后浏览器访问其他接口时&#xff0c;都要携带该令牌&#xff0c;接受拦截器的检验&#xff0c;如果令牌有效就放行&#xff0c;允许访问后续接口&am…

【代码随想录-数组】二分查找

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

如何在Vue项目中应用TypeScript?

文章目录 一、前言二、使用Componentcomputed、data、methodspropswatchemit 三 、总结 一、前言 与link类似 在VUE项目中应用typescript&#xff0c;我们需要引入一个库vue-property-decorator&#xff0c; 其是基于vue-class-component库而来&#xff0c;这个库vue官方推出…

基于固件库的RT-THREAD移植

为什么要使用操作系统 当我们进入嵌入式这个领域的时候&#xff0c; 往往首先接触的都是单片机编程&#xff0c; 单片机编程又首选 51 单片机来入门。 这里面说的单片机编程通常都是指裸机编程&#xff0c;即不加入任何 RTOS&#xff08;Real Time Operation System 实时操作系…

独占指针:unique_ptr 与 函数调用 笔记

推荐B站视频&#xff1a; 2.unique_ptr_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV18B4y187uL?p2&vd_sourcea934d7fc6f47698a29dac90a922ba5a3 3.unique_ptr与函数调用_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV18B4y187uL?p3&vd_sourcea934d…

如何阅读xml电子发票

xml电子发票是官方给出的电子存档的文件格式&#xff0c;本质是文本&#xff0c;所以文件很小&#xff0c;大量发票存储&#xff0c;能够更加凸显优势。 但是xml电子发票不方便阅读&#xff0c;因为里面是xml格式&#xff0c;对于财务人员来讲&#xff0c;看“代码”简直太难了…

Android App开发基础(3)——App的设计规范

3 App的设计规范 本节介绍了App工程的源码设计规范&#xff0c;首先App将看得见的界面设计与看不见的代码逻辑区分开&#xff0c;然后利用XML标记描绘应用界面&#xff0c;同时使用Java代码书写程序逻辑&#xff0c;从而形成App前后端分离的设计规约&#xff0c;有利于提高App集…

CSMA/CD 协议——笔记

目录 CSMA/CD 协议 以太网采取的 2 种重要措施 CSMA/CD 协议的要点 CSMA/CD 协议工作流程 碰撞后重传的时机 CSMA/CD 协议的要点 CSMA/CD 协议 最早的以太网&#xff1a;将许多计算机都连接到一根总线上。 总线特点&#xff1a;易于实现广播通信&#xff0c;简单&…

Linux详细笔记大全

第0章 Linux基础入门 什么是计算机 计算机的组成: 控制器,是整个计算机的中枢神经,根据程序要求进行控制,协调计算机各部分工作及内存与外设的访问等。 运算器,功能是对数据进行各种算术运算和逻辑运算。 存储器,功能是存储程序、数据和各种信号、命令等信息。 输入设备…

JavaScript 学习笔记(WEB APIs Day6)

「写在前面」 本文为 b 站黑马程序员 pink 老师 JavaScript 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. JavaScript 学习笔记&#xff08;Day1&#xff09; 2. JavaSc…