我使用JSLint检查JavaScript代码,它建议将比较语句中的==
(两个等号)替换为===
(三个等号),例如在if
语句中比较idSele_UNVEHtype.value.length == 0
。
使用===
代替==
是否有性能优势?
任何性能提升都是受欢迎的,因为存在许多比较运算符。
如果不涉及类型转换,是否会比使用==
更快?
我使用JSLint检查JavaScript代码,它建议将比较语句中的==
(两个等号)替换为===
(三个等号),例如在if
语句中比较idSele_UNVEHtype.value.length == 0
。
使用===
代替==
是否有性能优势?
任何性能提升都是受欢迎的,因为存在许多比较运算符。
如果不涉及类型转换,是否会比使用==
更快?
JavaScript有严格比较和类型转换比较。严格比较(例如===
)仅当操作数为相同类型时才为真。更常用的抽象比较(例如==
)在进行比较之前将操作数转换为相同的类型。
等式(==
)运算符将操作数转换为相同类型,然后应用严格比较。如果任一操作数为数字或布尔值,则如果可能,将操作数转换为数字;否则,如果任一操作数为字符串,则将字符串操作数转换为数字。如果两个操作数都是对象,则JavaScript比较内部引用,当操作数引用内存中的同一对象时它们是相等的。
语法:
x == y
示例:
3 == 3 // true
"3" == 3 // true
3 == '3' // true
身份/严格相等(===
)运算符在没有类型转换的情况下,如果操作数严格相等(见上文),则返回true。
语法:
x === y
示例:
3 === 3 // true
参考资料: 比较运算符 (Mozilla开发者网络)
*操作符 === 与 == *
1 == true => true
true == true => true
1 === true => false
true === true => true
如果您正在制作Web应用程序或安全页面,则应始终使用(仅在可能的情况下)
===
因为它会检查内容是否相同并且类型也相同!var check = 1;
if(check == '1') {
//someone continued with a string instead of number, most of the time useless for your webapp, most of the time entered by a user who does not now what he is doing (this will sometimes let your app crash), or even worse it is a hacker searching for weaknesses in your webapp!
}
但是有了
var check = 1;
if(check === 1) {
//some continued with a number (no string) for your script
} else {
alert('please enter a real number');
}
一个黑客永远不会深入系统寻找漏洞并攻击您的应用程序或用户。===
将可增加脚本的安全性。
当然,您也可以使用其他if语句检查输入的数字是否有效、是否为字符串等等,但至少对我来说,这种方法更易于理解和使用。
我发布这篇文章的原因是,在这次交谈中从未提到过“更安全”或“安全”一词(如果您查看iCloud.com,它会使用2019次===和1308次==。这也意味着有时必须使用==而不是===,因为否则它将阻止您的函数,但正如开头所说,应尽可能使用===)。
我使用emacs org-mode和node.js来运行测试的推理过程。
| use == | '' | '0' | false | 'false' | undefined | null | ' \t\r\n ' |
| '' | x | f | t | f | f | f | f |
| '0' | | x | t | f | f | f | f |
| false | | | x | f | f | f | t |
| 'false' | | | | x | f | f | f |
| undefined | | | | | x | t | f |
| null | | | | | | x | f |
| ' \t\r\n ' | | | | | | | x |
| use === | '' | '0' | false | 'false' | undefined | null | ' \t\r\n ' |
| '' | x | f | f | f | f | f | f |
| '0' | | x | f | f | f | f | f |
| false | | | x | f | f | f | f |
| 'false' | | | | x | f | f | f |
| undefined | | | | | x | f | f |
| null | | | | | | x | f |
| ' \t\r\n ' | | | | | | | x |
以下是我的测试脚本:运行 > node xxx.js
var rowItems = ['', '0', false, 'false', undefined, null, ' \t\r\n ']
var colItems = rowItems
for(var i = 0; i < rowItems.length; i++) {
for (var j = 0; j < colItems.length; j++) {
var r = (rowItems[i] === colItems[j]) ? true : false;
console.log(rowItems[i] + " = " + colItems[j] + " " + r + " [" + i + "] ==> [" + j + "]")
};
}
===
关心对象是否相同。因此,new String("Hello world") === "Hello world"
返回false。然而,==
不关心对象是否相同;它只是简单地将一个参数转换为另一个参数的类型:如果转换不可能,则返回false。因此,new String("Hello world") == "Hello world"
返回true而不是false。
==
运算符仅比较值而不比较数据类型。
===
运算符将值及其数据类型进行比较。
例如:
1 == "1" //true
1 === "1" //false
在执行自动类型转换的语言中,例如PHP、Javascript,这个运算符("==="
)被使用。"==="
运算符有助于防止由于自动类型转换导致的意外比较。
Javascript是一种弱类型语言,即没有像C、C++中的数据类型,例如int、boolean、float等。因此一个变量可以持有任何类型的值,这就是为什么需要这些特殊的比较运算符。
例如:
var i = 20;var j = "20";
如果我们应用比较运算符,这些变量的结果将是:
i==j //result is true
或者j != i//result is false
为此,我们需要一种特殊的比较运算符,它检查变量的值和数据类型。
如果我们这样做
i===j //result is false
=、= =、= = = 的区别
=
运算符用于仅赋值给 value
。= =
运算符用于仅比较 values
而不是 datatype
。= = =
运算符用于比较 values
和 datatype
。始终使用' === ',您就能避免成千上万的错误。现今,使用三重相等更受不同样式指南的青睐,因为它考虑操作数的类型进行比较。
==
如果类型相同,则会委托给严格的相等比较。两个对象通过引用进行比较,但对于两个运算符都是如此。_“如果无法转换”_——我猜...但通常可以进行强制转换,并且这不足以导致比较的一个或另一个结果,例如"undefined" != undefined
,即使可以进行强制转换。 - Sebastian Simon