编程语言
首页 > 编程语言> > 使用==比较整数和字符串时JavaScript中的隐式数据类型转换

使用==比较整数和字符串时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属性,它不是一个函数.

一个朋友制作了一个可能对你感兴趣的小工具,它显示了所有步骤和类型之间的递归比较:

> JS Coercion Tool

标签:comparison-operators,javascript,implicit-conversion
来源: https://codeday.me/bug/20190923/1813711.html