7.2 Testing and Comparison Operations

7.2.1 RequireObjectCoercible(argument)

如表14中所示,如果argument使用ToObject不能转成Object,会抛出错误

表14 RequireObjectCoercible 结果
参数类型 结果
Undefined 抛出TypeError异常
Null 抛出TypeError异常
Boolean 返回 argument
Number 返回argument
String 返回argument
Symbol 返回argument
Object 返回argument

7.2.2 IsArray(argument)

这个抽象操作步骤如下:

  • 如果 Type(argument) 不是 Object, 返回 false.
  • 如果 argument 是 Array, 返回 true.
  • 如果 argument 使 Proxy , 那么
    • 如果argument的[[ProxyHandler]] 属性值为null, 抛出TypeError 异常.
    • 使target为argument 的[[ProxyTarget]] i
    • 返回 ? IsArray(target).
  • 返回 false.

7.2.3 IsCallable ( argument )

这个抽象操作探测argument是否有[[Call]]内部属性.

  • 如果 Type(argument) 不是 Object, 返回 false.
  • 如果 argument 有 [[Call]] 内部方法, 返回 true.
  • 返回 false.

7.2.4 IsConstructor ( argument )

这个抽象操作探测argument是否有[[Construct]]内部属性.

  • 如果 Type(argument) 不是 Object, 返回 false.
  • 如果 argument 有内部属性 [[Construct]] , 返回 true.
  • 返回 false.

7.2.5 IsExtensible (O)

这个抽象操作探测是否可以给O添加新属性,返回一个Boolean值,其步骤如下:

7.2.6 IsInteger ( argument )

这个抽象操作探测argument是否是有限的整数值.

  • 如果 Type(argument) 不是 Number, 返回 false.
  • 如果 argument 是 NaN, +∞, 或者 -∞, 返回 false.
  • 如果 floor(abs(argument)) ≠ abs(argument), 返回 false.
  • 返回 true.

7.2.7 IsPropertyKey ( argument )

这个抽象操作探测argument是否是属性键值.

  • 如果 Type(argument) 是 String, 返回 true.
  • 如果 Type(argument) 是 Symbol, 返回 true.
  • 返回 false.

7.2.8IsRegExp ( argument )

这个抽象操作步骤如下:

  • 如果 Type(argument)不是 Object, 返回 false.
  • 使 isRegExp为 Get(argument, @@match).
  • 如果 isRegExp 不是 undefined, 返回 ToBoolean(isRegExp).
  • 如果 argument 有 [[RegExpMatcher]] 这个内部属性, 返回 true.
  • 返回 false.

7.2.9 SameValue (x, y)

这个抽象操作步骤如下:

  • 如果 Type(x) 和 Type(y)不相同, 返回 false.
  • 如果 Type(x) 是 Number, 那么:
    • 如果 x 是 NaN 并且 y 是 NaN, 返回 true.
    • 如果 x 是 +0 并且 y 是 -0, 返回 false.
    • 如果 x 是 -0 并且 y 是 +0, 返回 false.
    • 如果 x 和 y 的值一样, 返回 true.
    • 返回 false.
  • 返回 SameValueNonNumber(x, y).

注意:这个算法和严格相等比较算法不同的地方就在于对0和NaN的处理方式上

7.2.10 SameValueZero(x, y)

这个抽象操作返回true或者false,其操作步骤如下:

  • 如果 Type(x) 和 Type(y)不同, 返回 false.
  • 如果 Type(x) 是 Number, 那么
    • 如果 x 是 NaN 并且 y 是 NaN, 返回 true.
    • 如果 x 是 +0 并且 y 是 -0, 返回 true.
    • 如果 x 是 -0 并且 y 是 +0, 返回 true.
    • 如果 x 和 y值相等,返回 true.
    • 返回 false.
  • 返回 SameValueNonNumber(x, y).

注意:SameValueZero 和 SameValue 不同之处就在于对 +0 和 -0的处理方式上.

7.2.11 SameValueNonNumber (x, y)

