关系运算符包括> 、>=、<、<=、==、 ===,运算结果会返回一个布尔值。
数值比较举例:
var a = 3;
var b = 4;
console.log(a > b); //false
== 和 != 是比较运算,比较的时候等号两边的内容会进行隐式转换,只比较转换后的值是否相等,不比较转换前的类型是否相同。
不同类型的数据使用 == 比较时的转换规则:
一、布尔值与各种数据类型的比较:
1、布尔值和字符串比较,将布尔值和字符串都转换为数值。
console.log("3" == true); //false
console.log(" " == true); //false
2、布尔值和数值比较,将布尔值转换为数值。
console.log(3 == true); //false
3、布尔值与其他数据类型的比较:
console.log(undefined == false); //false 布尔值不能转换为undefined,所以不相同
console.log(null == false); //false 布尔值不能转换为null,所以不相同
console.log({ a: 1 } == true); //false 布尔值不能转换为对象,所以不相同
console.log(([] == false)); //true 数组比较时,如果比较布尔值,优先将数组转换为字符串,然后再比较
console.log(![] == false); //true 一旦使用!,优先将[]看做对象,所以[]就是true,取反就是false
console.log(![] == []); //true
二、字符串与各种数据类型的比较:
1、字符串和数值比较,优先将字符串转换为数值
console.log("3" == 3); //true
console.log("0" == 0); //true
console.log("" == 0); //true
2、字符串与其他数据类型的比较:
console.log("undefined" == undefined); //false
console.log("null" == null); //false
console.log("" == null); //false
console.log("" == undefined); //false
console.log("{a:1}" == { a: 1 }); //false
console.log("[object Object]" == { a: 1 }); //true 因为对象有toString()方法,一旦比较时就会隐式触发对象的toString()方法
console.log("a" == ["a"]); //true 数组会转换为字符串比较。 如果是把字符串转换为数组,那它们就是两个对象,而两个对象是不相等的。
注意: 0、false、"" 三者之间互相使用 == 比较时的结果都是true。
console.log(0 == ""); //true
console.log("" == false); //true
console.log(0 == false); //true
三、其他数据类型之间的比较:
1、undefined和null
console.log(undefined == null)
默认规定的只有 undefined == null 的结果是true,它们和其他的数据类型进行比较结果时,结果都是false。
console.log(NaN == NaN); //false
2、非数值NaN
规定NaN不和任何数值相等,包括它自身。
console.log(isNaN(Number("a"))); //true
使用isNaN()方法可以判断里面的数据是否是非数值,如果是非数值(即不是数值)则返回true,否则返回false。
=== 和 !== 是绝对相等和绝对不相等,先判断类型是否相同,再判断值是否相同。
if (!a) { }
能进入上面if判断的a满足的条件有:""、undefined、null、0、false、NaN。
if (a == false) { }
能进入上面if判断的a满足的条件有:0、""、false。
if (a == undefined) { }
能进入上面if判断的a满足的条件有:null、undefined。
if (a === undefined) { }
能进入上面if判断的a满足的条件有:undefined。
另外,Object.is() 类似于 === 。
console.log(Object.is("3", 3)); //false
console.log(Object.is(3, 3)); //true
注意: 在Object.is()中,NaN和它自身是相等的。
console.log(Object.is(NaN, NaN)); //true
console.log(NaN === NaN); //false