我使用JSLint检查JavaScript代码,它建议将比较语句中的==
(两个等号)替换为===
(三个等号),例如在if
语句中比较idSele_UNVEHtype.value.length == 0
。
使用===
代替==
是否有性能优势?
任何性能提升都是受欢迎的,因为存在许多比较运算符。
如果不涉及类型转换,是否会比使用==
更快?
我使用JSLint检查JavaScript代码,它建议将比较语句中的==
(两个等号)替换为===
(三个等号),例如在if
语句中比较idSele_UNVEHtype.value.length == 0
。
使用===
代替==
是否有性能优势?
任何性能提升都是受欢迎的,因为存在许多比较运算符。
如果不涉及类型转换,是否会比使用==
更快?
===
的一个未提及的原因是,当您与/交叉编译到/从coffee-script
一起存在时。来自Little Book on CoffeeScript...
JavaScript中的弱等比较具有某些令人困惑的行为,并且经常是令人困惑的错误的根源。
解决方案是改用严格相等运算符,它由三个等号组成:===。它的工作方式与普通的等式运算符完全相同,但没有任何类型强制转换。建议始终使用严格相等运算符,并在需要时明确转换类型。
如果您经常转换到和从coffee-script
,则应该只使用===
。实际上,coffee-script
编译器将强制您这样做...
CoffeeScript通过简单地将所有弱比较替换为严格比较来解决此问题,换句话说,将所有==比较器转换为===。您无法在CoffeeScript中进行弱等比较,如果必要,应显式转换类型后再进行比较。
在使用JavaScript时,需要时刻牢记它是一种弱类型语言。只要数据结构相同,没有理由不使用严格相等。使用普通相等时,值往往会自动进行隐式转换,这可能会对代码产生深远的影响。由于这些转换是自动进行的,因此很容易出现问题。
使用严格相等时,不会进行自动隐式转换,因为值必须已经具有正确的数据结构。
首先,关于JavaScript字符串相等的一些术语:双等号被正式称为抽象相等比较运算符,而三个等号则被称为严格相等比较运算符。它们之间的区别可以概括如下:在进行比较之前,抽象相等会尝试通过类型强制转换来解析数据类型。如果类型不同,严格相等会返回false。考虑以下示例:
console.log(3 == "3"); // true
console.log(3 === "3"); // false.
console.log(3 == "3"); // true
console.log(3 === "3"); // false.
使用两个等号返回 true,因为在比较之前字符串“3”被转换为数字 3。三个等号看到类型不同,返回 false。这是另一个例子:
console.log(true == '1'); // true
console.log(true === '1'); // false
console.log(true == '1'); // true
console.log(true === '1'); // false
再次说明,抽象相等比较会进行类型转换。在这种情况下,布尔值true和字符串'1'都被转换为数字1,结果为true。严格相等返回false。
如果你理解了这一点,就可以很好地区分==和===之间的区别。然而,在某些情况下,这些运算符的行为是不直观的。让我们看一些更多的例子:
console.log(undefined == null); // true
console.log(undefined === null); // false. Undefined and null are distinct types and are not interchangeable.
console.log(undefined == null); // true
console.log(undefined === null); // false. Undefined and null are distinct types and are not interchangeable.
console.log(true == 'true'); // false. A string will not be converted to a boolean and vice versa.
console.log(true === 'true'); // false
console.log(true == 'true'); // false. A string will not be converted to a boolean and vice versa.
console.log(true === 'true'); // false
console.log("This is a string." == new String("This is a string.")); // true
console.log("This is a string." === new String("This is a string.")); // false
console.log("This is a string." == new String("This is a string.")); // true
console.log("This is a string." === new String("This is a string.")); // false
var x = "20";
var y =20;
if (x===y) // false
If(x==y)//true
然而,这只是检查内容是否相同,不考虑数据类型...
我不想说这些值相等,因为从逻辑上讲,字符串值不能等于整数值。
建议将==
替换为===
的原因是===
运算符比==
更可靠。在我们的上下文中,可靠性意味着===
还进行类型检查。考虑到最佳编程实践,我们应该始终选择可靠性更高的功能而不是可靠性较低的功能。再次强调,每当我们考虑到“完全相等”的运算符时,大多数情况下,我们默认认为类型应该相同。由于===
提供了相同的功能,我们应该选择它。
==
还是===
的困境,类似于一个问题:“我应该用‘勺子’还是‘叉子’来吃饭。”这个问题的唯一合理答案是:
==
进行宽松类型比较。===
进行强类型比较。==
来喝汤,使用“叉子”,即===
来夹菜。" === ,这被称为严格相等,它意味着只有当类型和值都相同时才会返回true,因此您不必担心类型问题。如果您使用 == ,则基本上不关心类型,在许多情况下,您可能会遇到松散的等式比较问题。
使用===进行严格相等
严格相等比较两个值是否相等。在比较之前,没有任何一个值会被隐式转换为其他值。如果这些值具有不同的类型,则这些值被认为是不相等的。否则,如果这些值具有相同的类型并且不是数字,则如果它们具有相同的值,则被认为是相等的。最后,如果这两个值都是数字,则如果它们都不是NaN并且是相同的值,或者其中一个是+0,另一个是-0,则它们被认为是相等的。
var num = 0;
var obj = new String('0');
var str = '0';
console.log(num === num); // true
console.log(obj === obj); // true
console.log(str === str); // true
console.log(num === obj); // false
console.log(num === str); // false
console.log(obj === str); // false
console.log(null === undefined); // false
console.log(obj === null); // false
console.log(obj === undefined); // false
使用 == 进行宽松相等性比较
宽松相等性比较两个值的相等性,在将两个值转换为公共类型后进行。在转换之后(一个或两个值可能会经过转换),最终的相等性比较将与 === 完全相同。宽松相等性是对称的:对于任何 A 和 B 的值,A == B 总是具有与 B == A 相同的语义(除了应用转换的顺序)。
var num = 0;
var obj = new String('0');
var str = '0';
console.log(num == num); // true
console.log(obj == obj); // true
console.log(str == str); // true
console.log(num == obj); // true
console.log(num == str); // true
console.log(obj == str); // true
console.log(null == undefined); // true
// both false, except in rare cases
console.log(obj == null);
console.log(obj == undefined);
var a = new String("123");
var b = "123";
alert(a === b); // returns false !! (but they are equal and of the same type)
a
和b
实际上不是相同的类型,如果你检查typeof(a)
,你会得到'object',而typeof(b)
是'string'。
length
属性始终是数字类型,因此不存在虚假阳性的可能性。此外,当您可以使用直接的简写!dSele_UNVEHtype.value.length
时,就不需要dSele_UNVEHtype.value.length === 0
了。 - Bekim Bacaj