JavaScript的相等比较(==)和(===)及Object.is()的区别

码域星辰
• 阅读 5147

比较运算符之相等运算符

ES5 比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===)。前者在比较时对于不同数据类型的值会进行类型转换;而后者不会转换,且结果更容易预测,并且因为没有隐式转换,全等比较的运行会更快。因此建议使用严格相等运算符===进行值的比较。

严格相等运算符 ===

(1) 不同类型的值比较

如果比较的两个值的类型不同,直接返回false。

1 === "1"          // false
true === "true"    // false

(2) 原始类型值比较

原始类型值有五种:undefinednull、布尔值(Boolean)、字符串(String)、数值(Number)。

1. 非数值类型比较

值相同就返回 true,值不同就返回 false

null === null        // true
null === undefined   // false
2. 数值类型比较

正常情况下值相同就返回 true,值不同就返回 false。但有两个特殊情况:

一是0不分正负

0 === -0      //true

二是 NaN 本身不全等于任何值。

NaN === NaN     //false
NaN !== NaN     //true

也就是说 等式 (x !== x) 成立的唯一情况是 x 的值为 NaN

(3) 复合类型值比较

复合类型的值实际上存储的是数据的内存地址,因此两个复合类型(对象、数组、函数)的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个地址。

{} === {}                             // false
[] === []                             // false
(function () {} === function () {})   // false

上面代码分别比较两个空对象、两个空数组、两个空函数,结果都是不相等。那是因为空对象、空数组、空函数的值,都存放在不同的内存地址,因此结果是 false

而如果两个变量引用同一个对象,那它们则相等,因为它们引用的对象存储在同一个内存地址。

var v1 = {};
var v2 = v1;
v1 === v2      // true

相等运算符 ==

相等运算符用来比较相同类型的数据以及复合类型数据时,与严格相等运算符完全一样。比较不同类型的数据时,相等运算符会先将数据进行类型转换,然后再用严格相等运算符比较。

(1) 原始类型值比较

原始类型的值会转换成数值再进行比较。转换规则是使用 Number() 转换。

1 == true             // true   等同于 1 === Number(true)
0 == false            // true   等同于 0 === Number(false)
'true' == true        // false  等同于 Number('true') === Number(true)
'' == 0               // true   等同于 Number('') === 0
'' == false           // true   等同于 0 === 0
'\n  123  \t' == 123  // true  因为字符串转为数字时,省略前置和后置的空格

(2) undefined 和 null

undefinednull 与其他类型的值比较时,结果都为 false,它们互相比较时结果为 true

false == null          // false
false == undefined     // false
0 == null              // false
0 == undefined         // false
NaN == undefined       // false
undefined == null      // true

(3) 对象与原始类型值比较

对象(这里指广义的对象,包括数组和函数)与原始类型的值比较时,对象转换成原始类型的值,再进行比较。

1. 对象与数值比较时,对象转为数值 Number()
[1] == 1   // true  等同于 Number([1]) == 1
2. 对象与字符串比较时,对象转为字符串 String()
[1] == '1'      // true  等同于 String([1]) == '1'
[1, 2] == '1,2' // true  等同于 String([1, 2]) == '1,2'
3. 对象与布尔值比较时,两边都转为数值
[1] == true    // true  等同于 Number([1]) == Number(true)
[2] == true    // false 等同于 Number([2]) == Number(true)

类型转换参考数据类型的强制转换和隐式转换

Object.is(value1, value2)

相等运算符(==)和严格相等运算符(===)都有缺点,前者会自动转换数据类型,后者的 NaN 不等于自身,以及 +0 等于 -0。因此 ES6 的新方法 Object.is 可以用来解决这个问题。

Object.is 用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致。返回布尔值,相等返回 true,不相等返回 false

不同之处只有两个:一是+0不等于-0,二是NaN等于自身。

+0 === -0            //true
NaN === NaN          // false

Object.is(+0, -0)    // false
Object.is(NaN, NaN)  // true

对于不兼容 ES6 的浏览器,可以在ES5 环境下通过下面的代码,部署Object.is

Object.defineProperty(Object, 'is', {
  value: function(x, y) {
    if (x === y) {
      // 针对+0 不等于 -0的情况
      return x !== 0 || 1 / x === 1 / y;
    }
    // 针对NaN的情况
    return x !== x && y !== y;
  },
  configurable: true,
  enumerable: false,
  writable: true
});

