应该在JavaScript比较中使用哪个等于运算符(== vs ===)?

我使用JSLint来浏览JavaScript,并且它返回了很多建议,以便在比较idSele_UNVEHtype.value.length == 0时使用=== (三个等号)替换== (两个等号) if声明。

===替换==是否有性能优势?

许多比较运算符存在,任何性能改进都会受到欢迎。

如果没有类型转换发生,会有比==更好的性能吗?


身份( === )运算符的行为与相等( == )运算符的行为相同,除非没有进行类型转换,并且类型必须相同才能被视为相等。

参考:Javascript教程:比较运算符

在进行任何必要的类型转换后, ==运算符将进行比较。 ===运算符不会执行转换,所以如果两个值不是相同的类型===将简单地返回false 。 两者同样快速。

引用Douglas Crockford的优秀JavaScript:The Good Parts,

JavaScript有两套相等运算符: ===!== ,以及它们的邪恶双胞胎==!= 。 好的那些以你期望的方式工作。 如果两个操作数具有相同的类型并具有相同的值,则===产生true并且!==产生false 。 当操作数是相同类型的时候,邪恶的双胞胎做正确的事情,但如果它们是不同类型的,他们试图强制价值观。 他们所做的规则很复杂且难以理解。 这些是一些有趣的情况:

'' == '0'           // false
0 == ''             // true
0 == '0'            // true

false == 'false'    // false
false == '0'        // true

false == undefined  // false
false == null       // false
null == undefined   // true

' trn ' == 0     // true

传递性的缺乏令人担忧。 我的建议是永远不要使用邪恶的双胞胎。 相反,总是使用===!== 。 刚刚显示的所有比较都会使用===运算符产生false


更新:

@Casebash在评论和@Phillipe Laybaert对引用类型的回答中提出了一个很好的观点。 对于引用类型=====彼此一致(除特殊情况外)。

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

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

var e = "text";
var f = "te" + "xt";

a == b            // false
a === b           // false

c == d            // false
c === d           // false

e == f            // true
e === f           // true

特殊情况是当您将文字与评估为相同文字的对象进行比较时,由于其toStringvalueOf方法。 例如,考虑将字符串文字与由String构造函数创建的字符串对象进行比较。

"abc" == new String("abc")    // true
"abc" === new String("abc")   // false

这里==运算符检查两个对象的值并返回true ,但是===看到它们不是相同的类型并返回false 。 哪一个是正确的? 这真的取决于你想要比较的东西。 我的建议是完全绕过这个问题,只是不要使用String构造函数来创建字符串对象。

参考
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3


使用==运算符(平等)

true == 1; //true, because 'true' is converted to 1 and then compared
"2" == 2;  //true, because "2" is converted to 2 and then compared

使用===运算符(标识)

true === 1; //false
"2" === 2;  //false

这是因为等号运算符==确实类型强制 ,这意味着解释器会在比较之前隐式地尝试转换值。

另一方面, 身份运算符===不会执行类型强制 ,因此在比较时不会转换值。


在这里的答案中,我没有读到关于什么是平等的意思。 有人会说===意味着平等和相同的类型 ,但这不是真的。 它实际上意味着两个操作数引用相同的对象 ,或者在值类型的情况下具有相同的值

所以,我们来看下面的代码:

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

这种行为并不总是很明显。 这个故事更多的不仅仅是平等和相同的类型。

规则是:

对于值类型(数字):
如果ab具有相同的值并且具有相同的类型,则a === b将返回true

对于参考类型:
如果ab引用完全相同的对象,则a === b返回true

对于字符串:
如果ab都是字符串并包含完全相同的字符,则a === b返回true


字符串:特殊情况...

字符串不是值类型,但在Javascript中它们的行为类似于值类型,所以当字符串中的字符相同且长度相同时(如第三条规则中所述),它们将“相等”

现在它变得有趣:

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的类型为Object ,而b的类型为string 。 请记住,使用String构造函数创建一个字符串对象会创建一些类型为Object东西,大部分时间都会像字符串一样。

链接地址: http://www.djcxy.com/p/43.html

上一篇: Which equals operator (== vs ===) should be used in JavaScript comparisons?

下一篇: How do I remove a particular element from an array in JavaScript?