前端面试:你应该知道的js基础

163 阅读3分钟

「回顾2022,展望2023,我正在参与2022年终总结征文大赛活动

js中的几种数据类型

基本数据类型

  1. Number
  2. String
  3. Undefined
  4. Boolean
  5. Null
  6. BigInt
  7. Symbol

引用数据类型

  1. Array(数组类型)
  2. Object (对象)
  3. Function (函数)
  4. Date
  5. RegExp

更多细节,请点击查看 js数据类型

js中最大安全值,最小安全值

最大值: 2**53

最大安全值: 2**53-1
可用 Number.MAX_SAFE_INTEGER 在js引擎打印出来

最小安全值: -(2**53-1)
可用 Number.MIN_SAFE_INTEGER 在js引擎打印出来

深拷贝和浅拷贝的区别

浅拷贝:只拷贝一层,相当于复制了对象的引用地址 拷贝那个指针 (即新对象的引用地址里面的内容发生改变,原对象也发生改变)

深拷贝:层层拷贝 需要在堆里面维护一个新的对象,具有一个新的引用地址 (两者互不影响)

闭包

在js执行引擎中,一个函数执行完毕之后该函数的执行上下文会被垃圾回收机制回收掉 (前提)
但是当一个函数内部的函数被返回出来执行时,该内部函数会对外部函数中的变量存在引用,引用这些变量的集合称为闭包。这些集合不会随外部函数的执行上下文的回收而消失。

js隐式转换规则

运算符

  1. 转成string类型: + (字符串连接)
  2. 转成number类型: ++/-- (自增自减) + - * / % (算术运算符) > < >= <= == != (关系运算符)
  3. 转成boolean类型: !(逻辑非运算符) 即取反

等号 ==

  1. 如果有一边是布尔值,则就会转换成数字 进行比较
  2. 如果有一边是字符串,另一边是数字,则就会将字符串转换成数字 进行比较
  3. 如果有一边是对象,另一边不是,那就先将对象按照拆箱步骤进行转换,得到的原始类型再按照上述规则对比
  4. 特殊情况:null == undefined // true

js中的装箱和拆箱

装箱:把 基本数据类型 转化成对应的 引用类型 的操作

  1. 创建String类型的实例
  2. 在实例上面调用指定的方法
  3. 销毁这个实例
000.png

拆箱:把 引用类型 转化为对应的 基本数据类型 的操作

对象身上本身就具有 toPrimitive() 方法,当对象需要发生隐式转换的时候,也就是这个方法需要被执行的时候,会发生以下操作:

  1. 判断值为原始类型,直接返回
  2. 调用 valueOf(), 如果得到了原始类型,直接返回
  3. 调用 toString(), 如果得到了原始类型,直接返回
  4. 报错
01.png

undefined >= undefined ? null >= null ? [] == ![]

  1. undefined 转换成数字为NaN, 由于 NaN 是不能进行比较的 即NaN == NaN 为 false, 所以 undefined >= undefined 为 false

  2. null 转成数字为 0,所以 null >= null 为 true

  3. [] == ![] ,因为 ! 的优先级高于 == ,所以 ![] 转成boolean类型 flase,然后 == 两边转换成数字,[] 会按照拆箱步骤 [] => [] => '' 根据原始值类型转换表 '' 和 false 都为 0

999.png

isNaN 和 Number.isNaN的区别

isNaN() 只能判断 NaN 和 能成功转成数字的值,不能成功转成数字的值为false。这里大家可能会有点迷惑,童鞋们可以看图然后根据图片下的注意文字理解大概
Number.isNaN 只能判断 NaN, 其他所有情况都是false,都判断不出来。

123123.png

注意:isNaN 即 is not a number
所以根据js的隐式转换成数字的打印结果都是false,[] 隐式转换的结果是 0 。{}不能转换成数字,所以is not a number,打印的结果就是true