1. 其他值到数字值的转换规则
  • Undefined 类型转为 NaN
  • Null 类型转为 0
  • Boolean 类型,true 转为 1, false 转为 0
  • String 类型的值转换类似利用 Number(string) 的结果,如果包含非数字值为 NaN ,空字符串为 0
  • Symbol 类型不能转为数字,报错
  • 对象(包括数组),会首先转换为相应的基本类型值,如果返回的是非数字的基本类型,会按照上述规则强制转为数字

为了将值转换为响应的基本类型值,抽象操作 toPrimitive 会首先检查该值是否有 vaueOf 函数,如果有并且返回基本类型,就使用该值进行强制类型转换;如果没有就调用 toString ,toString 的结果如果是基本类型就执行上述操作。如果前面都没有返回基本类型,会报 TypeError 错误
2022.04.28 - 图1

  1. 其他值到布尔类型的转换规则
  • falsy 的值会被转为 false,false0-00n''""nullundefinedNaN
  • 其他任何值都会被转为 true
  1. || 和 && 操作符的返回值
  • || 会因为第一个值是 true 短路
  • && 会因为第一个值是 false 短路
  • 这两个操作符都会返回两个操作数中的一个,而不是条件判断的结果
  1. Object.is() 与 ===== 的区别
  • 使用 == 会隐式转换,转换之后再比较
  • 使用 === 不会隐式转换,不相等直接返回 false
  • Object.is 处理了比如 +0 和 -0 不相等,NaN 和自己相等的特殊情况
  1. 什么是包装类型
  • 基本类型没有属性和方法,但为了便于基本类型操作,在基本类型调用方法的时候,会使用相应的构造函数将其包装成一个对象
  • 注意包装后是一个对象,因此会与原始值有细微的区别,比如 new Boolean(false) 不是一个 falsy 的值,因此在 if 当中会被转换为 true
  • 通过 valueOf 会还原 到基本类型
    1. let a = 'abc'
    2. a.length // 这里其实是包装类型的 length
    3. let b = new String('abc')
    4. let c = b.valueOf() // 通过 valueOf 还原

offfer 群面试题

1.Promise 中为什么要引入微任务?
为了不影响渲染,微任务会在同步任务完成后立即执行,宏任务中如果有变动就有可能

2.Promise 中是如何实现回调函数返回值穿透的?
如果 then 接收的不是函数,就会上一个 Promise 的结果 return

3.Promise 出错后,是怎么通过“冒泡”传递给最后那个捕获异常的函数
throw 之后,如果没有在 then 或 catch 中有 try catch 捕获错误,就会尝试继续 throw 错误到最后一层,如果还是没有报错就 throw 一个同步错误