zoukankan      html  css  js  c++  java
  • 【重温基础】18.相等性判断

    本文是 重温基础 系列文章的第十八篇。
    今日感受:优化自己的代码,也是很愉快的事情。

    系列目录:

    本章节复习的是JS中的关于严格相等和非严格相等的一些知识。

    前置知识:
    判断两个变量的值是否相等,是编程中非常重要的一个操作。这里我们心里面先有两组对照,思考下:

    • 相等 和 不相等
    • 全等 和 不全等

    1.介绍

    在我们比较字符串、数值和布尔值的相等性,是比较简单的,但是到了比较对象的时候,问题就比较复杂。
    早期的时候ECMAScript规范中,在判断相等和不相等时,会先将对象转换成相似的类型,再执行比较。后面有人质疑其合理性,最后ECMAScript提出解决方法:提供两组操作符:

    • 相等不相等(宽松相等):先转换再比较,使用==
    • 全等不全等(严格相等):仅比较不转换,使用===

    另外还有一类ES6新增的方法:

    • Object.is (ES6新增)

    2.相等和不相等

    JavaScript中用相等操作符使用==进行比较,若两个操作数相等,则返回true,否则返回false。反之,不相等操作符使用!=
    这两个操作符都会先转换操作数类型,再进行比较

    通常在转换不同数据类型时,相等和不相等会遵循以下规则:

    • 若有一个操作数是布尔值,则比较前会将布尔值转换为数值false转为0true转为1
    • 若一个操作数是字符串,另一个是数值,则比较前会将字符串转换为数值
    • 若一个操作数是对象,另一个不是,则比较前会调用valueOf()方法,用返回的基本类型值来判断。

    两个操作符进行比较时会遵循下面规则:

    • nullundefined相等。
    • 比较前不能讲nullundefined转换成其他值。
    • 若一个操作数是NaN,则不相同(==时返回false!=时返回true)。
    • 若两个操作数是NaN,则不相同(==时返回false!=时返回true)。
    • 若两个操作数都是对象,则比较它们是不是同一个对象。
    • 若两个操作数都指向同一个对象,则相等操作符返回true,否则返回false

    下面列出一些特殊情况的比较 :

    表达式
    null == undefined true
    “NaN” == NaN false
    9 == NaN false
    NaN == NaN false
    NaN != NaN true
    false == 0 true
    true == 0 true
    true == 1 false
    undefined == 0 false
    null == 0 false
    “9” == 9 true

    3.不全等

    除了比较前不转换操作数歪,全等和不全等与相等和不相等并无区别,但使用的是===,只有当不转换的情况下两个操作数相同,才会返回true

    "99" == 99 ;  // true   因为先转换类型 number 和 number
    "99" === 99 ; // false  因为不转换类型 string 和 number
    

    不全等操作符就相对应的使用!==

    "99" != 99 ;  // false   因为先转换类型 number 和 number
    "99" !== 99 ; // true    因为不转换类型 string 和 number
    

    特殊的:

    null == undefined;   // true  类似的值
    null === undefined;  // false 类型不同
    

    由于相等和不相等操作符存在类型转换问题,因此为了保持代码中数据类型的完整性,我们推荐使用去哪等和不全等操作符。

    4.同值相等(Object.is

    Object.is(value1, value2);,传入两个需要对比的值。
    Object.is() 判断两个值是否相同,并且不会对参数进行类型转换。如果下列任何一项成立,则两个值相同:

    • 两个值都是 undefined
    • 两个值都是 null
    • 两个值都是 true 或者都是 false
    • 两个值是由相同个数的字符按照相同的顺序组成的字符串
    • 两个值指向同一个对象
    • 两个值都是数字并且
      • 都是正零+0
      • 都是负零 -0
      • 都是 NaN
      • 都是除零NaN 外的其它同一个数字
    Object.is('leo', 'leo');     // true
    Object.is(window, window);   // true
    
    Object.is('leo', 'pingan');     // false
    Object.is([], []);           // false
    
    var leo = { a: 1 };
    Object.is(leo, leo);       // true
    
    Object.is(null, null);       // true
    
    // 特例
    Object.is(0, -0);            // false
    Object.is(-0, -0);           // true
    Object.is(NaN, 0/0);         // true
    

    另外还有特殊的:

    • 零值相等:
      与同值相等类似,不过会认为 +0-0 相等。

    5.对比图

    相等操作符对于不同类型的值,进行的比较如下图所示(来源 MDN):

    MDN 相等1

    注意:

    • ToNumber(A) 表示比较前将参数 A 转换为数字
    • ToPrimitive(A)通过尝试调用 AA.toString()A.valueOf() 方法,将参数 A 转换为原始值(Primitive)。

    MDN 相等2

    MDN 相等3

    MDN 相等4

    参考文章:

    1. MDN JavaScript 中的相等性判断
    2. JavaScript高级程序设计

    本部分内容到这结束

    Author 王平安
    E-mail pingan8787@qq.com
    博 客 www.pingan8787.com
    微 信 pingan8787
    每日文章推荐 https://github.com/pingan8787/Leo_Reading/issues
    JS小册 js.pingan8787.com

    bg

    个人博客:http://www.pingan8787.com 微信公众号【前端自习课】和千万网友一起,每日清晨,享受一篇前端优秀文章。 目前已连续推送文章 600+ 天,愿每个人的初心都能一直坚持下去!
  • 相关阅读:
    QA问答系统,QA匹配论文学习笔记
    HMM Viterbi算法 详解
    py2 to py3 return iterator
    git 的回退
    mysql之group_concat函数详解
    sqlserver系统表使用
    Spring事务配置的五种方式
    MySQL 触发器简单实例
    64位Java开发平台的选择,如何区分JDK,Tomcat,eclipse的32位与64版本
    HSSFWorkbook和XSSFWorkbook的区别
  • 原文地址:https://www.cnblogs.com/pingan8787/p/11838197.html
Copyright © 2011-2022 走看看