JavaScript中“20”和20如何被认为是相同的?

时间:2008-11-02 17:25:22

标签: javascript comparison binary operators ascii

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

var a = 20;
var b = "20";
    if (a === b) {
        alert("They are equal");
    } else {
        alert("They are not equal");
}

但是我不明白如何使用“==”来比较“他们是平等的”消息中的值结果。

var a = 20;
var b = "20";
    if (a == b) {
        alert("They are equal");
    } else {
        alert("They are not equal");
}

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

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

6 个答案:

答案 0 :(得分:19)

==运算符仅比较变量的值。如果类型不同,则进行转换。因此,数字20被转换为字符串“20”并且比较结果。

===运算符不仅会比较值,还会比较类型,因此不会运行强制转换。在这种情况下"20" !== 20

答案 1 :(得分:3)

当需要进行类型转换时,JavaScript会按如下方式转换String,Number,Boolean或Object操作数。

  • 比较数字和字符串时,字符串将转换为数字值。 JavaScript尝试将字符串数字文字转换为数字类型值。首先,从字符串数字文字中导出数学值。接下来,将此值四舍五入为最接近的数字类型值。
  • 如果其中一个操作数是布尔值,则布尔操作数如果为真则转换为1,如果为假则转换为+0。
  • 如果将对象与数字或字符串进行比较,JavaScript会尝试返回该对象的默认值。运算符尝试使用对象的valueOf和toString方法将对象转换为原始值,String或Number值。如果转换对象的尝试失败,则会生成运行时错误。

==比较的问题是JavaScript版本1.2不执行类型转换,而版本1.1和1.3版本执行。

自版本1.3以来,===比较已经可用,并且是检查两个变量匹配的最佳方法。

如果您需要将代码与版本1.1,1.2和1.3版本的JavaScript代码兼容,则应确保所有变量都匹配,就像正在执行的===比较一样。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

Javascript的设计使得包含数字的字符串被认为与该数字“相等”。原因是用户在输入字段中输入数字并且网站在JS中验证它的情况下使用简单 - 您不必在比较之前将输入的字符串强制转换为数字。

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

答案 5 :(得分:0)

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