使用==比较整数和字符串时JavaScript中的隐式数据类型转换
作者:互联网
编码:
var num = 20;
if(num == "20")
{
alert("It works");
}
else
{
alert("Not working");
}
问题:
>在C编程中,我们有一个规则名称数据类型提升,当存在混合数据类型时(例如:添加整数和浮点),整数将在执行加法之前首先转换为浮点.
>上面的代码将提示我一个警告框,其中显示“It works”消息,显示if测试条件是否为true.
>对于松散类型的JavaScript,我只是好奇:是否有像C这样的规则决定在哪种情况下执行哪个转换?除此之外,上面的JavaScript代码在进行比较之前将num变量值从整数值转换为字符串值,反之亦然?
解决方法:
是的,equals运算符应用的所有类型转换规则都在ECMA-262规范中描述,在The Abstract Equality Comparison Algorithm中.
该算法看起来可能非常复杂,但可归纳为以下情况:
>两个操作数的类型相同:
>对于基元(String,Number,Boolean,Null,Undefined)
>如果值完全相同,则返回true
>对于Object类型
>如果两个引用指向同一个对象,则返回true
>如果两个操作数的类型不同
>如果一个操作数的类型是Null或Undefined
>仅当其他操作数值为null或未定义时才返回true
>如果其中一个操作数的类型为Boolean或Number
>(经过一些步骤)将另一个操作数转换为Number并进行比较
>如果其中一个操作数是Object而另一个是原语
>对Object执行Object-to-Primitive转换并再次进行比较
Object-to-Primitive转换是通过名为ToPrimitive
的抽象操作进行的,此方法将尝试使用内部[[PrimitiveValue]]
方法将对象转换为原始值.
这将尝试执行对象的valueOf和toString方法,它将获取返回原始值的第一个值.
如果这两个方法不返回原语,或者它们不可调用,则抛出TypeError,例如:
1 == { toString:null } // TypeError!
上面的语句将产生一个TypeError,因为默认的Object.prototype.valueOf方法除了实际上相同的对象实例(这不是原始值)之外什么都不做,我们正在设置一个自己的toString属性,它不是一个函数.
一个朋友制作了一个可能对你感兴趣的小工具,它显示了所有步骤和类型之间的递归比较:
标签:comparison-operators,javascript,implicit-conversion 来源: https://codeday.me/bug/20190923/1813711.html