Javascript
有两种要领来推断两种值是不是相称。
相称标记
相称标记由两个等号构成: ==
Javascript
是弱范例言语。这就意味着相称标记为了比较两个值将会强迫转换范例。
"" == "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
上面的代码展现了范例转换的效果,因而我们晓得运用相称标记 ==
是个不好的编程习气。因为 Javascript
中庞杂的范例转换机制,将会使得由此发生的毛病变得难以追踪。
另外,范例的强迫转换会对机能也形成肯定的影响,比方,当一个字符串与数字举行比较时,会被强迫转换为数字。
严厉相称标记
严厉相称标记由三个等号构成: ===
它跟相称标记的操纵类似,然则严厉相称标记不会做强迫范例转换的操纵。
"" === "0" // false
0 === "" // false
0 === "0" // false
false === "false" // false
false === "0" // false
false === undefined // false
false === null // false
null === undefined // false
" \t\r\n" === 0 // false
上面的代码使得代码越发清楚,假如两个值的范例差别则直接返回 false
,这也会使得机能获得提拔。
比较对象
只管 ==
和 ===
被称为相称标记,然则当比较的两个值中有一个范例是对象时,表现将大不相同。
{} === {}; // false
new String('foo') === 'foo'; // false
new Number(10) === 10; // false
var foo = {};
foo === foo; // true
在这儿,不再仅仅是比较两个值是不是相称,它将推断两个值是不是援用同一个对象实例,这个行动比较像 C
中的指针。
总结
这里强烈建议只运用严厉相称标记 ===
。假如我们需要做范例转换,能够在比较前先做显式的范例转换,而不是靠 Javascript
自身庞杂的强迫转换要领。
@justjavac 先辈所提的这个题目越发详述地剖析了 Javascript
中的比较。
参考
http://bonsaiden.github.io/JavaScript-Garden/#types.equality