文档章节

从官方文档解释弱等于

您的好友
 您的好友
发布于 2017/08/27 23:31
字数 851
阅读 19
收藏 0

本文的目的是为了和大家分享如何从官方文档中获得答案
至于标题中和本文其他的语法也是非常不规范
在平时开发中需要极力避免使用==与不必要的类型转化

demo

我先抛出一个例子 大部分人估计会很疑惑 在语言大战中 很多其他语言的人也经常抓住类似的例子来攻击js

但是js作为一个有规范的语言 所有的结果都要遵循规则吧 然后咱就来带大家看看 关于==语法在es 2017中的定义

为啥是2017呢 因为本文写的时候最新的标准就是这个版本 ECMAScript® 2017 Language Specification (ECMA-262, 8th edition, June 2017) 但是没有关系啊 我会截图给大家的

首先先看==的标准 Abstract Equality Comparison

提示一下 文中涉及到的类型 全都是指基本类型 js目前有七大基本类型: Undefined, Null, Boolean, String, Symbol, Number, Object. 为了和typeof返回值一致 我就都使用小写了

Abstract Equality Comparison

这个标准其实不复杂 其实也就十几个步骤 中间各种情况 咱画个流程图 文档中xy有先后顺序 咱们这就不管顺序了吧

Steps of Equality

中间就5个判断 总结一下 可以分为三组 进行区分

  1. 相同类型直接返回===结果
  2. object之间
    1. undefinednull遇见的时候为true
    2. string number boolean 两两遇见的时候将转化成number进行判断
    3. 其他情况返回false
  3. object与其他类型之间
    1. 遇到undefinednull, 返回false
    2. 遇到booleanboolean转化为number重新计算
    3. 其他情况获取object原始值进行重新计算

哎 这样就清晰了

啥是对象的原始值? 好了 这又得看另外一个规则了 toPrimitive

一个前置条件: 原始值不能为object

这个规则又是挺麻烦的一个 流程和情况分支也很多 我就总结一下这里用到的规则吧:

  1. 如果输入值具有名为Symbol.toPrimitive的函数, 函数运算结果即为原始值, 如果运算结果不合条件将会报错
  2. 计算valueOf方法的值, 运算结果如果符合条件则即为原始值
  3. 计算toString方法的值, 运算结果如果符合条件则即为原始值
  4. 如果以上没有获得原始值将报错

所以 这就是最终的答案

整个流程是这样的

    ![] == [] // 最初的等式
    false == [] // !运算符对象直接转换成boolean
    0 == [] // boolean转化为number
    0 == "" // 对象转使用`toString`方法转化为原始值, 得到一个空字符串
    0 == 0 // 空字符串转换数字0
    true  // 结果

而这个 ![] == ![]就比较简单 直接是类型强转false == falsetrue

[] == [] 也比较简单了 因为类型一样 所以返回[] === [] 而任何对象除了同一个引用之外不等于其他任何对象 所以答案是false

举一反三

    var dEmpty = {}
    var dSymbol = { [Symbol.toPrimitive]: function() { return "" }}
    var dValueOf = { valueOf: function() { return "" }}
    
    dEmpty == !dEmpty
    // => dEmpty == false // !运算符
    // => dEmpty == 0 // boolean 转化为 0
    // => "[object Object]" == 0  // 使用 toString 得到原始值
    // => NaN == 0  // 转化为number  NaN
    // => false

    dSymbol == !dSymbol 
    // => dSymbol == false 
    // => dSymbol == 0  
    // => "" == 0  // 使用 Symbol.toPrimitive 得到原始值""
    // => 0 == 0

    dValueOf == !dValueOf 
    // => dValueOf == false 
    // => dValueOf == 0  
    // => "" == 0  // 使用 valueOf 得到原始值""
    // => 0 == 0

© 著作权归作者所有

您的好友

您的好友

粉丝 40
博文 4
码字总数 6557
作品 0
杭州
程序员
私信 提问
为什么Android官方废弃SoftRefrerence软引用和WeakReference弱引用,而拥抱LruCache?

为什么Android官方废弃SoftRefrerence软引用和WeakReference弱引用,而拥抱LruCache? 一些具有Java背景的研发者喜欢使用软引用(SoftRefrerence)和弱引用(WeakReference)来缓存Java对象和数据...

开开心心过
2018/06/09
0
0
顶级域名和一级域名的问题

我在网上看到关于顶级域名和一级域名有两个解释: 第一个说法是顶级域名等于一级域名,比如.com .cn .org 这些即是顶级域名也是一级域名而example.com baidu.com这些是二级域名。 第二个说法...

囚笼
2018/01/03
95
0
数据库递归查询:MySQL VS Sequelize

一、前言 最近在做团队的排期系统改版时涉及到数据库的递归查询问题,有一个需求数据表,表中的需求数据以parentId为外键定义数据的继承关系,需求之间的关系呈现树状关系。需求数据表如下:...

嘻嘻哈哈学习
04/16
0
0
实验吧-忘记密码了&天网管理系统

解题方案网上已经有一堆了,这里主要总结下get到的几个知识点。 1、php中的字符串比较 当php进行一些数学计算的时候,当有一个对比参数是整数的时候,会把另外一个参数强制转换为整数。注:b...

fang_faye
2018/11/05
0
0
JAVA并发-自问自答学ThreadLocal

前言 很多同学都搞不懂是什么东西,可以用来干嘛。但面试时却又经常问到,所以这次我和大家一起学习这个类。 下面我就以面试问答的形式学习我们的——类(源码分析基于JDK8) 本文同步发布于...

liangzzz
2017/11/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql mysql常用的数学函数

1. 数学函数 函 数 作 用 ABS(x) 返回x的绝对值 CEIL(x),CEILIN(x) 返回不小于x的最小整数值 FLOOR(x) 返回不大于x的最大整数值 RAND() 返回0~1的随机数 RAND(x) 返回0~1的随机数,x值相同返...

edison_kwok
30分钟前
0
0
译:Spring Data Repository 不区分大小写查询

使用Spring Data Repository 不区分大小写查询 原文链接:https://www.baeldung.com/spring-data-case-insensitive-queries 作者:Shubhra Srivastava 译者:liululee 1. 概览 Spring Data ......

liululee
37分钟前
0
0
读书replay《maven实战》.1.20190526

前情提要 maven这个工具用了好久了,但是一直都用的迷迷糊糊的,没有对它进行过系统性的学习,只是知道一些常用的功能怎么实现,所以20190516这一天我从JD购买了徐晓斌老师所著的《maven实战...

wanxiangming
52分钟前
1
0
真实项目案例实战——【状态设计模式】使用场景

什么是状态模式 状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。 状态模式应用场景 1.一个对象的行为取决于它的状态,并且它必须在运行时刻根...

须臾之余
59分钟前
1
0
Java 实现把字符串转换成整数【底层实现】

https://blog.csdn.net/zl18310999566/article/details/80263396

qimh
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部