动力节点java通过一张简单图,让你彻底地、永久地搞懂JS==运算.pdfVIP

动力节点java通过一张简单图,让你彻底地、永久地搞懂JS==运算.pdf

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
动力节点java——通过一张简单的图 ,让你彻底地、永久地 搞懂 JS 的==运算 大家知道 ,JavaScript 中的==是一种比较复杂运算 ,它的运算规则很奇怪 ,很 容易让人犯错 ,从而成为JavaScript 中 “最糟糕的特性”之一。 在仔细阅读 ECMAScript 规范的基础上 ,我画了一张图我想等你理解了这张图 后 ,会彻底地弄懂关于==运算的一切。同时 ,我试图通过此文向大家证明==并 不是那么糟糕的东西 ,它很容易掌握 ,甚至看起来很合理 ,并没那么糟糕。 先上图 : 图 1 == 运算规则的图形化表示 ==运算规则的精确描述在此 :The Abstract Equality Comparison Algorithm。但是 ,这么复杂的描述 ,你确定看完后脑子不晕 ?确定立马就能拿 它指导实践 ? 肯定不行 ,规范毕竟是给 JavaScript 运行环境的开发人员看的(比较 V8 引擎的 开发人员们) ,而不是给语言的使用者看的。而上图正是将规范翻译成了方便大 家看的形式。 在详细介绍图 1 中的每个部分前 ,我们来复习一下 JS 中关于类型的知识 : 1 ,JS 中的值有两种类型 :基本类型、对象类型。 2 ,基本类型包括 :Undefined、Null、Boolean、Number和 String等五种类 型。 3 ,Undefined类型和 Null类型的都只有一个值 ,即undefined和 null ;Boolean 类型有两个值 :true和 false ;Number类型的值有很多很多 ;String类型的值 有无数个值(理论上)。 4 ,所有对象都有 valueOf()和 toString()方法 ,它们继承自Object ,当然也可 能被子类重写。 5 ,现在考虑表达式 : x y 其中x 和 y 是六种类型中某一种类型的值。 当x 和 y 的类型相同时 ,x ==y 可以转化为 x ===y ,而后者是很简单的(唯一 需要注意的可能是 NaN) ,所以下面我们只考虑 x 和 y 的类型不同的情况。 一. 有和无 在图 1 中 ,JavaScript 值的六种类型用蓝底色的矩形表示。首先它们被分成了两 组 : String、Number、Boolean和 Object (对应左侧的大矩形框) Undefined和 Null (对应右侧的矩形框) 分组的依据是什么 ?我们来看一下 ,右侧的 Undefined和 Null是用来表示不确 定、无或者空的 ,而右侧的四种类型都是确定的、有和非空。我们可以这样说 : 左侧是一个存在的世界 ,右侧是一个空的世界。 所以 ,左右两个世界中的任意值做==比较的结果都是 false是很合理的。(即图 1 中连接两个矩形的水平线上标的false) 二. 空和空 JavaScript 中的 undefined和 null是另一个经常让我们崩溃的地方。通常它被 认为是一个设计缺陷 ,这一点我们不去深究。不过我曾听说 ,JavaScript 的作者 最初是这样想的 : 假如你打算把一个变量赋予对象类型的值 ,但是现在还没有赋值 ,那么你可以用 null表 示此时的状态(证据之一就是 typeof null 的结果是object) ;相反 ,假如你打算把一个 变量赋予原始类型的值 ,但是现在还没有赋值 ,那么你可以用 undefined 表示此时的状 态。 不管这个传闻是否可信 ,它们两者做==比较的结果是 true也是很合理的。(即 图 1 中右侧垂直线上标的true) 在进行下一步之前 ,我们先来说一下图 1 中的两个符号 :大写字母 N和 P。这 两个符号不是 PN节中正和负的意思。而是 : N表示 ToNumber操作 ,即将操作数转为数字。它是 ES规范中的抽象操作 , 但我们可以用JS 中的 Number()函数来等价替代。 P表示 ToPrimitive操作 ,即将操作数转为原始类型的值。它也是 ES规范中的 抽象操作 ,它也可以翻译成等价的JS代码。不过稍微复杂一些 ,简单说来 ,对 于一个对象 obj : ToPrimitive(obj)等价于 :先计算 obj.valueOf() ,如果结果为原始值 ,则返回此结果 ; 否则 ,计算 obj.toString() ,如果结果是原始值 ,则返回此结果 ;否则 ,抛出异常。

文档评论(0)

xuefei111 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档