4

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

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吗?

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

4

6 回答 6

19

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

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

于 2008-11-02T17:28:29.687 回答
3

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

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

== 比较的问题在于 JavaScript 版本 1.2 不执行类型转换,而版本 1.1 和 1.3 及以后的版本执行。

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

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

于 2008-11-03T23:43:37.807 回答
2

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

于 2008-11-02T17:29:26.317 回答
1

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

于 2008-11-02T17:29:31.917 回答
1

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

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

于 2008-11-02T17:30:13.567 回答
0

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

于 2008-11-02T17:30:01.570 回答