我使用JSLint通过JavaScript,它返回了许多建议,以取代 ==(两个平等的标志)与 ===(三个平等的标志)当做一些事情,如比较idSele_UNVEHtype.value.length == 0在一个假设声明。
能否取代 = = = = = = =?
任何性能改进都将被欢迎,因为有许多比较运营商。
如果没有类型转换发生,会有超越 ==的性能收益吗?
我使用JSLint通过JavaScript,它返回了许多建议,以取代 ==(两个平等的标志)与 ===(三个平等的标志)当做一些事情,如比较idSele_UNVEHtype.value.length == 0在一个假设声明。
能否取代 = = = = = = =?
任何性能改进都将被欢迎,因为有许多比较运营商。
如果没有类型转换发生,会有超越 ==的性能收益吗?
当前回答
原因在上面的答案中被解释,而且杜格拉斯·克罗克福德也对此非常清楚(JavaScript:The Good Parts)。
但是,有一個例外: == null 是檢查“是零或不定義”的有效方式:
if( value == null ){
// value is either null or undefined
}
例如,jQuery 1.9.1 使用此模式 43 次,而 JSHint 合成检查器甚至为此提供 eqnull 放松选项。
从 jQuery 风格指南:
严格的平等检查(===)应用于对 ==的支持,唯一的例外是通过零来检查非定义和零。
// Check for both undefined and null values, for some important reason.
undefOrNull == null;
编辑 2021-03:
如今,大多数浏览器支持 Nullish coalescing 操作器(??) 和 Logical nullish 任务(??=),如果变量是 null 或 undefined,例如:
if (a.speed == null) {
// Set default if null or undefined
a.speed = 42;
}
可以用任何形式写作。
a.speed ??= 42;
a.speed ?? a.speed = 42;
a.speed = a.speed ?? 42;
其他回答
让我们添加这个建议:
如果有疑问,请阅读规格!
請讓我解釋如何閱讀規格來澄清這個問題. 我看到,在這個非常古老的主題中,沒有人對非常奇怪的效果有答案. 所以,如果你能閱讀一個規格,這將非常幫助你在你的職業。
搜索 PDF 文件为 === 引导我到规格的第 56 页: 11.9.4. The Strict Equals Operator ( === ),然后通过规格我发现:
我发现新的线条(“a”)是一个对象,并使用步骤1:返回错误,如果类型不同。
Aidiakapi在下面的评论中写道:
从规格 11.2.2 新操作员:如果类型(构建器)不是对象,扔一个 TypeError 例外. 换句话说,如果 String 不是对象类型,它不能与新操作员一起使用。
而这最终意味着:新线(“a”)!==“a”。
在JavaScript中,它具有相同的值和类型。
例如,
4 == "4" // will return true
但
4 === "4" // will return false
“我要在JavaScript比较中使用 ==或 ===”的辩论是相同或类似于一个问题:“我要用一个“<unk>”或一个“<unk>”吃。
这个问题的唯一合理答案是:
您应该使用动态类型比较,例如:==为空白类型比较,您应该使用静态类型比较,例如:===为强大的类型比较。
这是因为他们不是相同的,他们没有相同的目的,并且不应该用于相同的目的。
當然,兩個「<unk>」和「<unk>」都是用於「吃」的,但你會選擇根據你所服用的食物使用它們。
使用一个未提到的理由 === - 是你与 / 交叉编写到 / 从咖啡脚本共存的情况。
JavaScript 的弱平等比较有某种混乱的行为,并且往往是混乱的错误的来源。 解决方案是使用严格的平等运营商,由三个平等标志组成: ===. 它就像正常的平等运营商一样工作,但没有任何类型的强迫。
如果你经常转换到和从咖啡脚本,你应该只使用 ===。
CoffeeScript 解决了这一点,简单地将所有弱的比较与严格的比较相替代,换句话说,将所有 ==比较器转换为 ===. 在 CoffeeScript 中,你不能进行弱的平等比较,并且在需要时比较之前,你应该明确地转换类型。
一个简单的例子是
2 == '2' -> true, values are SAME because of type conversion.
2 === '2' -> false, values are NOT SAME because of no type conversion.