qstring比较两个字符串完全相等_JavaScript相等运算符的传奇

a6e3f003d499ff14daf760b38551c368.png
有时,当我在编写Javascript时,我想举起双手说“这是胡说八道!”

在日常JavaScript编码过程中,可能很难看清相等运算符的工作方式。特别是当操作数具有不同类型时。有时会在条件错误中创建错误,这些错误很难识别。这是很容易理解为什么0 == 8false或者'' == falsetrue。但是,为什么{} == truefalse不是很明显看到。如果您有兴趣:

  • 更好地了解平等和身份运营商
  • 学习形式计算算法
  • 练习很多例子

然后让自己舒服一些,让我们开始吧。
本文中使用以下术语:

  • 运算符是表示操作的符号。
    例如,等于运算符==比较两个值,身份运算符===比较两个值及其类型,加法运算符+将两个数字相加或将两个字符串连接在一起。
  • 操作数是运算的主题,是执行运算的数量。
    在表达式中0 == {}0是第一个操作数,{}第二个操作数。
  • JavaScript中的原始类型被认为是数字,字符串,布尔值,null和undefined。

身份运算符
JavaScript正在执行相等性评估。解释器首先将两个操作数转换为相同的类型。然后执行身份比较。
身份评估算法(IEA===

  1. 如果两个操作数的类型不同,则它们不是严格相等的
  2. 如果两个操作数都为null,则它们严格相等
  3. 如果两个操作数都为undefined,则它们严格相等
  4. 如果一个或两个操作数是NaN,则它们不是严格相等的
  5. 如果两个操作数都是true或两者false严格相等
  6. 如果两个操作数都是数字并且具有相同的值,则它们严格相等
  7. 如果两个操作数都是字符串并且具有相同的值,则它们严格相等
  8. 如果两个操作数都引用相同的对象或函数,则它们严格相等
  9. 在所有其他情况下,操作数不是严格相等的

规则很简单。
值得一提的是,NaN在身份(和相等性)运算符中,与其他任何值相比,其总和为false。让我们考虑一些例子。这是记住严格比较算法的最佳方法。例子1

77d8614301ed75742b151304a0cca5ba.png

操作数是不同的类型(数字和字符串),并且根据IEA规则1,它们是不同的。例子2

776292eab62c4ef2bc50514315d99970.png

操作数是相同的类型(数字)并且具有相同的值,因此根据IEA规则6,它们严格相等。例子3

b4dbfecf2320f4dc684ef7517efaec89.png

这两个操作数都是undefined并且应用IEA规则3,这是相等的。例子4

35b1edc0123312bddcedd6156b7df26a.png

由于操作数是不同的类型,因此根据IEA规则1,它们是不同的。例子5

51ef69bd548e2041d4aff242a81bc2cd.png

操作数是相同的类型(数字),但是IEA规则4表示没有东西等于NaN。结果是false例子6

0244c1aac7c00ec4e72ebbaef124d0ae.png

这两个变量firstObjectsecondObject都是对同一对象的引用,并且根据IEA规则8,身份运算符的计算结果为true例子7

82258d8476a9dd6a40662d1652f3c89a.png

[]字面创建一个新的数组引用。两个操作数是相同的类型(对象),但是引用了不同的对象。在国际能源署(IEA)第9条说,身份的计算结果为false
请参阅JS Bin中的示例将对象转换为基本体
学习平等之前的另一步是了解对象向原始转换的过程。比较对象和原始值时,JavaScript使用它。对象到原始转换算法(OPCA):

  1. 如果该方法valueOf()存在,则将调用它。如果valueOf()返回原语,则对象将转换为该值
  2. 在其他情况下,如果toString()存在该方法,则将其调用。如果toString()返回原语,则对象将转换为该值
  3. 在其他情况下,JavaScript会引发错误: TypeError: Cannot convert object to primitive value

调用valueOf()方法时,大多数本机对象将返回对象本身。因此,toString()方法被更频繁地使用。
关于Date对象的说明:转换为基元时,使用toString()方法将对象立即转换为字符串。这样,规则1被跳过Date。普通的JavaScript对象({}new Object()通常会转换为)"[object Object]"
通过使用","分隔符将其元素连接在一起,可以将数组转换为。例如[1, 3, "four"]转换为"1,3,four"等于运算符
现在,这是有趣的部分。在阅读本文之前,如果您只是滚动到这里,我建议您对身份和对象到原始转换部分有一个很好的了解。
平等评估算法(EEA==

  1. 如果操作数具有相同的类型,请使用IEA测试它们是否严格相等。如果它们不严格相等,则它们不相等,否则相等。
  2. 如果操作数具有不同的类型:
  3. 如果一个操作数null与另一个操作数相等undefined,则它们相等
  4. 如果一个操作数是数字,另一个是字符串,则将字符串转换为数字。再次计算比较
  5. 如果一个操作数是布尔,转变true1false0。再次计算比较
  6. 如果一个操作数是一个对象,另一个是数字字符串,则使用OPCA对象转换为原语。再次计算比较
  7. 在所有其他情况下,操作数不相等

让我们考虑一些例子。例子1

4cca8c38e5d9046d5c5a00731f0dcc52.png
  1. 1 == true(转换true1使用EEA规则2.3)
  2. 1 == 1(操作数具有相同的类型,数字。使用EEA规则1将等式转换为身份)
  3. 1 === 1(两个操作数都是数字,并且具有相同的值。基于IEA规则6,这是相等的)
  4. true

例子2

df58bac3ba9ee570fcbc5c7d86359092.png
  1. '' == 0(一个操作数是字符串,另一个是数,基于EEA规则2.2的''被转换成一个数字)
  2. 0 == 0(操作数是同一类型,请使用EEA规则1将等式转换为身份)
  3. 0 === 0(操作数是相同的类型,并且具有相同的值,因此根据IEA规则6,它是一个标识)
  4. true

例子3

7ffe028972871a405cdaec00f5267182.png
  1. null == 0null是null类型的原语,0是数字。应用EEA规则3)
  2. false

例子4

c9d21edf27f6aa03552609743f81596b.png
  1. null == undefined(基于EEA规则2.1,操作数相等)
  2. true

例子5

d409f2c5782ec7a16ad2b37495e55951.png
  1. NaN == NaN(两个操作数都是数字。使用EEA规则1将相等转换为身份)
  2. NaN === NaN(基于规则IEA规则4,操作数并不严格相等)
  3. false

例子6

fae9302ec0edcd227f64784719e02cab.png
  1. [''] == ''['']是一个数组和''一个字符串。应用EEA规则2.4,并使用OPCA规则2将数组转换为基本体)
  2. '' == '' (两个操作数都是字符串,因此将等式转换为标识)
  3. '' === ''(两个操作数是相同的类型,并且具有相同的值。使用IEA规则7是一个标识)
  4. true

