JavaScript比较中应该使用哪种等于运算符(== vs ===)?

5647

我使用JSLint检查JavaScript代码,它建议将比较语句中的==(两个等号)替换为===(三个等号),例如在if语句中比较idSele_UNVEHtype.value.length == 0

使用===代替==是否有性能优势?

任何性能提升都是受欢迎的,因为存在许多比较运算符。

如果不涉及类型转换,是否会比使用==更快?

48个回答

18

JavaScript有严格比较和类型转换比较。严格比较(例如===)仅当操作数为相同类型时才为真。更常用的抽象比较(例如==)在进行比较之前将操作数转换为相同的类型。

  • 等式(==)运算符将操作数转换为相同类型,然后应用严格比较。如果任一操作数为数字或布尔值,则如果可能,将操作数转换为数字;否则,如果任一操作数为字符串,则将字符串操作数转换为数字。如果两个操作数都是对象,则JavaScript比较内部引用,当操作数引用内存中的同一对象时它们是相等的。

    语法:

    x == y

    示例:

3 == 3     // true
"3" == 3   // true
3 == '3'   // true
  • 身份/严格相等(===)运算符在没有类型转换的情况下,如果操作数严格相等(见上文),则返回true。

    语法:

    x === y

    示例:

    3 === 3 // true

  • 参考资料: 比较运算符 (Mozilla开发者网络)


    18

    *操作符 === 与 == *

    1 == true    =>    true
    true == true    =>    true
    1 === true    =>    false
    true === true    =>    true
    

    17

    如果您正在制作Web应用程序或安全页面,则应始终使用(仅在可能的情况下)

    ===
    
    因为它会检查内容是否相同并且类型也相同!
    所以当有人输入:
    var check = 1;
    if(check == '1') {
        //someone continued with a string instead of number, most of the time useless for your webapp, most of the time entered by a user who does not now what he is doing (this will sometimes let your app crash), or even worse it is a hacker searching for weaknesses in your webapp!
    }
    

    但是有了

    var check = 1;
    if(check === 1) {
        //some continued with a number (no string) for your script
    } else {
        alert('please enter a real number');
    }
    
    一个黑客永远不会深入系统寻找漏洞并攻击您的应用程序或用户。
    我的观点是,
    ===
    

    将可增加脚本的安全性。

    当然,您也可以使用其他if语句检查输入的数字是否有效、是否为字符串等等,但至少对我来说,这种方法更易于理解和使用。

    我发布这篇文章的原因是,在这次交谈中从未提到过“更安全”或“安全”一词(如果您查看iCloud.com,它会使用2019次===和1308次==。这也意味着有时必须使用==而不是===,因为否则它将阻止您的函数,但正如开头所说,应尽可能使用===)。


    13

    我使用emacs org-mode和node.js来运行测试的推理过程。

    | use ==     | '' | '0' | false | 'false' | undefined | null | ' \t\r\n ' |
    | ''         | x  | f   | t     | f       | f         | f    | f          |
    | '0'        |    | x   | t     | f       | f         | f    | f          |
    | false      |    |     | x     | f       | f         | f    | t          |
    | 'false'    |    |     |       | x       | f         | f    | f          |
    | undefined  |    |     |       |         | x         | t    | f          |
    | null       |    |     |       |         |           | x    | f          |
    | ' \t\r\n ' |    |     |       |         |           |      | x          | 
    
    
    
    | use ===    | '' | '0' | false | 'false' | undefined | null | ' \t\r\n ' |
    | ''         | x  | f   | f     | f       | f         | f    | f          |
    | '0'        |    | x   | f     | f       | f         | f    | f          |
    | false      |    |     | x     | f       | f         | f    | f          |
    | 'false'    |    |     |       | x       | f         | f    | f          |
    | undefined  |    |     |       |         | x         | f    | f          |
    | null       |    |     |       |         |           | x    | f          |
    | ' \t\r\n ' |    |     |       |         |           |      | x          |
    

    以下是我的测试脚本:运行 > node xxx.js

    var rowItems = ['', '0', false, 'false', undefined, null, ' \t\r\n ']
    var colItems = rowItems
    
    for(var i = 0; i < rowItems.length; i++) {
        for (var j = 0; j < colItems.length; j++) {
            var r = (rowItems[i] === colItems[j]) ? true : false;
            console.log(rowItems[i] + " = " + colItems[j] + " " + r + " [" + i + "] ==> [" + j + "]")
        };
    }
    

    12

    ===关心对象是否相同。因此,new String("Hello world") === "Hello world" 返回false。然而,==不关心对象是否相同;它只是简单地将一个参数转换为另一个参数的类型:如果转换不可能,则返回false。因此,new String("Hello world") == "Hello world"返回true而不是false。


    这个答案有点误导性,或者说,不太精确...“objects”?你是指“types”吗?==如果类型相同,则会委托给严格的相等比较。两个对象通过引用进行比较,但对于两个运算符都是如此。_“如果无法转换”_——我猜...但通常可以进行强制转换,并且这不足以导致比较的一个或另一个结果,例如"undefined" != undefined,即使可以进行强制转换。 - Sebastian Simon

    11

    == 运算符仅比较值而不比较数据类型。

    === 运算符将值及其数据类型进行比较。

    例如:

    1 == "1" //true
    
    1 === "1" //false
    

    在执行自动类型转换的语言中,例如PHP、Javascript,这个运算符("===")被使用。
    "==="运算符有助于防止由于自动类型转换导致的意外比较。


    对于“==”,数据类型并不重要。 - mrmr68
    @mrmr68 抽象相等比较的操作数类型非常重要——它用于强制将操作数转换为其他类型,以便进行比较。 - Sebastian Simon

    11

    Javascript是一种弱类型语言,即没有像C、C++中的数据类型,例如int、boolean、float等。因此一个变量可以持有任何类型的值,这就是为什么需要这些特殊的比较运算符。

    例如:

    var i = 20;var j = "20";
    

    如果我们应用比较运算符,这些变量的结果将是:

    i==j //result is true
    
    或者
    j != i//result is false
    

    为此,我们需要一种特殊的比较运算符,它检查变量的值和数据类型。

    如果我们这样做

    i===j //result is false
    

    8

    =、= =、= = = 的区别

    • = 运算符用于仅赋值给 value
    • = = 运算符用于仅比较 values 而不是 datatype
    • = = = 运算符用于比较 valuesdatatype

    7

    始终使用' === ',您就能避免成千上万的错误。现今,使用三重相等更受不同样式指南的青睐,因为它考虑操作数的类型进行比较。


    5
    是的,等于运算符“==”和恒等运算符“===”之间有很大的区别。
    通常情况下,恒等运算符的执行速度更快,因为它不会进行类型转换。但如果值是相同类型的,则不会看到任何差异。
    请查看我的帖子《JavaScript 等于运算符的传说》,其中解释了详细信息,包括类型转换和比较算法,并提供了许多示例。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接