我正在使用JSLint检查JavaScript,它返回了许多建议,在做诸如在if
语句中比较idSele_UNVEHtype.value.length ==0
之类的事情时,将==
(两个等号)改为==
(三个等号)。
用"==="替换"==="有什么性能优势吗?
任何性能改进都会受到欢迎,因为存在许多比较运算符。
如果不进行类型转换,与==
相比,是否会有性能上的提高?
同等(===
)运算符的行为与平等(==
)运算符相同,只是没有进行类型转换,而且类型必须相同才能被视为相等。
参考资料。Javascript教程:比较运算符 。
===
运算符将在做完任何必要的类型转换后比较是否相等。 ===
操作符将**不做转换,所以如果两个值的类型不一样,===
将简单地返回`false'。两者都一样快。
引用Douglas Crockford'优秀的JavaScript: The Good Parts。
JavaScript有两组平等运算符。
===
和!==
,以及它们的邪恶双胞胎==
和!=
。 好的运算符以你期望的方式工作。 如果两个操作数是相同的类型并且有相同的值,那么====
产生 "真",!==
产生 "假"。 当操作数是同一类型时,邪恶的双胞胎会做正确的事情,但如果它们是不同的类型,它们就会试图胁迫这些值。它们这样做的规则很复杂,无法记忆。 这些是一些有趣的案例。
'' == '0' // false 0 == '' // true 0 == '0' // true
false == 'false' // false false == '0' // true
false == undefined // false false == null // false null ==未定义 // true
' \t\r\n ' == 0 // true
缺乏反证法是令人震惊的。 我的建议是,永远不要使用邪恶的双胞胎。 相反,总是使用
====
和!==
。 刚才展示的所有比较都是用====
运算符产生`假'。
@Casebash 在评论中和@Phillipe Laybaert's 答案 中提出了一个关于引用类型的好观点。 对于引用类型,===
和===
的行为是一致的(除了一个特殊情况)。
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
这是因为等价运算符==
会进行类型强制,这意味着解释器在比较前会隐含地尝试转换数值。
另一方面,同一性操作符===
不做类型强制,因此在比较时不转换数值,因此更快(根据This JS benchmark测试),因为它跳过了一个步骤。