针对高级前端的八个级JavaScript面试问题( 四 )


针对高级前端的八个级JavaScript面试问题

文章插图
在我们的情况中,让我们把 x 记作 [] , y 记作 ![] 。我们检查了 x 和 y 的类型,并发现 x 是对象,y 是布尔值 。由于 y 是布尔值,x 是对象,算法的第7个条件被应用:
如果 Type(y) 是 Boolean , 则返回 x == ToNumber(y) 的比较结果 。这意味着如果其中一个类型是布尔值,我们需要在比较之前将其转换为数字 。ToNumber(y) 的值是多少呢?如我们所见,[] 是一个真值 , 取反使其变为 false 。因此,Number(false) 是 0
[] == false[] == Number(false)[] == 0现在我们有了 [] == 0 的比较 , 这次算法的第8个条件起作用:
如果 Type(x) 是 String 或 Number,而 Type(y) 是 Object,则返回 x == ToPrimitive(y) 的比较结果 。
基于这个条件,如果其中一个操作数是对象,我们必须将其转换为一个原始值 。这就是“ToPrimitive算法”出现的地方 。我们需要将 x(即 [])转换为一个原始值 。数组在JavaScript中是对象 。当将对象转换为原始值时,valueOf 和 toString 方法会起作用 。在这种情况下,valueOf 返回数组本身 , 这不是一个有效的原始值 。因此,我们转向 toString 以获取输出 。将 toString 方法应用于空数组会得到一个空字符串,这是一个有效的原始值:
[] == 0[].toString() == 0"" == 0将空数组转换为字符串给了我们一个空字符串 "",现在我们面对的比较是:"" == 0
现在其中一个操作数的类型是字符串,另一个是数字,算法的第5个条件成立:
如果 Type(x) 是 String,而 Type(y) 是 Number , 则返回 ToNumber(x) == y 的比较结果 。
因此,我们需要将空字符串 "" 转换为数字,这给了我们一个 0
"" == 0ToNumber("") == 00 == 0【针对高级前端的八个级JavaScript面试问题】最后,两个操作数具有相同的类型和条件1成立 。由于两者具有相同的值,最终的输出是:
0 == 0 // true至此,我们已经利用了强制转换(coercion)来解决了我们探讨的最后几个问题,这是掌握JavaScript和解决面试中这类常见问题的重要概念 。我强烈建议你查看我的关于强制转换的详细博客文章 。它以清晰和彻底的方式解释了这个概念 。这里是链接 。




推荐阅读