文章插图
在我们的情况中,让我们把
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和解决面试中这类常见问题的重要概念 。我强烈建议你查看我的关于强制转换的详细博客文章 。它以清晰和彻底的方式解释了这个概念 。这里是链接 。推荐阅读
- 每个高级前端工程师都应该知道的前端布局
- Vercel推出的前端AI工具v0,会改变前端么?
- 靶向药治疗
- 什么是靶向药
- 高级职称有哪些 计算机高级职称有哪些
- 一行代码禁止用户调试前端代码!
- 必知!前端测试对你的网站有哪些影响?
- 前端容器化实践
- 60岁章小蕙生图曝光,身材微胖也不减高级范,珠圆玉润一脸“旺夫相”
- 48岁周迅彻底放飞自我!穿中式大妈裙走机场,本以为很老土,但却随性又高级