本文来自网易云社区

作者:魏文庆

如果你只想知道==与===的区别,请直接看总结,当然我更希望您能耐心看完全文。
Javascript中用于相等比较的操作符有两个==和===。==我们通常称为“等于”,而===我们通常称为“严格等于”。本文将对==和===做详细说明。===相对简单,让我们从===开始。

===

===首先要求比较双方类型相同, 还要求比较双方值相等。 如果比较的双方是都是对象类型,只有指向同一个对象,才能严格相等。关于javascript的数据类型,请参见Javascirpt基本数据类型
  本节示例如下:

    // 类型相同,值相同,才严格相等
    1 === 1;    "jerry" === "jerry";    true === true;    null === null;    undefined === undefined;    // 类型相同且为对象类型,必须是指向同一个的对象才严格相等
    {name:"jerry"} !== {name: "jerry"}  // 两个不同的{name:"jerry"}对象
    var a = {name:"jerry"};    var b = a;
    a === b;    // 指向同一个对象
    // 类型不同,不严格相等
    null !== undefined;    false !== 0;    1 !== "1";

==

==在进行比较时,如果比较的双方数据类型不同,通常会先转换成相同的类型再进行比较。如果比较的双方类型相同,这时与===相同:如果比较的双方是对象类型,只有指向同一个对象,才能相等;如果是其他类型,比较值是否相等。
比较的双方类型相同时,可以参考===,比较双方类型相同的例子,也可作为本节的例子。下面我们重点讨论比较双方类型不同的情况。
上文中提到比较双方数据类型不同,通常会先转换成相同的类型,哪些是异常呢?null和undefined。

null和undefined在比较的时候不会转换成其他类型。null只和undefined相等。

本节示例如下:

    // null和undefined相等
    null == undefined;    // null/undefined比较时不会做隐式类型转换
    0 != null;    "undefined" != undefined;    null != false;

我们对上例中的0!=null进行具体分析,如果比较之前进行隐式类型转换的话,null转换成Number型的结果为0, 值是相等的,但因为null/undefined在比较之前不会隐式类型转换,所以0!=null。"undefined" != undefined、 null != false 原因类似。

关于隐式类型转换到指定类型的结果,其实等价于调用指定类型的构造函数, 比如null隐式类型转换成Number型的结果等于Number(null), undefined转换成String型的结果等于String("undefined"),详情请参见javascript类型转换

比较的双方数据类型不同时,进行隐式类型转换时优先转换成Number型。

本节示例如下:

    // 隐式类型转换优先转换成Number型
    "99" == 99; // "99"转换成Number型为99
    "" == 0;    // ""转换成Number型为0
    true == 1;  // true转换成Number型为1
    false == "0";    ' \n\n\n' == false;

上例中false=="0"比较难以理解,无论是"0"转换成Boolean型(结果为true),还是把false转换成String型(结果为"false"),值都是不相等的,为什么false=="0"呢?我们只要记住优先转换成Number型原则, false转换成Number型,等于 Number(false),等于0, "0"转换成Number型,等于Number("0"), 等于0, 值相等。' \n\n\n' == false类似,Number(' \n\n\n')等于0, Number(false)等于0, 值相等。

比较的双方数据类型不同且有一方是Object类型, 先把Object类型转换成原始类型。我们知道基本只有String/Number/Boolean对象能转换成有意思的原始类型。我们在程序中不推荐使用String/Number/Boolean对象(直接使用原始值), 这部分内容就不展开了。

总结

==和===的异同点:

  1. 比较双方都是对象时,只有指向同一个对象才会相等(包含==/===)。

  2. ===要求比较双方类型相同并且值相等。

  3. ==在比较双方类型不同的时候通常会进行隐式类型转换。

易于记忆的==比较的原则:

  1. null==undefined, null/undefined不进行隐式类型转换。

  2. 进行隐式类型或转换时,优先转换成Number型。

网易云大礼包:https://www.163yun.com/gift

本文来自网易云社区,经作者魏文庆授权发布。

相关文章:
【推荐】 Clojure基础课程2-Clojure中的数据长啥样?

最新文章

  1. AngularJS 路由
  2. Git系列教程二 基础介绍
  3. Android -- 桌面悬浮,QQ管家火箭实现
  4. Java数据结构——链表-单链表
  5. Eclipse快捷键及各种设置(转载)
  6. Building nginx from Sources(从源代码安装nginx)
  7. Linux.根据进程名关键字杀进程
  8. 网络拓展知识 ACL NAT IPv6
  9. React 项目生产版本迭代页面不刷新问题
  10. linux时区和时间设置
  11. 三种方法更改MAC OS X下的HOSTS文件
  12. (效率低下)77. Combinations C++回溯法 组合
  13. AutoCAD的代替软件
  14. Abp IRepository 方法解释(1)
  15. scala-传名函数和传值函数
  16. Android 开源项目 eoe 社区 Android 客户端
  17. [PY3]——threading.Event
  18. python读取shp
  19. 时间序列HW
  20. 第一章--Go与web应用

热门文章

  1. jquery Jbox 插件实现弹出窗口在修改的数据之后,关闭弹出窗口刷新父页面的问题
  2. Codeforces Round #540 (Div. 3) D1. Coffee and Coursework (Easy version) 【贪心】
  3. alibaba--java规范
  4. UI到底应该用xib/storyboard完成,还是用手写代码来完成?
  5. Vue01 vue基础、mvvm、ES6z知识点、计算属性、生命周期
  6. 前端基础-CSS的属性相关设置
  7. 给requests模块添加请求头列表和代理ip列表
  8. Knowledge Point 20180303 详解main函数
  9. Oracle数据库随机取某条记录的一个字段值
  10. java基础知识(初学)