前言
最近在准备春招中,自己经历了大小面试数十场发现问来问去也就都是那些高频考点,于是乎笔者整理了一些前端高频考点面试题供各位看官老爷参考,这些天我会一直更新这些高频考点题,如果对你有些许帮助的话,欢迎点赞👍,收藏 ❤️,加关注😍,感谢各位了
1.js有哪些数据类型
一共有8种数据类型,分为简单数据类型和复杂数据类型,简单数据类型共有7种分别是Null、Undefined、String、Symbol、Bollean、Number和BigInt
,复杂数据类型只有object
一种,其中Number
和BigInt
可以归为一种Numeric
,还不清楚的话可以去看看笔者写的这篇文章七上八下:彻底掌握js的数据类型
2.let、const、var的区别
let
和const
是es6新增的关键字,都具有块级作用域和暂时性死区,没有变量提升,也不能重复声明变量,const
必须设置初始值,如果是简单数据类型的话,const
一旦设置了初始值就不能更改,如果是复杂数据类型的话,const
设置的值就不能更改内存地址,但是能更改其中的内容,var
的话是可以重复声明变量的,后面声明的变量会覆盖掉前面声明的变量,存在变量提升,不存在块级作用域和暂时性死区,jym可以看看我下面总结的这张图,如果还是不清楚的可以看看笔者写的这篇文章【ES6】让你彻底搞懂const ,let和var的区别
3.null和undefined的区别
它们都只有一个值,null
的值是null
,undefined
的值是undefined
,undefined
表示的是未定义,一般变量声明了还没有定义的时候会返回undefined
,null
表示的是对象为空,也可以把某一个变量初始化为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.1
和 0.2
)无法被精确地表示为二进制浮点数。
- 0.1 在二进制中是一个无限循环小数:
0.0001100110011001100...
- 0.2 在二进制中也是一个无限循环小数:
0.001100110011001100...
由于计算机只能存储有限位数的小数,这些值会被截断或舍入,导致它们的实际存储值与理论值存在微小误差。 这也就导致0.1+0.2
的结果稍大于0.3
如果你觉得本文对你有帮助,请不吝点赞❤️❤️❤️❤️。写作不易,每一次持续输出都凝聚了无数个日夜的努力。你的点赞是我继续创作的动力,感谢你的支持!