应该在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
特殊情况是当您将文字与评估为相同文字的对象进行比较时,由于其toString
或valueOf
方法。 例如,考虑将字符串文字与由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
这种行为并不总是很明显。 这个故事更多的不仅仅是平等和相同的类型。
规则是:
对于值类型(数字):
如果a
和b
具有相同的值并且具有相同的类型,则a === b
将返回true
对于参考类型:
如果a
和b
引用完全相同的对象,则a === b
返回true
对于字符串:
如果a
和b
都是字符串并包含完全相同的字符,则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
东西,大部分时间都会像字符串一样。
上一篇: Which equals operator (== vs ===) should be used in JavaScript comparisons?