协慌网

登录 贡献 社区

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

我使用JSLint 的经历 JavaScript 和它的返回了许多建议,以取代==用(双等号) === (三级等号)做这样的事情进行比较时idSele_UNVEHtype.value.length == 0的内部if声明。

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

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

如果没有进行类型转换,那么性能会超过==吗?

答案

identity( === )运算符的行为与 equality( == )运算符的行为相同,但不进行类型转换,并且类型必须相同才能被视为相等。

参考: 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

' \t\r\n ' == 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

使用==运算符( Equality

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如果ab具有相同的值且属于同一类型,则返回 true

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

对于字符串:
a === b如果ab都是字符串并且包含完全相同的字符,则返回 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类型的东西,它在大多数情况下都表现为字符串。