这个抽象操作中的x和y都不是Number,其执行步骤如下:

  • 断言: Type(x) 不是 Number.
  • 断言: Type(x) 和 Type(y)相同.
  • 如果 Type(x) 是 Undefined, 返回 true.
  • 如果 Type(x) 是 Null, 返回 true.
  • 如果 Type(x) 是 String, 那么
    • 如果 x 和 y 有同样的字符序列,长度也一样,那么返回 true; 否则返回 false.
  • 如果 Type(x) 是 Boolean, then
    • 如果 x 和 y 都为 true 或者都为 false, 返回 true; 否则返回 false.
  • 如果 Type(x) 是 Symbol, then
    • 如果 x 和 y 都是同一个Symbol值, 返回 true; 否则返回 false.
  • 如果x和y是同一个Object值,返回true,否则返回false

7.2.12 抽象关系比较

x<y这个比较的结果是true、false或者是undefined。如果其中至少有一个操作数是NaN,那么就返回undefined。这个算法还有一个布尔值标记的LeftFirst参数,这个标记是用来控制先处理哪边的操作数。ECMAScript规范是从左到右执行表达式的。LeftFirst默认值是true,意味着x是在y的左边。如果LeftFirst是false,那么久相反。这个比较操作的算法如下:

  • 如果 LeftFirst为 true, 那么
    • 使 px 为 ToPrimitive(x, hint Number).
    • 使 py 为 ToPrimitive(y, hint Number).
  • 如果顺序需要颠倒
    • 使 py 为 ToPrimitive(y, hint Number).
    • 使 px 为 ToPrimitive(x, hint Number).
  • 如果 px 和 py 都是 Strings, 那么:
    • 如果 py 是 px 的前缀, 返回 false. (p是q的前缀,意思就是说q是p和另一个字符串r拼成的,注意:任何字符串都可以是其自身的前缀,因为r可以为空字符串)
    • 如果 px 是 py 的前缀, 返回 true.
    • 使 k 为 最小的k,满足px[k] !== py[k].(只要px和py不是互相的前缀,那么一定存在这么一个k)
    • 使 m 为 px[k] 的数字值.
    • 使 n be py[k] 的数字值.
    • 如果 m < n, 返回 true. 否则, 返回 false.
  • Else,
    • 使 nx为 ToNumber(px). 因为px和py是原始值,所以操作顺序不重要了
    • 使 ny为 ToNumber(py).
    • 如果 nx 是 NaN, 返回 undefined.
    • 如果 ny 是 NaN, 返回 undefined.
    • 如果 nx 和 ny 是相同的 Number 值, 返回 false.
    • 如果 nx 是 +0 并且 ny 是 -0, 返回 false.
    • 如果 nx 是 -0 并且 ny 是 +0, 返回 false.
    • 如果 nx 是 +∞, 返回 false.
    • 如果 ny 是 +∞, 返回 true.
    • 如果 ny 是 -∞, 返回 false.
    • 如果 nx 是 -∞, 返回 true.
    • 如果nx的数值小于ny,此时nx和ny都是有限制并且非0,返回 true. 否则, 返回 false.

注意1:这里的第三步和12.8.3中的第七步不同的地方在于用了并且替换了或者

注意2:String之间的比较就直接使用了简单的字符值。没有用更加复杂的、语义化的字符定义或者Unicode规定的值。所以String值在Unicode中相等,在这里会不相等。实际上这个算法假定字符串都是规范化了的。并且字符串中追加的UTF-16序列的字符值可能和字符单元值不一样

7.2.13 抽象相等比较

比较操作 x == y,其执行过程如下:

  • 如果 Type(x) 和 Type(y)相等, 那么
    • 返回严格相等 x === y的结果.
  • 如果 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, 或者 Symbol, 并且 Type(y) 是 Object, 返回 x == ToPrimitive(y)的结果.
  • 如果 Type(x) 是 Object 并且 Type(y) 是 String, Number, 或 Symbol, 返回 ToPrimitive(x) == y 的结果.
  • 返回 false.

7.2.14 严格相等比较

比较操作 x === y,其执行过程如下:

  • 如果 Type(x) 和 Type(y) 不同, 返回 false.
  • 如果 Type(x) 是 Number, 那么
    • 如果 x 是 NaN, 返回 false.
    • 如果 y 是 NaN, 返回 false.
    • 如果 x 的值和 y 一样, 返回 true.
    • 如果 x 是 +0 并且 y 是 -0, 返回 true.
    • 如果 x 是 -0 并且 y 是 +0, 返回 true.
    • 返回 false.
  • 返回 SameValueNonNumber(x, y).

这个算法和 SameValue 算法不同的地方在于处理有符号的 0 和 NaN.

results matching ""

    No results matching ""