什么时候可以在JavaScript中使用==?

时间:2013-04-02 16:01:06

标签: javascript operators equality

来自:http://www.2ality.com/2011/12/strict-equality-exemptions.html

  

JavaScript有两个运算符用于确定两个值是否相等:

     
      
  • 严格相等运算符===只考虑具有相同类型的相等值。
  •   
  • “正常”(或宽松)等于运算符==在比较严格相等之前尝试转换不同类型的值。
  •   
     

给予JavaScript初学者的建议是完全忘记==并始终使用===。

但是为什么不使用==运算符会让它感到惊讶?这会导致安全风险吗?

但是使用typeof运算符我们可以确定结果将是一个字符串。然后==可以安全使用,因为我们可以确定它不会执行任何转换恶作剧:

if (typeof x == "function") {
    ...
}

4 个答案:

答案 0 :(得分:7)

当代码适应隐藏的转换时,==运算符可以使用。这个过程虽然有时很直观,但是很明确。

但是,我仍然绝对会在您提供的示例中使用===。如果预计不会进行任何转换,那么使用==会给读者带来混乱。它说“我希望转换”实际上不会发生转换。您应该使用满足您正在寻找的条件的最具体的运算符

if (typeof x === "function") { 
  ...
}

答案 1 :(得分:2)

如果您确定它不会执行任何“转换恶作剧”,根据您的示例,那么是的,您仍然应该使用=== ,因为您将节省解析器必须确定是否需要进行转换。所以你会获得更好的表现。 (边缘,但仍然)

这与安全无关;这是关于绩效和以正确的方式做事。

你应该使用双倍相等的唯一时间是你事先知道你肯定想要使用javascript的隐式类型转换。例如,如果要检查输入字段的数值(可能是字符串),则可能就是这种情况。但即便如此,在很多情况下,最好先手动转换值。

简而言之,除非您确定需要===的隐式转换功能,否则请在所有地方使用==语法。

答案 2 :(得分:1)

当我最初阅读您的问题时,我想到了两种情况:

  1. 将用户输入的值与整数进行比较时
  2. 将对象与null或undefined进行比较时,因为null未明确等于undefined
  3. 但我做了一些阅读并遇到了this,这是一个非常强大的案例,从不使用==。我想这取决于你的意图,如果你想要一个快速(并且可以说是令人讨厌的)捕获所有然后使用==,但它可能更好的实践(和一些额外的工作)来实现显式比较。

答案 3 :(得分:0)

如果它们都是字符串,则没有理由来使用===。

==不推荐,因为您可能忘记在这种情况下使用'typeof',或者您可能根本没有意识到这些类型无法“自然地”进行比较...当然您仍然可以使用它,但如果你真的需要来比较不同的类型,并了解这些类型的结果是真/假,你应该真的只使用它