a = ?, a==1 && a==2 && a==3 成立
面试高频指数:★ ★ ★ ★ ☆
这是一个比较有意思的题目,主要考面试者对于JavaScript隐式转换的理解
§ == 会触发隐式转换, === 不会
由于题目中 a==1 && a==2 && a==3 全部为 == 符号, 所以如果符号左右两边类型不一致就会触发隐式类型转换, 符号右边是数字类型, 那么符号右边, 也就是变量a需要转换为数字类型
§ 对象转数字的过程
对象隐式转换为数字会有以下几个过程:
- 先尝试调用对象的 valueOf(),将返回原始值转为数字
- 对象无 valueOf() 或 valueOf 返回不是原始值,调用 toString() 方法,将返回原始值转为数字
- 否则,抛出类型错误
举个🌰:
const a = {
count: 0,
valueOf(){
return ++this.count
}
}
§ 解析代码
- 目前a是一个对象, 如果带入到题目中,对象a因为在符号的左边,所以对象a隐式转换
- a对象内是有valueOf方法, 在转换过程中会直接执行该方法, 并且返回该方法执行的结果, 并且会转为数字
- 每一次执行valueOf方法a.count的结果会加1, 并且作为结果返回, 那么3次 == 的结果为 1, 2, 3
§ 重点
- 每一次对象的隐式转换中都会调用valueOf或者toString方法, 如果该对象有该方法, 则执行并且返回结果,
- 如果对象无valueOf或者toString方法, 则对象直接转换为NaN
- 这里的原始值就是string、number、布尔值、null、undefined类型的值
§ 扩展对象转换
§ 对象转数字
- 先尝试调用对象的 valueOf(),将返回原始值转为数字
- 对象无 valueOf() 或 valueOf 返回不是原始值,调用 toString() 方法,将返回原始值转为数字
- 否则,抛出类型错误
§ 对象转布尔值
- True