面试题: a = ?, a==1 && a==2 && a==3 成立

256 阅读2分钟

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
	}
}

§ 解析代码

  1. 目前a是一个对象, 如果带入到题目中,对象a因为在符号的左边,所以对象a隐式转换
  2. a对象内是有valueOf方法, 在转换过程中会直接执行该方法, 并且返回该方法执行的结果, 并且会转为数字
  3. 每一次执行valueOf方法a.count的结果会加1, 并且作为结果返回, 那么3次 == 的结果为 1, 2, 3

§ 重点

  • 每一次对象的隐式转换中都会调用valueOf或者toString方法, 如果该对象有该方法, 则执行并且返回结果,
  • 如果对象无valueOf或者toString方法, 则对象直接转换为NaN
  • 这里的原始值就是string、number、布尔值、null、undefined类型的值

§ 扩展对象转换

§ 对象转数字

  • 先尝试调用对象的 valueOf(),将返回原始值转为数字
  • 对象无 valueOf() 或 valueOf 返回不是原始值,调用 toString() 方法,将返回原始值转为数字
  • 否则,抛出类型错误

§ 对象转布尔值

  • True