资讯专栏INFORMATION COLUMN

揭密“==”隐藏下的类型转换

guqiu / 2287人阅读

摘要:当转换后的原始数据类型为类型或者类型,则继续转换成类型。具体流程图如下备注的数据类型可以分为以下两种原始数据类型才引入的引用类型类型类型转换成类型的规则类型类型标准的数字格式如果是标准的数字格式,转换成类型相比不用多说,比如下面这几个栗子

抛砖引玉

按照正常的逻辑来说,我们判断两个值是否相等会遵循以下规则:

但是我看下面一组值:

[]==0 //true
[]==false //true
[]==!{} //true
[10]==10 //true
"0"==false //true
""==0 //true
undefined==null //true 
!null==true //true 


居然没有按照我们的剧本走,那它比较规则又是什么?下面我就来分析一波。

“==”的比较规则

首先我们先去ECMAScript5.1中文版( http://lzw.me/pages/ecmascrip... )找一下“==”的比较规则,如下:

1.若Type(x)与Type(y)相同, 则
    a.若Type(x)为Undefined, 返回true。
    b.若Type(x)为Null, 返回true。
    c.若Type(x)为Number, 则
        i.若x为NaN, 返回false。
        ii.若y为NaN, 返回false。
        iii.若x与y为相等数值, 返回true。
        iv.若x 为 +0 且 y为−0, 返回true。
        v.若x 为 −0 且 y为+0, 返回true。
        vi返回false。
    d.若Type(x)为String, 则当x和y为完全相同的字符序列(长度相等且相同字符在相同位置)时返回true。 否则, 返回false。
    e.若Type(x)为Boolean, 当x和y为同为true或者同为false时返回true。 否则, 返回false。
    f.当x和y为引用同一对象时返回true。否则,返回false。
2.若x为null且y为undefined, 返回true。
3.若x为undefined且y为null, 返回true。
4.若Type(x) 为 Number 且 Type(y)为String, 返回comparison x == ToNumber(y)的结果。
5.若Type(x) 为 String 且 Type(y)为Number,返回比较ToNumber(x) == y的结果。
6.若Type(x)为Boolean, 返回比较ToNumber(x) == y的结果。
7.若Type(y)为Boolean, 返回比较x == ToNumber(y)的结果。
8.若Type(x)为String或Number,且Type(y)为Object,返回比较x == ToPrimitive(y)的结果。
9.若Type(x)为Object且Type(y)为String或Number, 返回比较ToPrimitive(x) == y的结果。
10.返回 false

看完ECMAScript5.1中文版的介绍之后,相信很多小伙伴的心情应该是这样的:

别看上面说的有点花里胡哨的,其实我们可以用很简单的话来总结出来。由于本篇文章核心是“==”是如何进行类型转换,我就总结一下类型不同的情况下“==”是如何比较的。

当数据类型为Boolean类型或者String类型时,比较时需要转换成Number类型。

当数据类型为引用类型时,需要转换成原始数据类型。当转换后的原始数据类型为Boolean类型或者String类型,则继续转换成Number类型。

undefined和null跟任何值在“==”下都返回false,但二者在“==”下返回true。

具体流程图如下:

备注:

Javascript的数据类型可以分为以下两种:

原始数据类型(null、undefined、Number、String、Boolean、Symbol(Es6才引入的))

引用类型 (Object)

Boolean类型、String类型转换成Number类型的规则(ToNumber) Boolean类型
Boolean Number
true 1
false 0
String类型 标准的数字格式

如果是标准的数字格式,转换成Number类型相比不用多说,比如下面这几个栗子

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/103433.html

相关文章

  • 揭密微信跳一跳小游戏那些外挂

    摘要:所以,我们这个小游戏发布以后,我们就开始花了很多很多时间来打击外挂。二距离判断像素点判断该方法采用自目前最火的跳一跳小游戏辅助程序。 作者:Hahn, 腾讯高级UI工程师商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。 原文链接:http://wetest.qq.com/lab/view/364.html WeTest 导读 张小龙:这个游戏发布以后,其实它的效果有点超...

    lyning 评论0 收藏0
  • 揭密React setState

    摘要:下面来逐步的解析图里的流程。一将事务放进队列中这里的可以传也可以传它会产生新的以一种的方式跟旧的进行合并。如果当前不在更新过程的话,则执行更新事务。以上即为的实现过程,最后还是用一个流程图在做一个总结吧参考文档 前言 学过react的人都知道,setState在react里是一个很重要的方法,使用它可以更新我们数据的状态,本篇文章从简单使用到深入到setState的内部,全方位为你揭开...

    JeOam 评论0 收藏0
  • 系统地学习C++

    摘要:本书主要围绕一系列逐渐复杂的程序问题,以及用以解决这些问题的语言特性展开讲解。你不只学到的函数和结构,也会学习到它们的设计目的和基本原理。因此我们把精力集中在最有价值的地方。本书不仅是对模板的权威解释,而且本书还深入地介绍了其他一般的思想。 C++ 入门教程(41课时) - 阿里云大学 C+...

    joyqi 评论0 收藏0
  • Java 面向对象(上)

    摘要:对象的引用关键字总是指向调用该方法的对象。根据出现位置的不同,作为对象的默认引用有两种情形。构造器中引用该构造器正在初始化的对象。如果同一个类中包含了两个或两个以上方法的方法名相同,但形参列表不同,则被称为方法重载。 类和对象 定义类 面向对象的程序设计过程中有两个重要概念:类(class)和对象(object,也被称为实例,instance),其中类是某一批对象的抽象,可以把类理解成...

    SimonMa 评论0 收藏0
  • JavaScript是如何工作的:深入V8引擎&编写优化代码的5个技巧

    摘要:第二篇文章将深入谷歌的引擎的内部。引擎可以实现为标准解释器,或者以某种形式将编译为字节码的即时编译器。这个引擎是在谷歌中使用的,但是,与其他引擎不同的是也用于流行的。一种更复杂的优化编译器,生成高度优化的代码。不是唯一能够做到的引擎。 本系列的 第一篇文章 主要介绍引擎、运行时和调用堆栈。第二篇文章将深入谷歌 V8 的JavaScript引擎的内部。 想阅读更多优质文章请猛戳GitHu...

    Turbo 评论0 收藏0

发表评论

0条评论

guqiu

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<