我使用JSLint通过JavaScript,它返回了许多建议,以取代 ==(两个平等的标志)与 ===(三个平等的标志)当做一些事情,如比较idSele_UNVEHtype.value.length == 0在一个假设声明。

能否取代 = = = = = = =?

任何性能改进都将被欢迎,因为有许多比较运营商。

如果没有类型转换发生,会有超越 ==的性能收益吗?


当前回答

使用一个未提到的理由 === - 是你与 / 交叉编写到 / 从咖啡脚本共存的情况。

JavaScript 的弱平等比较有某种混乱的行为,并且往往是混乱的错误的来源。 解决方案是使用严格的平等运营商,由三个平等标志组成: ===. 它就像正常的平等运营商一样工作,但没有任何类型的强迫。

如果你经常转换到和从咖啡脚本,你应该只使用 ===。

CoffeeScript 解决了这一点,简单地将所有弱的比较与严格的比较相替代,换句话说,将所有 ==比较器转换为 ===. 在 CoffeeScript 中,你不能进行弱的平等比较,并且在需要时比较之前,你应该明确地转换类型。

其他回答

简单

= = = = = = = = = = = = = = = = = = = = = =

=== 是指在没有类型强迫的情况下进行操作的比较。

格式强制在JavaScript中意味着自动将数据类型转换为其他数据类型。

例如:

123 == "123"  // Returns true, because JS coerces string "123" to number 123
              // and then goes on to compare `123 == 123`.

123 === "123" // Returns false, because JS does not coerce values of different types here.

让我们添加这个建议:

如果有疑问,请阅读规格!

請讓我解釋如何閱讀規格來澄清這個問題. 我看到,在這個非常古老的主題中,沒有人對非常奇怪的效果有答案. 所以,如果你能閱讀一個規格,這將非常幫助你在你的職業。

搜索 PDF 文件为 === 引导我到规格的第 56 页: 11.9.4. The Strict Equals Operator ( === ),然后通过规格我发现:

我发现新的线条(“a”)是一个对象,并使用步骤1:返回错误,如果类型不同。


Aidiakapi在下面的评论中写道:

从规格 11.2.2 新操作员:如果类型(构建器)不是对象,扔一个 TypeError 例外. 换句话说,如果 String 不是对象类型,它不能与新操作员一起使用。

而这最终意味着:新线(“a”)!==“a”。

在这里的答案中,我没有读到什么是平等的意思,有些人会说 === 意味着平等和相同的类型,但这不是真的。

所以,让我们采取下列代码:

var a = [1,2,3];
var b = [1,2,3];
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

在这里相同:

var a = { x: 1, y: 2 };
var b = { x: 1, y: 2 };
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

var a = { };
var b = { };
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

这种行为并不总是显而易见的,有更多的故事,而不是平等和同类。

规则是:

对于值类型(数字): a === b 如果 a 和 b 具有相同的值,并且具有相同的类型,则返回真实。


下一篇:特殊案例...

var a = "12" + "3";
var b = "123";

alert(a === b); // returns true, because strings behave like value types

但是,这个问题怎么样呢?

var a = new String("123");
var b = "123";

alert(a === b); // returns false !! (but they are equal and of the same type)

我以为线条像值类型一样行事吗? 好吧,这取决于你问谁...... 在这种情况下, a 和 b 不是相同的类型. a 是类型对象,而 b 是类型线条。

一个简单的例子是

2 == '2'  -> true, values are SAME because of type conversion.

2 === '2'  -> false, values are NOT SAME because of no type conversion.

JSLint 有时会给你一些不现实的理由来改变事物。 === 具有与 == 相同的性能,如果类型已经相同。

它只有当类型不相同时更快,在这种情况下它不会尝试转换类型,而是直接返回虚假。

因此,IMHO,JSLint可能用来写新的代码,但无用的过度优化应该以任何代价避免。

也就是说,在一个检查中没有理由改变 == 到 === 如果(一个 == 测试)当你知道它是因为一个可以只是一个线条。

修改大量的代码会浪费开发人员和评论家的时间,并无所得。