一、简介
js中的相等运算符分为两种,==和===,有两个对应的!= 和!==运算符,这两个不相等运算浮动运算结果是相等运算结果的值的取反。
二、严格相等运算符(全等运算符)===
严格相等运算符在对操作数进对比运算时,是不进行类型转换的。具体规则如下:
1、操作数类型不同,对比结果都是false,(!!!不转换类型)
console.log(1 === '1'); // false
console.log(1 === {}); // false
console.log(1 === []); // false
console.log(1 === true); // false
console.log(1 === undefined); // false
console.log(null === undefined);// false
2、相同类型的原始值
- 值都是原始类型值(数字、字符串、布尔值),值相同就返回
true,值不同就返回false
console.log(true === false); // false
console.log('1' === '1'); // true
console.log('1' === '12'); // false
console.log(1 === 1); // true
console.log(1 === 12); // false
3、都是对象或者都是Symbol
- 值是对象(数组、函数、对象),对于两个对象比较的是引用,如果地址值不一样,则结果是不相等。
console.log([] === []); // 数组, 地址值不一样,结果为false
console.log({} === {}); // 对象, 地址值不一样,结果为false
console.log((() => {}) === (() => {})); // 函数, 地址值不一样,结果为false
var obj1 = {};
var obj2 = obj1; //v2和v1指向同一个引用地址
console.log(obj1 === obj2); /// true
// 没有参数
let s1 = Symbol();
let s2 = Symbol();
console.log(s1 === s2); // false
// 有参数的情况
let s3 = Symbol('foo');
let s4 = Symbol('foo');
let s5 = s3;
console.log(s3 === s4); // false
console.log(s3 === s5); // true
4、null和undefined
- 值都是
null或者都是undefined,结果是true
5、NaN,NaN不和任何值全等,包括NaN
console.log(NaN === NaN);// false
三、相等运算符
会对操作数做类型转换,然后再进行比较
1、类型相同
- 原始类型(数字、字符串、布尔值)比较值
- 引用类型(数组、函数、对象、
Symbol)比较地址值
2、操作数都是原始值,但是类型不同,会将非数字类型的转换为数字后再进行比较
// 常见的原始值转数字
console.log('' * 1); // 0,空串转为0
console.log(' ' * 1); // 0,仅包含空格的字符串也转换为0
console.log('1' * 1); // 1
console.log('-1' * 1); // -1,可以转为数字的转换为字符串所对应的数字
console.log('1a' * 1); // NaN,包含非数字而无法转换为数字转为NaN
console.log(true * 1); // 1
console.log(false * 1); // 0
console.log(null * 1); // 0
console.log(undefined * 1); // NaN
3、原始值和引用值:
其中一个操作数是对象,另外一个是原始类型值,规则如下:
因为只有数字和字符串才能真正执行比较操作,所以其他的非数字和非字符串的类型都会进行类型转换,规则如下:
- valueOf()返回的是原始类型,就调用对象的valueOf();
- valueOf()不存在或没有返回原始类型,就会调用toString()方法(基本上都是这个);
- 没有toString()方法报错
toString() 方法返回一个表示该对象的字符串。
## 4. null和undefined
- 如果其中一个值是
null,另外一个是undefined,结果是相等