ES6标准入门(第 3 版)
25.2 相等运算符
阅读(

ECMAScript 6 简介

let 和 const 命令

变量的解构赋值

字符串的扩展

正则的扩展

数值的扩展

函数的扩展

数组的扩展

对象的扩展

Symbol

Set 和 Map 数据结构

Proxy

Reflect对象

Promise对象

Iterator 和 for...of 循环

Generator函数语法

Generator函数的异步应用

async函数

Class的基本语法

Class的继承

Decorator

ES6模块

加载ES6模块

ES6编码规范

读懂ES6规格

概述

相等运算符

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

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

0 == null

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

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

“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

0 == null // false

如果本教程对您帮助很大,请随意打赏。您的支持,将鼓励我们提供更好的教程!

← 键盘方向键翻页 →
返回顶部 手机访问 关注微信 返回底部

扫码访问歪脖网

随时随地,想看就看

关注歪脖网微信

分享 web 知识、交流 web 经验