2025前端高频面试题之--js篇(一)

前言

最近在准备春招中,自己经历了大小面试数十场发现问来问去也就都是那些高频考点,于是乎笔者整理了一些前端高频考点面试题供各位看官老爷参考,这些天我会一直更新这些高频考点题,如果对你有些许帮助的话,欢迎点赞👍,收藏 ❤️,加关注😍,感谢各位了

1.js有哪些数据类型

一共有8种数据类型,分为简单数据类型和复杂数据类型,简单数据类型共有7种分别是Null、Undefined、String、Symbol、Bollean、Number和BigInt,复杂数据类型只有object一种,其中NumberBigInt 可以归为一种Numeric,还不清楚的话可以去看看笔者写的这篇文章七上八下:彻底掌握js的数据类型

2.let、const、var的区别

letconst是es6新增的关键字,都具有块级作用域和暂时性死区,没有变量提升,也不能重复声明变量,const必须设置初始值,如果是简单数据类型的话,const一旦设置了初始值就不能更改,如果是复杂数据类型的话,const设置的值就不能更改内存地址,但是能更改其中的内容,var的话是可以重复声明变量的,后面声明的变量会覆盖掉前面声明的变量,存在变量提升,不存在块级作用域和暂时性死区,jym可以看看我下面总结的这张图,如果还是不清楚的可以看看笔者写的这篇文章【ES6】让你彻底搞懂const ,let和var的区别

3.null和undefined的区别

它们都只有一个值,null的值是nullundefined的值是undefinedundefined表示的是未定义,一般变量声明了还没有定义的时候会返回undefinednull表示的是对象为空,也可以把某一个变量初始化为null

js 复制代码
let a  = null
console.log(a) // null
console.log(b) // undefined

4.typeof null的结果是什么,为什么

先说结论,typeof null的结果为Object

返回Object其实是一个历史遗留问题,是js的早期设计缺陷,在js底层实现中,数据类型是通过一种"类型标签"来标识的,最初,js使用低位存储类型信息。

  • 对于Object,其类型的低位表示000
  • null的值在内存中表示的是一个空指针(所有位均为0),因此他的类型标签也被认为是000,这也就导致typeof null的结果为Object

5.==和===的区别

==(抽象相等比较),在比较之前,如果两个值的类型不同,==会尝试将它们转换为相同的类型,比较最后的数值

===(严格相等比较),不会进行类型转换,比较的两个值不仅要值相等而且它们的类型也要相等。

js 复制代码
console.log(1 == '1'); // true, 因为 '1' 被转换成了数字 1
console.log(1 === '1'); // false, 因为类型不同,一个是数字,另一个是字符串

console.log(null == undefined); // true, 松散比较认为它们相等
console.log(null === undefined); // false, 类型不同

let obj1 = {};
let obj2 = {};
console.log(obj1 == obj2); // false, 不同对象实例
console.log(obj1 === obj2); // false, 同上

let obj3 = obj1;
console.log(obj1 === obj3); // true, 相同对象实例

6.如何判断一个对象是空对象

  • 使用JSON中的.stringify()来判断,如果对象中包含不可序列化的属性(如函数或undefined),它们会被忽略,因此可能会导致误判
  • 使用es6新增的Object.keys()来判断
  • 使用for...in 循环遍历对象的属性来判断是否存在任何可枚举属性,如果没有属性,为空对象
  • 使用Object.getOwnPropertyNames()返回对象的所有自身属性(包括不可枚举属性),如果返回的数组长度为0,对象为空

7.什么是原型和原型链

每个函数都有一个prototype属性,这个属性被称为显式原型,它指向一个对象,即原型对象。当用这个函数作为构造函数创建实例时,该实例会拥有一个隐式原型属性__proto__,这个属性指向构造函数的prototype(即原型对象)。通过这种关联,每一个对象都会间接地与一个原型对象相连接。

原型链就是基于这种__proto__隐式原型属性形成的链式结构。具体来说,当访问一个对象的属性或方法时,如果该对象自身没有定义此属性或方法,JavaScript引擎就会沿着__proto__指针向上查找,直到找到具有请求属性或方法的对象为止,或者到达原型链的末端(也就是null)。这个从当前对象开始直到null的查找路径就构成了所谓的原型链。

在这个链条上的每个节点都是一个对象,而链条的起点是原始对象,终点通常是Object.prototype,之后指向null,形成了一条完整的查找链路。

8.谈谈对闭包的理解

闭包是指一个函数能够记住并访问它的词法作用域,即使这个函数在其词法作用域之外执行

因此,闭包是从函数定义开始的一种链式作用域结构,它的起点是嵌套函数,终点是外部函数的作用域,甚至是全局作用域。这种机制使得函数能够在定义时的作用域之外保持对变量的访问能力,从而实现诸如数据封装、私有变量等功能。同时,闭包也需要注意内存管理问题,因为被捕获的变量不会被垃圾回收机制释放,直到闭包本身不再被引用。

9.为什么0.1+0.2!==0.3?

js使用 IEEE 754 标准来表示数字(双精度 64 位浮点数)。然而,很多十进制小数(如 0.10.2)无法被精确地表示为二进制浮点数。

  • 0.1 在二进制中是一个无限循环小数:0.0001100110011001100...
  • 0.2 在二进制中也是一个无限循环小数:0.001100110011001100...

由于计算机只能存储有限位数的小数,这些值会被截断或舍入,导致它们的实际存储值与理论值存在微小误差。 这也就导致0.1+0.2的结果稍大于0.3

如果你觉得本文对你有帮助,请不吝点赞❤️❤️❤️❤️。写作不易,每一次持续输出都凝聚了无数个日夜的努力。你的点赞是我继续创作的动力,感谢你的支持!

相关推荐
郝学胜-神的一滴1 小时前
从线程栈到表达式求值:栈结构的核心应用与递归实现
开发语言·数据结构·c++·算法·面试·职场和发展·软件工程
姓蔡小朋友1 小时前
Agent Skill设计模式
开发语言·javascript·设计模式
敲代码的嘎仔1 小时前
Java后端开发——多线程面试题
java·开发语言·面试·多线程·八股·threadlocal·
yaaakaaang1 小时前
(五)前端,如此简单!---变量
前端·javascript
2501_941982051 小时前
企微私域:实现企业通讯工具外部群消息的自动化主动推送
java·前端·javascript
三*一2 小时前
基于 Turf.js 实现高精度多边形修整工具(模拟 ArcGIS 修整功能)
开发语言·前端·javascript·arcgis·maobox gl·turf.js
踩着两条虫2 小时前
VTJ.PRO 在线应用开发平台的工作台与后台管理视图
前端·人工智能·ai编程
踩着两条虫2 小时前
VTJ.PRO 在线应用开发平台多平台运行时(Web, H5, UniApp)
前端·低代码·ai编程
ZC1995922 小时前
Node.js npm 安装过程中 EBUSY 错误的分析与解决方案
前端·npm·node.js
升鲜宝供应链及收银系统源代码服务2 小时前
生鲜配送供应链管理系统源代码之升鲜宝社区团购商城小程序(一)
java·前端·数据库·小程序·notepad++·供应链系统源代码·多门店收银系统