我使用JSLint 的经历 JavaScript 和它的返回了许多建议,以取代==
用(双等号) ===
(三级等号)做这样的事情进行比较时idSele_UNVEHtype.value.length == 0
的内部if
声明。
用===
替换==
是否有性能优势?
任何性能改进都会受到欢迎,因为存在许多比较运算符
如果没有进行类型转换,那么性能会超过==
吗?
identity( ===
)运算符的行为与 equality( ==
)运算符的行为相同,但不进行类型转换,并且类型必须相同才能被视为相等。
在执行任何必要的类型转换后 , ==
运算符将比较相等性。 ===
运算符不会进行转换,因此如果两个值不是同一类型===
将只返回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
特殊情况是,当您将文字与评估为同一文字的对象进行比较时,由于其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
使用==
运算符( 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
如果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
类型的东西,它在大多数情况下都表现为字符串。