In JavaScript
, there are two equality operators: ==
for loose equality and ===
for strict equality. It is recommended to use ===
whenever the data type of the variables can be determined. Various types of value comparisons can be referred to using the truth table for JavaScript
.
The ==
operator performs implicit type conversion when comparing equality. It follows some principles:
- If one operand is a boolean value, it is first converted to a number before the comparison, essentially using the
Number()
method. - If one operand is a string and the other is a number, the string is first converted to a number using the
Number()
method before the comparison. - If one operand is an object and the other is not, the object is converted to a primitive value using the
valueOf()
andtoString()
methods to compare. Except forDate
objects, thevalueOf()
method is preferred, and the obtained primitive type is compared according to the previous rules. - In addition,
null == undefined
evaluates totrue
; any other combinations do not result in equality.
1 == true //true // Number Boolean
2 == true //false
1 == "1" //true // Number String
[] == "" //true // Object String
[] == false // true // Object Boolean
[] == 0 //true // Object Number
[] == {} //false
[] == [] //false
{} == {} //false
null == undefined //true
There may be some unexpected behavior when using it.
0 == "0" //true
0 == [] //true
"0" == [] // false
If the valueOf()
and toString()
methods are directly implemented, instead of the ones on the prototype chain (Object.prototype.valueOf()
and Object.prototype.toString()
), it may even result in an exception.
var obj = {valueOf: function(){ return {} }, toString: function(){ return {}}}
console.log(obj == 0) // Uncaught TypeError: Cannot convert object to primitive value
The ===
operator first checks the type and then compares. If the types are different, they are not considered equal.
The data types in ES6
are Number
, String
, Boolean
, Object
, Symbol
, null
, and undefined
.
1 === true //false
1 === "1" //false
[] === "" //false
null === undefined //false
The if()
statement can also be seen as a separate category of operators.
if(true) console.log("exec"); //exec
if(false) console.log("exec");
if(1) console.log("exec"); //exec
if(0) console.log("exec");
if(-1) console.log("exec"); //exec
if("true") console.log("exec"); //exec
if("1") console.log("exec"); //exec
if("0") console.log("exec"); //exec
if("") console.log("exec");
if(null) console.log("exec");
if(undefined) console.log("exec");
if("null") console.log("exec"); //exec
if("undefined") console.log("exec"); //exec
if([]) console.log("exec"); //exec
if({}) console.log("exec"); //exec
if([0]) console.log("exec"); //exec
if(NaN) console.log("exec");
https://github.com/WindrunnerMax/EveryDay
https://www.zhihu.com/question/31442029
https://thomas-yang.me/projects/oh-my-dear-js/
https://dorey.github.io/JavaScript-Equality-Table/#three-equals