我使用JSLint检查JavaScript代码,它建议将比较语句中的==
(两个等号)替换为===
(三个等号),例如在if
语句中比较idSele_UNVEHtype.value.length == 0
。
使用===
代替==
是否有性能优势?
任何性能提升都是受欢迎的,因为存在许多比较运算符。
如果不涉及类型转换,是否会比使用==
更快?
我使用JSLint检查JavaScript代码,它建议将比较语句中的==
(两个等号)替换为===
(三个等号),例如在if
语句中比较idSele_UNVEHtype.value.length == 0
。
使用===
代替==
是否有性能优势?
任何性能提升都是受欢迎的,因为存在许多比较运算符。
如果不涉及类型转换,是否会比使用==
更快?
===
运算符检查变量的值和类型是否相等。
==
运算符仅检查变量的值是否相等。
这是一个严格的检查测试。
尤其是在0和false以及null之间进行检查时,这是一件好事。
例如,如果你有:
$a = 0;
然后:
$a==0;
$a==NULL;
$a==false;
所有值都为true可能不是你想要的结果。假设你有一个函数,可以返回数组的第0个索引或在失败时返回false。如果你使用"=="与false进行比较,你可能会得到混淆的结果。
所以,采用与上述相同的内容,但采用严格检测:
$a = 0;
$a===0; // returns true
$a===NULL; // returns false
$a===false; // returns false
JSLint有时给出不切实际的理由来修改代码。如果类型已经相同,则使用===
与使用==
的性能完全相同。
只有在类型不同的情况下,===
才更快,此时它不会尝试转换类型,而是直接返回false。
因此,我的看法是,JSLint可能用于编写新代码,但应避免无谓的过度优化。
也就是说,在像if (a == 'test')
这样的检查中,如果你确信a只能是一个字符串,那么没有理由将==
改为===
。
以这种方式修改大量的代码会浪费开发人员和审核人员的时间,却不会取得任何成果。
a.length===4
比a.length==4
实际上更慢。无论如何,这都是微观优化,但这与人们所声称的相反。 - aross一个简单的例子是
2 == '2' -> true, values are SAME because of type conversion.
2 === '2' -> false, values are NOT SAME because of no type conversion.
前两个答案都提到 == 表示相等,而 === 表示恒等。不幸的是,这种说法是不正确的。
如果 == 的两个操作数都是对象,则它们将被比较以查看它们是否为同一个对象。如果两个操作数指向同一个对象,则相等运算符返回 true。否则,它们不相等。
var a = [1, 2, 3];
var b = [1, 2, 3];
console.log(a == b) // false
console.log(a === b) // false
在上述代码中,== 和 === 都得到了false,因为a和b不是同一个对象。
也就是说:如果==的两个操作数都是对象,==的行为与===相同,这也意味着身份。这两个运算符的基本区别在于类型转换。==在检查相等性之前进行转换,但===则不会。
等值比较:
==
操作符
当两个操作数相等时返回 true。在进行比较之前,将操作数转换为相同的类型。
>>> 1 == 1
true
>>> 1 == 2
false
>>> 1 == '1'
true
平等和类型比较:
===
运算符
如果两个操作数相等并且类型相同,则返回 true。通常使用这种方式进行比较更好、更安全,因为没有任何幕后的类型转换。
>>> 1 === '1'
false
>>> 1 === 1
true
这里提供了一张实用的比较表格,展示了==
和===
之间的转换和区别。
正如结论所述:
“除非你完全理解两个等号所发生的转换,请使用三个等号。”
null和undefined都代表着空值,也就是说,它们没有值。
var a;
var b = null;
这里的a
和b
没有值。而0、false和''都是值。它们共同之处是它们都是假值,这意味着它们都满足假条件。
因此,0、false和''在一起形成了一个子组。另一方面,null和undefined形成了第二个子组。请查看下面图像中的比较。null和undefined将相等。其他三个将互相相等。但是,在JavaScript中,它们都被视为假条件。
这与任何对象(例如{},数组等)、非空字符串和布尔值true都是真条件相同。但是,它们都不相等。