找出 JavaScript 相等运算符的含义

9

在试图完全理解相等运算符和恒等运算符之间的区别时,我看到了 MSDN 上的一篇文章,解释了它们的内部工作原理,但我仍然有一些疑问,于是我决定创建一个流程图,以便我能够更好地理解。现在我的问题是,这个流程图正确吗?还是我漏掉了什么?

我也理解恒等运算符 (===) 的工作方式几乎相同,但在第一步不尝试将 A 和 B 转换为布尔值、数字或字符串。这样对吗?

您也可以在这里看到图片:

enter image description here

好的,这是真正的事情,这是一个原则问题 ;)

enter image description here


图表做得很好! - Chris Middleton
4
没有“身份运算符”,但有一个严格相等(equality)运算符。如果你的问题是“流程图是否模拟了用于==运算符的抽象比较算法”,答案是“否”。最好的开始位置是规范:抽象相等比较算法 - RobG
你可以将MSDN这篇文章与MDN上的对应文章进行比较。 - RobG
根据参考书目,您可能会将运算符称为Strict Equality或Identity。我需要的是抽象相等比较算法。MSDN文章真是一场噩梦。太好了,谢谢! - Overlord
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - user949300
@user949300,你可以稍微扩展一下,说除非你知道自己在做什么,否则永远不要使用js。(我经常使用==,事实上,除非我真的必须这样做,否则我从不使用===)。 - Octopus
2个回答

4

这个流程图正确吗?

不正确。你应该使用 ECMAScript 规范中的抽象相等比较算法来创建流程图。 ToBoolean 绝对不是第一步(它在任何步骤中都没有被使用)。

还有其他遗漏吗?

有很多。

我理解恒等运算符(===)的工作方式几乎相同,但在第一步不会尝试将 A 和 B 转换为布尔值、数字或字符串。这样理解正确吗?

严格相等比较算法抽象相等比较算法几乎完全相同,只有当参数类型不同时才存在差异,在这种情况下,在进行比较之前有一种精确的顺序使类型相等。


并且在这种情况下,在进行比较之前,存在一种精确的顺序使得类型相等。事实上,并不是这样的。对于严格比较,根本不会使类型相等。如果它们不相等,答案只是“false”。 - Octopus
@Octopus - 这个评论适用于抽象相等算法,而不是严格相等算法(正如您所说,它不会转换类型)。 - RobG

-2
这个流程图正确吗?
不。除了布局很糟糕之外,它还是误导性的,部分是错误的。
我错过了什么吗?
是的。第一步“尝试将A和B转换为布尔值、字符串或数字”是错误的——这不是相等比较算法中的第一步。此外,应该在何时将哪个变量转换为哪种类型?
然后,下一步应该是类型区分,而不是反复询问特定类型的相同值。
“最后”一步“它们(类型)可以强制转换为最后5种情况之一吗?->强制类型”缺乏细节。所有细节都缺少。这是松散的相等比较最相关的部分:
哪些类型可以被强制转换?
哪些类型会被强制转换成哪些类型?
值的强制转换是如何工作的?
而且,在强制转换之后,算法基本上从头开始,而不是从关于字符串的问题开始。
据我了解,身份运算符(===)的工作方式基本相同,但在第一步不会尝试将A和B转换为布尔值、数字或字符串。
实际算法中并没有明显的第一步,所以答案是否定的。事实上,=== 的工作方式相同,只是最后一步强制将值转换为其他类型,而不是返回 false。

编辑:你的第二张图是准确的,尽管它仍然存在一些奇怪的布局决策。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接