1、结论先行:
在JavaScript 中,== 相等 和 === 全等 都用于比较两个值是否相等,但它们的比较方式不同。
一言以蔽之:
== 相等,在进行比较的时候,会先转换类型,再比较两个值是否相等;
=== 全等,先判断数据类型,如果不是同一类型直接为 false;若类型相同,再比较值是否相等。
2、== 运算符
== 运算符进行比较时,会先进行类型转换,然后再比较两个值是否相等。
类型转换的规则比较复杂,但可以简单地概括为以下几点:
① 如果两个值类型相同,则直接比较它们的值;
② 如果一个值是 null,另一个值是 undefined,则它们相等;
③ 如果一个值是数字,另一个值是字符串,则将字符串转换为数字后再比较;
④ 如果一个值是布尔值,另一个值是非布尔值,则将布尔值转换为数字后再比较;
⑤ 如果一个值是对象,另一个值是数字、字符串或布尔值,则将对象转换为原始值后再比较;
⑥ 任何其他组合(array数组等),都不相等。
例如:
console.log(1 =="1"); // true,字符串"1"被转换为数字
console.log(true == 1); // true,布尔值true 被转换为数字
console.log(null == undefined); // true,它们相等
console.log("5" == [5]); // true,字符串"5”被转换为数字
console.log({} == {}) ; // false,因为对象被转换为原始值后仍然是对象
3、=== 运算符
=== 运算符进行比较时,只有当两个值的类型和值都相等时才会返回 true。
=== 表示恒等于,比较的两边要绝对的相同。 具体比较规则如下:
① 如果类型不同,就不相等;
② 如果两个都是数值,并且是同一个值,那么相等;例外的是,如果其中至少一个是NaN,那么不相等。【判断一个值是否是NaN,只能用 isNaN() 来判断】;
③ 如果两个都是字符串,每个位置的字符都一样,那么相等;否则不相等;
④ 如果两个值都是 true,或者都是 false,那么相等;
⑤ 如果两个值都引用同一个对象或函数,那么相等;否则不相等;
⑥ 如果两个值都是null,或者都是undefined,那么相等
例如:
console.log(1 === "1"); // false,它们类型不同
console.log(true === 1); // false,它们类型和值不同
console.log(null === undefined); // false,它们类型不同
console.log("5" === [5]); // false,它们类型不同
console.log({} === {}); // false,它们是不同的对象
一般来说,建议优先使用 === 运算符进行比较。因为它可以避免类型转换的问题,更加严格和安全。