ES6 规格之相等运算符
2018-02-06 22:28
113 查看
相等运算符
相等运算符(==)是一个很让人头痛的运算符,它的语法行为多变,不符合直觉。这个小节就看看规格怎么规定它的行为。
请看下面这个表达式,请问它的值是多少。
0 == null
如果你不确定答案,或者想知道语言内部怎么处理,就可以去查看规格,7.2.12 小节是对相等运算符(
==)的描述。
ES6 规格对每一种语法行为的描述,都分成两部分:先是总体的行为描述,然后是实现的算法细节。相等运算符的总体描述,只有一句话。
“The comparison
x == y, where
xand
yare
values, produces
trueor
false.”
上面这句话的意思是,相等运算符用于比较两个值,返回
true或
false。
下面是算法细节。
ReturnIfAbrupt(x).
ReturnIfAbrupt(y).
If
Type(x)is the same as
Type(y),
then\ Return the result of performing Strict Equality Comparison
x === y.
If
xis
nulland
yis
undefined,
return
true.
If
xis
undefinedand
yis
null,
return
true.
If
Type(x)is Number and
Type(y)is
String,\ return the result of the comparison
x == ToNumber(y).
If
Type(x)is String and
Type(y)is
Number,\ return the result of the comparison
ToNumber(x) == y.
If
Type(x)is Boolean, return the result of the comparison
ToNumber(x) == y.
If
Type(y)is Boolean, return the result of the comparison
x == ToNumber(y).
If
Type(x)is either String, Number, or Symbol and
Type(y)is
Object, then\ return the result of the comparison
x == ToPrimitive(y).
If
Type(x)is Object and
Type(y)is
either String, Number, or Symbol, then\ return the result of the comparison
ToPrimitive(x) == y.
Return
false.
上面这段算法,一共有 12 步,翻译如下。
如果
x不是正常值(比如抛出一个错误),中断执行。
如果
y不是正常值,中断执行。
如果
Type(x)与
Type(y)相同,执行严格相等运算
x === y。
如果
x是
null,
y是
undefined,返回
true。
如果
x是
undefined,
y是
null,返回
true。
如果
Type(x)是数值,
Type(y)是字符串,返回
x == ToNumber(y)的结果。
如果
Type(x)是字符串,
Type(y)是数值,返回
ToNumber(x) == y的结果。
如果
Type(x)是布尔值,返回
ToNumber(x) == y的结果。
如果
Type(y)是布尔值,返回
x == ToNumber(y)的结果。
如果
Type(x)是字符串或数值或
Symbol值,
Type(y)是对象,返回
x == ToPrimitive(y)的结果。
如果
Type(x)是对象,
Type(y)是字符串或数值或
Symbol值,返回
ToPrimitive(x) == y的结果。
返回
false。
由于
0的类型是数值,
null的类型是
Null(这是规格4.3.13 小节的规定,是内部 Type 运算的结果,跟
typeof运算符无关)。因此上面的前
11 步都得不到结果,要到第 12 步才能得到
false。
0 == null // false
相关文章推荐
- javascript: 相等和不等运算符
- 深入相等运算符
- js基础之关于Boolean及相等运算符的隐式类型转换
- ES6 ...点号运算符
- 相等运算符(==)和等同运算符(===)
- es6 ...展开运算符
- javaScript相等运算符==
- Screensiz.es – 最流行移动设备及显示器的屏幕规格大全
- javascript 中的==(相等运算符)与===(等同运算符)比较
- 关于C#相等运算符(==)重载的问题
- javascript中的相等运算符(==)和等同运算符(===)
- javascript 相等运算符(==)和等同运算符(===)
- javascript相等运算符与等同运算符(转自www.jqueryba.com)
- js中的等值运算符(抽象相等==与严格相等===的区别)
- 03 WebGL 着色器编程语言GLSL ES的变量类型、赋值和类型转换、运算符
- C++编程中删除运算符与相等运算符的使用解析
- JavaScript等同和相等运算符
- es6 扩展运算符 “...”
- 相等运算符==与等同运算符===