相等运算符

相等运算符(==)是一个很让人头痛的运算符,它的语法行为多变,不符合直觉。这个小节就看看规格怎么规定它的行为。

请看下面这个表达式,请问它的值是多少。

  1. 0 == null

如果你不确定答案,或者想知道语言内部怎么处理,就可以去查看规格,7.2.12 小节是对相等运算符(==)的描述。

ES6 规格对每一种语法行为的描述,都分成两部分:先是总体的行为描述,然后是实现的算法细节。相等运算符的总体描述,只有一句话。

“The comparisonx == y, wherexandyare values, producestrueorfalse.”

上面这句话的意思是,相等运算符用于比较两个值,返回truefalse

下面是算法细节。

  1. ReturnIfAbrupt(x).
  2. ReturnIfAbrupt(y).
  3. IfType(x)is the same asType(y), then\ Return the result of performing Strict Equality Comparisonx === y.
  4. Ifxisnullandyisundefined, returntrue.
  5. Ifxisundefinedandyisnull, returntrue.
  6. IfType(x)is Number andType(y)is String,\ return the result of the comparisonx == ToNumber(y).
  7. IfType(x)is String andType(y)is Number,\ return the result of the comparisonToNumber(x) == y.
  8. IfType(x)is Boolean, return the result of the comparisonToNumber(x) == y.
  9. IfType(y)is Boolean, return the result of the comparisonx == ToNumber(y).
  10. IfType(x)is either String, Number, or Symbol andType(y)is Object, then\ return the result of the comparisonx == ToPrimitive(y).
  11. IfType(x)is Object andType(y)is either String, Number, or Symbol, then\ return the result of the comparisonToPrimitive(x) == y.
  12. Returnfalse.

上面这段算法,一共有 12 步,翻译如下。

  1. 如果x不是正常值(比如抛出一个错误),中断执行。
  2. 如果y不是正常值,中断执行。
  3. 如果Type(x)Type(y)相同,执行严格相等运算x === y
  4. 如果xnullyundefined,返回true
  5. 如果xundefinedynull,返回true
  6. 如果Type(x)是数值,Type(y)是字符串,返回x == ToNumber(y)的结果。
  7. 如果Type(x)是字符串,Type(y)是数值,返回ToNumber(x) == y的结果。
  8. 如果Type(x)是布尔值,返回ToNumber(x) == y的结果。
  9. 如果Type(y)是布尔值,返回x == ToNumber(y)的结果。
  10. 如果Type(x)是字符串或数值或Symbol值,Type(y)是对象,返回x == ToPrimitive(y)的结果。
  11. 如果Type(x)是对象,Type(y)是字符串或数值或Symbol值,返回ToPrimitive(x) == y的结果。
  12. 返回false

由于0的类型是数值,null的类型是 Null(这是规格4.3.13 小节的规定,是内部 Type 运算的结果,跟typeof运算符无关)。因此上面的前 11 步都得不到结果,要到第 12 步才能得到false

  1. 0 == null // false

ES6 规格之相等运算符相关推荐

  1. (...)ES6三点扩展运算符

    来源:https://www.cnblogs.com/rlann/p/7222150.html (...)ES6三点扩展运算符 扩展运算符将一个数组转为用逗号分隔的参数序列 console.log(. ...

  2. ES6规格之数组的空位

    数组的空位 下面再看另一个例子. const a1 = [undefined, undefined, undefined]; const a2 = [, , ,]; a1.length // 3 a2 ...

  3. Vue的三个点es6知识,扩展运算符表达含义

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  4. ES6高级:扩展运算符,箭头函数,class类,iterator迭代器

    2. 扩展运算符 ... 2.1 reset参数 reset参数==必须放在最后==,为了替代arguments,在函数形参中使用,==接受剩余参数==,以==数组==的形式去接受 //1. rese ...

  5. ES6增加了扩展运算符: ... 三个点是ES几的

    ES6 的扩展运算符( spread )是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. 1.将一个数组转为用逗号分隔的参数序列(把数组中元素展开). 如下: ...

  6. es6语法-对象拓展运算符

    对象拓展运算符 创建 对象拓展运算符.html 拓展运算符(...)用于取出参数对象所有可遍历属性然后拷贝到当前对象. // 1.拷贝对象 let person1 = {name: "Amy ...

  7. es6 对象的扩展运算符

    对象的扩展运算符 <数组的扩展>一章中,已经介绍过扩展运算符(...). const [a, ...b] = [1, 2, 3]; a // 1 b // [2, 3] ES2017 将这 ...

  8. ES6中的扩展运算符

    扩展运算符(...)将一个数组转化为参数序列,通常与函数一起使用,show(...['judy','girl']). 数组合并:[...arr1,...arr2,...arr3] 字符串转字符数组:[ ...

  9. ES6对象的扩展运算符

    1.对象的扩展运算符(-)用于取出参数对象的所有可遍历属性,拷贝到当前对象之中 let z = {a:3,b:4}; let n = {...z}; console.log(n);//{a:3,b:4 ...

最新文章

  1. webstrom常用键
  2. set OpenCV_ROOT
  3. JPA_could not extract ResultSet问题解决
  4. 细腻剖析2010年3月四级网络工程师试卷解题思路
  5. 都说开完电动汽车,就不想再开回燃油车了,是这样吗?
  6. 了解 Adobe Scout 收集和使用的数据
  7. HTML样式- CSS
  8. Opencv的KeyPoint和DMatch数据结构
  9. 系统运行后修改linux系统时区
  10. 线性代数:切线空间和法向量变换
  11. 2022-06-08 iPhone快捷指令自动切换壁纸
  12. 报错:Apache提示 the requested operation has failed无法启动问题(最全!)
  13. 2021年第十二届蓝桥杯大赛软件赛决赛C/C++大学A组 个人部分题解
  14. 画一个带统计检验的PCoA分析结果
  15. Kubernetes生产实践系列之二十二:Service Mesh之在Kubernetes部署Linkerd2进行service mesh
  16. 蓝屏解决办法,及介绍。(装逼或学习)
  17. 《JavaEE开发技术》课程考试试题(A卷)
  18. NLD4J - Arbiter
  19. ShareSDK Android SDK API
  20. 网页版终端webssh2配置

热门文章

  1. juery 常用方法
  2. 深入研究java.lang.ThreadLocal类
  3. ASP静态HTML(局部)生成类
  4. JVM虚拟机-Class文件之字段表集合
  5. Linux crontab定时执行任务 命令格式与详细例子
  6. NLP之---word2vec算法skip-gram原理详解
  7. java 是否含有日文_Java踩坑记系列之Arrays.asList
  8. 线性代数:线性方程组的解
  9. SPOJ9534 JZPLIT - Turn on the lights(高斯消元)
  10. 深入解析JQuery中的isPlainObject()使用方法