- 其他值到数字值的转换规则
- Undefined 类型转为 NaN
- Null 类型转为 0
- Boolean 类型,true 转为 1, false 转为 0
- String 类型的值转换类似利用 Number(string) 的结果,如果包含非数字值为 NaN ,空字符串为 0
- Symbol 类型不能转为数字,报错
- 对象(包括数组),会首先转换为相应的基本类型值,如果返回的是非数字的基本类型,会按照上述规则强制转为数字
为了将值转换为响应的基本类型值,抽象操作 toPrimitive 会首先检查该值是否有 vaueOf 函数,如果有并且返回基本类型,就使用该值进行强制类型转换;如果没有就调用 toString ,toString 的结果如果是基本类型就执行上述操作。如果前面都没有返回基本类型,会报 TypeError 错误
- 其他值到布尔类型的转换规则
- falsy 的值会被转为 false,
false
、0
、-0
、0n
、''
、""
、null
、undefined
、NaN
- 其他任何值都会被转为 true
- || 和 && 操作符的返回值
- || 会因为第一个值是 true 短路
- && 会因为第一个值是 false 短路
- 这两个操作符都会返回两个操作数中的一个,而不是条件判断的结果
- Object.is() 与
==
和===
的区别
- 使用 == 会隐式转换,转换之后再比较
- 使用 === 不会隐式转换,不相等直接返回 false
- Object.is 处理了比如 +0 和 -0 不相等,NaN 和自己相等的特殊情况
- 什么是包装类型
- 基本类型没有属性和方法,但为了便于基本类型操作,在基本类型调用方法的时候,会使用相应的构造函数将其包装成一个对象
- 注意包装后是一个对象,因此会与原始值有细微的区别,比如 new Boolean(false) 不是一个 falsy 的值,因此在 if 当中会被转换为 true
- 通过 valueOf 会还原 到基本类型
let a = 'abc'
a.length // 这里其实是包装类型的 length
let b = new String('abc')
let c = b.valueOf() // 通过 valueOf 还原
offfer 群面试题
1.Promise 中为什么要引入微任务?
为了不影响渲染,微任务会在同步任务完成后立即执行,宏任务中如果有变动就有可能
2.Promise 中是如何实现回调函数返回值穿透的?
如果 then 接收的不是函数,就会上一个 Promise 的结果 return
3.Promise 出错后,是怎么通过“冒泡”传递给最后那个捕获异常的函数
throw 之后,如果没有在 then 或 catch 中有 try catch 捕获错误,就会尝试继续 throw 错误到最后一层,如果还是没有报错就 throw 一个同步错误