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

一、为何讨论这个问题?javascript

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

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

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

  1)两种比较方法htm

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

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

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

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

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

  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)

三、得出结论和建议?

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

参考文章:

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

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

相关文章
相关标签/搜索