-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Labels
BLOG博客博客
Description
JS 在执行过程中会发生类型隐式转换,这里抄了 ECMA 规范的『+』和『==』运算符的解释
ECMA 规范
加法运算符(+)
加法运算符启动字符串相接或是数值相加。
产生式 AdditiveExpression : AdditiveExpression + MultiplicativeExpression 按照下面的过程执行:
- 令
lref
为解释执行 AdditiveExpression 的结果。 - 令
lval
为 GetValue(lref)。 - 令
rref
为解释执行 MultiplicativeExpression 的结果。 - 令
rval
为 GetValue(rref)。 - 令
lprim
为 ToPrimitive(lval)。 - 令
rprim
为 ToPrimitive(rval)。 - 如果 Type(lprim) 为 String 或者 Type(rprim) 为 String,则:
- 返回将加法运算作用于 ToNumber(lprim) 和 ToNumber(rprim) 的结果。参见 11.6.3 后的注解。
注:在 第5步 和 第6步 中 ToPrimitive 的调用没有提供暗示类型。所有除了 Date 对象的 ECMAScript 原生对象会在没有提示的时候假设提示是 Number;Date 对象会假设提示是 String。宿主对象可以假设提示是任何东西。
抽象相等比较算法
以 x 和 y 为值进行 x == y 比较会产生的结果可为 true 或 false。比较的执行步骤如下:
- 若 Type(x) 与 Type(y) 相同, 则
- 若 Type(x) 为 Undefined, 返回 true。
- 若 Type(x)为 Null, 返回 true。
- 若 Type(x)为 Number,则
- 若 x 为 NaN,返回 false。
- 若 y 为 NaN,返回 false。
- 若 x 与 y 为相等数值,返回 true。
- 若 x 为 +0 且 y 为 −0,返回 true。
- 若 x 为 −0 且 y 为 +0,返回 true。
- 返回 false。
- 若 Type(x) 为 String,则当 x 和 y 为完全相同的字符序列(长度相等且相同字符在相同位置)时返回 true。否则,返回 false。
- 若 Type(x) 为 Boolean,当 x 和 y 为同为 true 或者同为 false 时返回 true。否则,返回 false。
- 当 x 和 y 为引用同一对象时返回 true。否则,返回 false。
- 若 x 为 null 且 y 为 undefined,返回 true。
- 若 x 为 undefined 且 y 为 null,返回 true。
- 若 Type(x) 为 Number 且 Type(y) 为 String,返回 x == ToNumber(y) 的结果。
- 若 Type(x) 为 String 且 Type(y) 为 Number,返回比较 ToNumber(x) == y 的结果。
- 若 Type(x) 为 Boolean,返回比较 ToNumber(x) == y 的结果。
- 若 Type(y) 为 Boolean,返回比较 x == ToNumber(y) 的结果。
- 若 Type(x) 为 String 或 Number,且 Type(y) 为 Object,返回比较 x == ToPrimitive(y) 的结果。
- 若 Type(x) 为 Object 且 Type(y) 为 String 或 Number,返回比较 ToPrimitive(x) == y 的结果。
- 返回 false。
注:根据上述等于的定义:
- 字符串比较可以以:"" + a == "" + b 硬性触发。
- 数值比较可以以:+a == +b 硬性触发。
- 布尔比较可以以:!a == !b 硬性触发。
注:等于运算符有以下的不变量:
- A != B 与 !(A == B) 相等。
- 除了 A 与 B 的执行顺序以外,A == B 与 B == A 相等。
注:等于运算符不总是可传递。举例来说,两个代表相同 String 值但是不同的 String 对象会分别与 String 值 ==,但是两个对象间不相等。
注:String 的比较使用代码单元序列的简单等号比较。这里不打算使用更复杂的、语义化的字符或字符串序列,和 Unicode 规范的整理序列进行比较。因此,在 Unicode 标准中相等的 String 值可能在本算法中不相等。也就是,这个算法假定了所有字符串已经正规化。
Metadata
Metadata
Assignees
Labels
BLOG博客博客