7

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

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

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

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

但是不使用 == 运算符的原因是什么?会不会带来安全风险?

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

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

4 回答 4

9

==代码对引擎盖下发生的隐式转换感到满意时,可以使用操作符。这个过程虽然有时与直觉相反,但定义明确。

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

if (typeof x === "function") { 
  ...
}
于 2013-04-02T16:03:55.057 回答
5

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

这与安全无关;它是关于性能和以正确的方式做事的。

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

简而言之,===除非您确定需要==.

于 2013-04-02T16:08:47.993 回答
1

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

  1. 将用户输入的值与整数进行比较时
  2. 将对象与 null 或 undefined 进行比较时,因为 null 不明确等于 undefined

但是我做了一些阅读,发现了这个,这是一个非常有力的理由,永远不要使用 ==。我想这取决于你的意图,如果你想要一个快速(并且可以说是讨厌的)包罗万象然后使用 ==,但它可能更好的做法(和一些额外的工作)来实现显式比较。

于 2013-04-02T16:20:50.393 回答
0

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

== 不被推荐,因为你可能会忘记在那种场景中使用'typeof',或者你可能根本没有意识到类型不能'自然'比较......当然你仍然可以使用它,但你真的应该只在你真的需要比较不同类型并了解这些类型的结果何时为真/假时才使用它

于 2013-04-02T16:05:35.570 回答