全等和相等运算符--JS

257 阅读2分钟

一、简介

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,结果是相等