Skip to content

ES5中部分操作类型转换小抄 #9

@zhang0ZGC

Description

@zhang0ZGC

JS 在执行过程中会发生类型隐式转换,这里抄了 ECMA 规范的『+』和『==』运算符的解释

ECMA 规范

加法运算符(+)

https://www.w3.org/html/ig/zh/wiki/ES5/%E8%A1%A8%E8%BE%BE%E5%BC%8F#.E5.8A.A0.E6.B3.95.E8.BF.90.E7.AE.97.E7.AC.A6.EF.BC.88.2B.EF.BC.89

加法运算符启动字符串相接或是数值相加。

产生式  AdditiveExpression : AdditiveExpression + MultiplicativeExpression 按照下面的过程执行:

  1. lref 为解释执行 AdditiveExpression 的结果。
  2. lval 为 GetValue(lref)
  3. 令 rref 为解释执行 MultiplicativeExpression 的结果。
  4. rval 为 GetValue(rref)。
  5. lprim 为 ToPrimitive(lval)。
  6. 令 rprim 为 ToPrimitive(rval)。
  7. 如果 Type(lprim) 为 String 或者 Type(rprim) 为 String,则:
    1. 返回由 ToString(lprim) 和 ToString(rprim) 连接而成的字符串。
  8. 返回将加法运算作用于 ToNumber(lprim) 和 ToNumber(rprim) 的结果。参见 11.6.3 后的注解。

注:在 第5步 和 第6步 中 ToPrimitive 的调用没有提供暗示类型。所有除了 Date 对象的 ECMAScript 原生对象会在没有提示的时候假设提示是 NumberDate 对象会假设提示是 String。宿主对象可以假设提示是任何东西。

抽象相等比较算法

https://www.w3.org/html/ig/zh/wiki/ES5/%E8%A1%A8%E8%BE%BE%E5%BC%8F#.E6.8A.BD.E8.B1.A1.E7.9B.B8.E7.AD.89.E6.AF.94.E8.BE.83.E7.AE.97.E6.B3.95

以 x 和 y 为值进行 x == y 比较会产生的结果可为 true 或 false。比较的执行步骤如下:

  1. 若 Type(x) 与 Type(y) 相同, 则
    1. 若 Type(x) 为 Undefined, 返回 true
    2. 若 Type(x)为 Null, 返回 true
    3. 若 Type(x)为 Number,则
      1. 若 x 为 NaN,返回 false
      2. 若 y 为 NaN,返回 false
      3. 若 x 与 y 为相等数值,返回 true
      4. 若 x 为 +0 且 y 为 −0,返回 true
      5. 若 x 为 −0 且 y 为 +0,返回 true
      6. 返回 false
    4. 若 Type(x) 为 String,则当 x 和 y 为完全相同的字符序列(长度相等且相同字符在相同位置)时返回 true。否则,返回 false
    5. 若 Type(x) 为 Boolean,当 x 和 y 为同为 true 或者同为 false 时返回 true。否则,返回 false
    6. 当 x 和 y 为引用同一对象时返回 true。否则,返回 false
  2. 若 x 为 null 且 y 为 undefined,返回 true
  3. 若 x 为 undefined 且 y 为 null,返回 true
  4. 若 Type(x) 为 Number 且 Type(y) 为 String,返回 x == ToNumber(y) 的结果。
  5. 若 Type(x) 为 String 且 Type(y) 为 Number,返回比较 ToNumber(x) == y 的结果。
  6. 若 Type(x) 为 Boolean,返回比较 ToNumber(x) ==  y 的结果。
  7. 若 Type(y) 为 Boolean,返回比较 x  == ToNumber(y) 的结果。
  8. 若 Type(x) 为 String 或 Number,且 Type(y) 为 Object,返回比较 x == ToPrimitive(y) 的结果。
  9. 若 Type(x) 为 Object 且 Type(y) 为 String 或 Number,返回比较 ToPrimitive(x) == y 的结果。
  10. 返回 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

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions