JS中“==”和“===”的原理和区别

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

上一篇:20172313『Java程序设计』课程结对编程练习_四则运算第二周阶段总结


下一篇:小程序开发准备