JS对象到原始值转换的复杂性 主要由于某些对象类型存在不止一种原始值的表示
在解释三种算法前需要了解
toStringvalueOf这两个方法
toStringArray类的toString方法会将每个元素转换为字符串,再使用逗号作为分隔符拼接起来Function类的toString方法将定义的函数转换为JS源代码的字符串Date类型的toString方法返回一个人类友好(且JS可解析)的日期和时间字符串RegExp类定义的toString方法将RegExp对象转换为一个看起来像RegExp字面量的字符串valueOfvalueOf方法默认情况只返回对象本身String Number Boolean包装类定义的valueOf返回被包装的原始值Array Function RegExp 继承默认方法,返回对象本身Date对象返回日期的内部表示形式: 自1970年1月1日至今的毫秒数偏字符串 (该算法返回原始值,只要可能就返回字符串)toString方法valueOf方法TypeError偏数值 (该算法返回原始值,只要可能就返回数值)偏字符串算法类似,先尝试valueOf再尝试toString无偏好 (该算法不倾向于任何原始值类型,而是由类定义自己的转换规则)Date对象,则使用偏字符串算法偏数值算法
JS内置类型除了Date类都实现了偏数值算法;Date类实现了偏字符串算法
truenew Boolean(false)包装对象Boolean({}) // true
Boolean([]) // true
Boolean(new Boolean(false)) /// true
偏字符串算法转换为一个原始值String({}) // '[object Object]'
String([]) // ''
String(new Date(2023)) // 'Sun Jan 01 2023 08:00:00 GMT+0800 (中国标准时间)'
String(new RegExp(/[a-z]/i)) // '/[a-z]/i'
偏数值算法转换为一个原始值Number({}) // NaN
Number([]) // 0
Number([6]) // 6
Number(new Date(2023)) // 1672531200000
Number(new RegExp(/[a-z]i/)) // NaN
+操作符无偏好算法将对象转换为原始值== != 操作符无偏好算法转换为原始值 再比较< <= > >= 关系操作符偏数值算法将对象转换为原始值偏数值算法返回的原始值不会再被转换为数值