1、为什么讨论这个问题?

- 有个说法,尽量不用==,而使用===,是这样吗?

2、分析问题,原理是什么?

  下面说说ECMAScript 5 language specification里的说明:

  1)两种比较方法

    全等号===只考虑类型相同的值的比较,不同类型使用===进行比较,返回false

    双等号==会先将不同类型的值转为相同类型,然后使用全等号进行比较。

    使用双等号会有两个问题:

    ● 转换规则可能不是你期望的那样

    ● 由于双等号是宽容的,类型错误可能会被忽略掉。

  2)全等号===(严格等号)

    比较两个值,

    如果类型不同,一定返回false;

    如果类型相同,则按照如下的规则进行比较:

      ① 两个都是undefined类型,返回true;(undefined === undefined)

      ② 两个都是null类型,返回true;(null === null)

      ③ 两个都是number类型

        如果有一个是NaN,则为false;(Nan !== *//any value including NaN)

        如果两个值相同,返回true;(x==x)

        一个是+0,一个是-0(+0===-0)

      ④ 两个都是boolean类型或者两个都是string类型(基础数据类型,不是String对象),答案很明显。

        "111" === "111"//true

        true === true//true

      ⑤ 两个对象(包括array和function),除非是同一个对象(即同一个引用),否则都是false

        var a = NaN;

        a === a;//false(NaN无法用来比较)

        

        var b = {}, c = {};

        b === c;//false

        b === b;//true

        "abc" = new String("abc");//false(左边是基本数据类型string,后边是object类型)

        注:ECMAScript中有5种基本数据类型(Undefined、Null、Boolean、Number、String)

          还有1种复杂数据类型Object。

  3)双等号==

     比较两个值,如果两个值类型相同,则使用===进行对比;

     如果两个值类型不同,则按照一下规则进行比较:

      ① undefined == null

      ② 一个number,一个string,将string转换成number类型再做比较;

      ③ 一个boolean,一个非boolean,将boolean转换成number类型再做比较;

      ④ 一个string或者number,跟一个object,将object转换成基本数据类型再做比较;

     第三条规则会导致大于1的number值不等于true,比如:

      0 == false//true

      1 == true//true

      2 == true//false(true -- > 1 ; 2 != 1)

      2 ? true : false//true

        "" == 0;//true

      "123" == 123;//true

      "" == false//true(false-->0;""-->0;0==0)

      "1" == true//true

      "2" == true//false(true-->1;"2"-->2;2!=1)

      "true" == true//false(true-->1;"true"-->NaN;1!=NaN)

      "2" ? true : false//true(because string is non-empty)
      "abc" == new String("abc")//true(object->string)

3、得出结论和建议?

    鉴于==的对比规则会出现一些意想不到的结果,建议尽量多使用===,而非==。

参考文章:

http://www.2ality.com/2011/06/javascript-equality.html

https://www.zhihu.com/question/31442029

JS中“==”和“===”的原理和区别的更多相关文章

  1. JS中isPrototypeOf 和hasOwnProperty 的区别 ------- js使用in和hasOwnProperty获取对象属性的区别

    JS中isPrototypeOf 和hasOwnProperty 的区别 1.isPrototypeOf isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的 ...

  2. (网页)Angular.js 中 copy 赋值与 = 赋值 区别

    转自st.gg Angular.js 中 copy 赋值与 = 赋值 区别 为什么用 $scope.user = $scope.master; $scope.master 会跟着 $scope.use ...

  3. js中的substr和substring区别

    js中的substr和substring区别 Substring: 该方法可以有一个参数也可以有两个参数. (1)  一个参数: 示例: var str=“Olive”: str.substring( ...

  4. JS 中的require 和 import 区别整理

    ES6标准发布后,module成为标准,标准的使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们采用的是CommonJS规范,使用require引入模块,使 ...

  5. 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂

    浅谈JS中的!=.== .!==.===的用法和区别   var num = 1;     var str = '1';     var test = 1;     test == num  //tr ...

  6. js中JSON和JSONP的区别,让你从懵逼到恍然大悟

    说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义字符串或者用XML来描述,跨域可以通过服 ...

  7. [转]html js中name和id的区别和使用分析

    js中web页面元素的调用可以有两种识别方法:id和name 自己在用的过程中总结一下id和name的使用区别. 一,使用范围 除 BASE, HEAD, HTML, META, SCRIPT, ST ...

  8. js中__proto__和prototype的区别和关系?

    _proto__(隐式原型)与prototype(显式原型)1.是什么 显式原型 explicit prototype property: 每一个函数在创建之后都会拥有一个名为prototype的属性 ...

  9. 浅谈js中null和undefined的区别

    在JS中,null和undefined是经常让人摸不着头脑的东西,尤其是在数据初始化以及处理的过程中,经常稍微不注意,就会让页面在渲染时出现报错,下面来细说下,这两者之间的区别: null 表示一个对 ...

随机推荐

  1. [原]git的使用(三)---管理修改、

    上接git的使用(二) 7.管理修改 [要理解的概念]为Git跟踪并管理的是修改,而非文件 什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一 ...

  2. centos 7安装jdk、tomcat

    jdk安装 创建上传目录: [root@ckl1 home]# pwd /home [root@ckl1 home]# mkdir upload 安装上传工具: yum install lrzsz 上 ...

  3. MySQL大数据量分页性能优化

    mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1.   直接用limit start, count分页语句, 也是我程序中用的方法: select * from p ...

  4. 【BZOJ5146】有趣的概率 概率+组合数(微积分)

    [BZOJ5146]有趣的概率 Description "可爱的妹子就像有理数一样多,但是我们知道的,你在数轴上随便取一个点取到有理数的概率总是0,"芽衣在床上自顾自的说着这句充满 ...

  5. s3接口认证说明

    S3 Authorization太绕,太头痛,下面解释说明: XS3 REST API基于HMAC(哈希消息身份验证码)密钥使用自定义HTTP方案进行身份验证.要对请求进行身份验证,您首先需要合并请求 ...

  6. php代码不支持多维数组,注释和没有缓存功能。

    php代码:simplet.class.php<?phpclass SimpleT {private $t_vars;private $templates_dir;private $templa ...

  7. hdu2896 病毒肆虐【AC自动机】

    病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. 计蒜客 31001 - Magical Girl Haze - [最短路][2018ICPC南京网络预赛L题]

    题目链接:https://nanti.jisuanke.com/t/31001 题意: 一带权有向图,有 n 个节点编号1~n,m条有向边,现在一人从节点 1 出发,他有最多 k 次机会施展魔法使得某 ...

  9. SHU 413 - 添加好友

    题目链接:http://acmoj.shu.edu.cn/problem/413/ 不难发现,这题是求C(n,1)+C(n,2)+C(n,3)+……+C(n,n-1)+C(n,n) 根据二项展开式有( ...

  10. Oracle管理监控之如何对数据库进行监控检查

    oracle自动工作负载库(AWR):采集与性能相关的统计数据,并从统计的数据中导出性能量度,以跟踪数据库潜在的问题. 如何生成oracle数据库的自动负载库报告. 手工生成一份oracle数据库的快 ...