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

Posted

技术标签:

【中文标题】什么时候可以在 JavaScript 中使用 ==?【英文标题】:When is it OK to use == in JavaScript? 【发布时间】:2013-03-24 00:28:46 【问题描述】:

发件人:http://www.2ality.com/2011/12/strict-equality-exemptions.html

javascript 有两个运算符用于判断两个值是否相等:

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

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

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

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

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

【问题讨论】:

就我个人而言,我从未在 JavaScript 中使用过===,哪怕一次。 如果=== 没有损坏,请不要修复它。 @Kolink 这并不值得骄傲。 @Maizere 如果您知道需要执行隐式转换,请使用 == 运算符。 @Kolink 这是在找麻烦。我和任何人一样讨厌毫无根据的笼统概括。但仅仅因为了解我可以安全地使用mysql_* 函数,并不意味着我会使用它们。一方面,准备好的语句比mysql_* 提供的任何东西都更具可读性。将来它们也会从 php 中删除。 【参考方案1】:

== 操作符可以在代码熟悉隐式转换时使用。这个过程虽然有时与直觉相反,但定义明确。

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

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

简而言之,在任何地方都使用=== 语法,除非您确定需要== 的隐式转换功能。

【讨论】:

在不进行转换时,===== 之间没有性能差异。 === 仍然进行类型检查。如果类型不同,则返回 false。但它仍然会进行类型检查。 最后一段也可以很容易地改成“简而言之,除非你确定你需要===的严格性,否则在任何地方都使用==语法。 "【参考方案4】:

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

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

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

【讨论】:

以上是关于什么时候可以在 JavaScript 中使用 ==?的主要内容,如果未能解决你的问题,请参考以下文章

什么时候应该在 JavaScript 中使用 outerHTML? [关闭]

JavaScript 练习题

在 JavaScript 中,什么时候使用 Map 或胜过 Object

我们啥时候在javascript导入中使用''? [复制]

我们在使用jQuery的时候,到底在使用什么?

什么时候404不是404?