zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    光学镜头参数详解(EFL、TTL、BFL、FFL、FBL/FFL、FOV、F/NO、RI、MTF、TVLine、Flare/Ghost)
    三角函数公式
    技术工人的升华
    如何在apache启动的时候不输入ssl的密码
    汉字转拼音问题
    深入PHP内核(1) 引用
    如何把普通的exe服务器程序注册成windows 服务
    如何学习Yii
    横向同步问题
    多态的内幕(C++, C)语言两个版本
  • 原文地址:https://www.cnblogs.com/Being-a-runner-up/p/5591407.html
Copyright © 2011-2022 走看看