例子7

7b5b7bf7d41e41f0ba0025cb9e99ca2c.png
  1. {} == true(使用EEA规则2.3,将true操作数转换为1
  2. {} == 1 (第一个操作数是一个对象,因此有必要使用OPCA将其转换为原语)
  3. "[object Object]" == 1(由于第一个操作数是字符串,第二个是数字,我们需要"[object Object]"使用EEA规则2.2将其转换为数字)
  4. NaN == 1(两个操作数都是数字,因此请使用EEA规则1将等式转换为身份)
  5. NaN === 1(基于IEA第4条规则,该规则说与a不相等NaN,结果为false
  6. false

请参阅JS Bin中的示例有用的提示
即使详细检查了本文中的所有示例,并学习了算法,您也可能会发现复杂的内容,无法立即理解复杂的比较。老实说,这个操作员对我来说也是一个长期的黑匣子。
让我告诉您一些技巧。将此文章添加到书签中(使用Ctrl+D),下次您看到一个有趣的情况时,请根据等式算法编写逐步的计算。如果您自己检查至少10个示例,则将来不会有任何问题。
立即开始!结果和详细解释是[0] == 0什么?随时在回复中写评论。
等于运算符==进行类型转换。结果,某些比较可能会产生意想不到的结果,例如{} == truefalse(请参见示例7)。在大多数情况下,使用身份运算符更安全===结论
平等和认同可能是最常用的运算符之一。了解它们是编写稳定且漏洞较少的JavaScript的步骤之一。

原著作者:德米特里·帕夫鲁汀

文章来源:国外

原著链接:

Dmitri Pavlutin Blog​dmitripavlutin.com
e7f635809adca7eeee17029dc1c5abde.png

PS:原著文章内容为英文版本,建议使用360极速浏览器进行翻译阅读。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值