“是怎么回事?”;20“;在JavaScript中,20个被认为是相等的?

“是怎么回事?”;20“;在JavaScript中,20个被认为是相等的?,javascript,comparison,binary,operators,ascii,Javascript,Comparison,Binary,Operators,Ascii,我理解使用“==”比较类型,因此运行以下代码会导致“不相等”,因为它将数字类型与字符串类型进行比较 var a = 20; var b = "20"; if (a === b) { alert("They are equal"); } else { alert("They are not equal"); } 但我不明白如何使用“==”只比较“它们相等”消息中的值 价值观如何相等?字符串“20”不是存储为ASCII字符50和48(二进制中的011

我理解使用“==”比较类型,因此运行以下代码会导致“不相等”,因为它将数字类型与字符串类型进行比较

var a = 20;
var b = "20";
    if (a === b) {
        alert("They are equal");
    } else {
        alert("They are not equal");
}
但我不明白如何使用“==”只比较“它们相等”消息中的值

价值观如何相等?字符串“20”不是存储为ASCII字符50和48(二进制中的0110010和011000)吗?20不是存储为实际二进制数0010100吗


编辑:谢谢大家!我认为所有的回答都很好,帮助我更好地理解这一点。

操作符只比较变量的值。如果类型不同,则进行转换。因此,数字20被转换为字符串“20”,并对结果进行比较


==
运算符不仅比较值,而且比较类型,因此不执行强制转换。在这种情况下,
“20”!==20

JavaScript引擎将a视为一个数字,并在估值之前将b强制转换为数字。

部分“==”的定义是,如果可能,在比较之前将值转换为相同的类型。许多松散类型的语言也是如此。

据我所知,JavaScript会动态地进行自动数据类型转换,因此可能会自动将变量转换为等效类型。

JavaScript的设计使包含数字的字符串被视为与该数字“相等”。这样做的原因是,对于用户在输入字段中输入一个数字,并且站点在JS中对其进行验证的情况,使用起来非常简单——在比较之前,您不必将输入的字符串转换为一个数字


它简化了一个常见的用例,并且===运算符仍然允许您与所考虑的类型进行比较。

当需要进行类型转换时,JavaScript会按如下方式转换字符串、数字、布尔值或对象操作数

  • 比较数字和字符串时,字符串将转换为数字值。JavaScript尝试将字符串数字文字转换为数字类型值。首先,从字符串数字文本中导出数学值。接下来,将该值四舍五入为最接近的数字类型值
  • 如果其中一个操作数是布尔操作数,则布尔操作数在为真时转换为1,在为假时转换为+0
  • 如果将对象与数字或字符串进行比较,JavaScript将尝试返回该对象的默认值。运算符尝试使用对象的valueOf和toString方法将对象转换为基本值、字符串或数值。如果转换对象的尝试失败,将生成运行时错误
==比较的问题是JavaScript版本1.2不执行类型转换,而版本1.1和1.3以后的版本执行类型转换

===比较从版本1.3开始就可用,是检查两个变量是否匹配的最佳方法


如果您需要代码与JavaScript代码的1.1、1.2和1.3版本兼容,那么应该确保变量都匹配,就像执行===比较一样。

我想知道的是哪一个变量被更改了?也就是说,为了比较,int是被更改为字符串还是字符串被更改为int?我假设int被更改为字符串。不是每个字符串都可以走相反的方向,这可能会节省很多麻烦。事实上,我只是做了一些进一步的研究,发现了一种叫做抽象等式比较算法的东西,如果我理解正确的话,这意味着因为20是一个数字,“20”是一个字符串,所以字符串“20”将转换为一个数字,并对这两个数字进行比较。您可能会发现编写这样的代码更容易检查以下内容:警报(“20”==20);
var a = 20;
var b = "20";
    if (a == b) {
        alert("They are equal");
    } else {
        alert("They are not equal");
}