为了账号安全,请及时绑定邮箱和手机立即绑定

为什么('0'?'a':'b')的行为不同于('0'== true?'a':'b')

为什么('0'?'a':'b')的行为不同于('0'== true?'a':'b')

元芳怎么了 2019-11-27 10:57:10
为什么以下两个语句的结果不同?('0' ? 'a' : 'b') /* -> 'a' */('0' == true ? 'a' : 'b') /* -> 'b' */jsFiddle测试用例编辑:我应该补充一点,我怀疑将“ 0”第一条语句强制转换为要比较的布尔值-这应该与“'0'== true”完全相同,显然这是不正确的。
查看完整描述

3 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

首先,为了完整性:


('0' ? 'a' : 'b') 

之所以为'a',是因为它'0'是一个非空字符串,其总值为true:


字符串:如果参数为空字符串(其长度为零),则结果为false;否则为false。否则结果为true。


现在到'0' == true。


这里将进行两次类型转换。我们可以在规范的第11.9.3节“抽象平等比较算法”中遵循这一要求。


操作数表示为x和y(x == y)。


在我们的例子中,x是一个字符串('0')和y一个布尔值(true)。因此,执行步骤7:


如果Type(y)为布尔型,则返回比较结果x == ToNumber(y)。


将布尔值转换为数字时,将进行以下转换:


布尔值:如果参数为true,则结果为1。如果参数为false,则结果为+0。


现在我们有


'0' == 1

符合步骤5中的条件:


如果Type(x)为String,Type(y)为Number,则返回比较结果ToNumber(x)== y。


如何将字符串转换为数字更为复杂,但是当然也可以在规范中找到。


所以最后的比较是


0 == 1

这是false(步骤1. a。vi。)


查看完整回答
反对 回复 2019-11-27
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

主要是因为JavaScript在真实性方面相当不一致。但是答案是:

  1. 在这种情况下,“ 0”直接转换为布尔值,而“ 0”(非空字符串)为true。

  2. 在这种情况下,不会进行任何转换;字符串不等于布尔值。


查看完整回答
反对 回复 2019-11-27
  • 3 回答
  • 0 关注
  • 699 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号