判断相等一览表

JavaScript的相等比较(==)和(===)及Object.is()的区别

点赞
收藏
评论区
推荐文章
Souleigh ✨ Souleigh ✨
4年前
PHP程序员必须会的 45 个PHP 面试题(第一部分)
Q1:和之间有什么区别?话题:PHP困难:⭐如果是两个不同的类型,运算符则在两个不同的类型之间进行强制转换操作符执行’_类型安全比较_‘这意味着只有当两个操作数具有相同的类型和相同的值时,它才会返回TRUE。11:true11:true1"1
Wesley13 Wesley13
3年前
java中字符串相等判断
字符串的判断有2种:        1、判断地址是否相等 用:        2、判断值是否相等 用:equals方法Object类作为所有类的超类,而Object类的equals方法是直接比较地址的,源码如下:publicbooleanequals(Objectobj){
红烧土豆泥 红烧土豆泥
4年前
补充关于equals的比较方式
补充(equals比较)java.lang.String类中的方法equals判断相等依据策略:如果与目标相等返回0,小于目标返回值小于0,大于目标返回值大于0language@NativestaticfinalbyteLATIN10;@NativestaticfinalbyteUTF161;language/Compa
CuterCorley CuterCorley
4年前
C语言入门系列之4.分支结构程序-关系、逻辑运算和if、switch语句
一、关系运算符和表达式关系运算符:又叫比较运算符,在程序中经常需要比较两个量的大小关系,以决定程序下一步的工作。比较两个量的运算符称为关系运算符。1.关系运算符及其优先顺序在C语言中有以下关系运算符:<小于<小于或等于\大于\大于或等于等于不等于关系运算符都是双目运算
红烧土豆泥 红烧土豆泥
4年前
补充关于equals的比较方式
补充(equals比较)Object中的equals比较的是地址languagepublicbooleanequals(Objectobj)return(thisobj);java.lang.String类中equals的方法equals判断相等依据策略:如果与目标相等返回0,小于目标返回值小于0,大于目标返回值大于0lan
Stella981 Stella981
3年前
HBase Filter及对应Shell
http://www.cnblogs.com/skyl/p/4807793.html比较运算符CompareFilter.CompareOp比较运算符用于定义比较关系,可以有以下几类值供选择:EQUAL相等GREATER大于GREATER\_OR\_EQUAL大于等于LESS小于LESS
Stella981 Stella981
3年前
Integer比较相等
Integertype1;??? 我们知道Integer是int的包装类,在jdk1.5以上,可以实现自动装箱拆箱,就是jdk里面会自动帮我们转换,不需要我们手动去强转,所以我们经常在这两种类型中随意写,平时也没什么注意但Integer他是对象,我们知道比较的是堆中的地址,但有个奇怪的事是,如果Integera123,
Stella981 Stella981
3年前
JavaScript里面三个等号和两个等号的区别
\equality等同,identity恒等。\,两边值类型不同的时候,要先进行类型转换,再比较。\,不做类型转换,类型不同的一定不等。下面分别说明:先说,这个比较简单。下面的规则用来判断两个值是否相等:1、如果类型不同,就\不相等\2、如果两个都是数值,并且是同
Stella981 Stella981
3年前
Js——第一课
数据类型:要特别注意相等运算符。JavaScript在设计时,有两种比较运算符:第一种是比较,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果;第二种是比较,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较。由于JavaScript这个设计缺陷,_不要_使用比较,始终
Wesley13 Wesley13
3年前
JAVA 基础部分易混淆问题总结
前言   最近在看了一些java基础问题,顺便将这段时间看到的容易混淆和已忘记的问题进行整理总结一下.接下来会再写一些web方便易混淆或者不常用易忘记的问题梳理问题列表    1、和equals区别        操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要
小万哥 小万哥
1年前
Python 运算符
运算符用于对变量和值执行操作。在下面的示例中,我们使用运算符将两个值相加:pythonprint(105)Python将运算符分为以下几组:算术运算符赋值运算符比较运算符逻辑运算符身份运算符成员运算符位运算符算术运算符算术运算符用于对数字值执行常见的数