我使用JSLint来浏览JavaScript,它返回了很多建议,在做一些事情时,比如在if
语句中比较idSele_UNVEHtype.value.length == 0
,将==
(两个等号)替换为===
(三个等号).
将==
替换为===
是否会带来性能优势?
任何性能改进都是受欢迎的,因为存在许多比较运算符.
如果没有进行类型转换,性能增益是否会超过==
?
我使用JSLint来浏览JavaScript,它返回了很多建议,在做一些事情时,比如在if
语句中比较idSele_UNVEHtype.value.length == 0
,将==
(两个等号)替换为===
(三个等号).
将==
替换为===
是否会带来性能优势?
任何性能改进都是受欢迎的,因为存在许多比较运算符.
如果没有进行类型转换,性能增益是否会超过==
?
严格相等运算符(===
)的行为与抽象相等运算符(==
)相同,不同之处在于不进行类型转换,并且类型必须相同才能被视为相等.
参考:Javascript Tutorial: Comparison Operators
==
运算符将比较等式after doing any necessary type conversions.===
运算符将not进行转换,因此如果两个值的类型不同,===
将简单地返回false
.两者都同样迅速.
To quote Douglas Crockford's excellent JavaScript: The Good Parts,
JavaScript有两组相等运算符:
===
和!==
,以及它们的邪恶双胞胎==
和!=
.好的工作方式和你期望的一样.如果两个操作数类型相同且值相同,则===
生成true
,!==
生成false
.当操作数属于同一类型时,邪恶的孪生sibling 会做正确的事情,但如果它们属于不同的类型,他们会试图强制执行值.他们这样做的规则既复杂又难以理解.以下是一些有趣的 case :'' == '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
和===
运算符.
在 comments 中提出了@Casebash个好观点,在@Phillipe Laybaert'sanswer个关于对象的 comments 中提出了一个很好的观点.对于对象,==
和===
彼此行为一致(特殊情况除外).
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
构造函数从字符串文本创建字符串对象.
Reference
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3