zoukankan      html  css  js  c++  java
  • 类型转换

    []==![]
    这个问题我想大家并不陌生。
    我在这根据ecma规定来分析下这个运算过程的原理。
    根据ecma--11.9.1

    1 A==B 运算的顺序如下
    1.Evaluate A.
    2.Call GetValue(Result(1)).
    3.Evaluate B.
    4.Call GetValue(Result(3)).
    5.Perform the comparison Result(4) == Result(2). (see 11.9.3).
    6.Return Result(5).

    []==![]=>计算A和B的值,取到A和B的真实值。[]=>[] . ![]=>false.  false==[],运算过程如下。ecma--11.9.3

    2 11.9.3 The Abstract Equality Comparison Algorithm
    The comparison x == y, where x and y are values, produces true or false. Such a comparison is performed as follows:
    1.If Type(x) is different from Type(y), go to step 14.
    2.If Type(x) is Undefined, return true.
    3.If Type(x) is Null, return true.
    4.If Type(x) is not Number, go to step 11.
    5.If x is NaN, return false.
    6.If y is NaN, return false.
    7.If x is the same number value as y, return true.
    8.If x is +0 and y is -0, return true.
    9. If x is -0 and y is +0, return true.
    10. Return false.
    11.If Type(x) is String, then return true if x and y are exactly the same sequence of characters (same length and same characters in corresponding positions). Otherwise, return false.
    12. If Type(x) is Boolean, return true if x and y are both true or both false. Otherwise, return false.
    13.Return true if x and y refer to the same object or if they refer to objects joined to each other (see 13.1.2). Otherwise, return false.
    14. If x is null and y is undefined, return true.
    15. If x is undefined and y is null, return true.
    16.If Type(x) is Number and Type(y) is String, return the result of the comparison x == ToNumber(y).
    17.If Type(x) is String and Type(y) is Number, return the result of the comparison ToNumber(x)== y.
    18. If Type(x) is Boolean, return the result of the comparison ToNumber(x)== y.
    19. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
    20.If Type(x) is either String or Number and Type(y) is Object, return the result of the comparison x == ToPrimitive(y).
    21.If Type(x) is Object and Type(y) is either String or Number, return the result of the comparison ToPrimitive(x)== y.
    22. Return false.
    根据18,false=>0   ,   0==[] ?
    根据20,取[]的原始值

    3 对象的原始值 的计算 ecma--9.1
    Object Return a default value for the Object. The default value of an object is retrieved by calling the internal [[DefaultValue]] method of the object, passing the optional hint PreferredType. The behaviour of the [[DefaultValue]] method is defined by this specification for all native ECMAScript objects (8.6.2.6).

    ecma--8.6.2.6
    1. Call the [[Get]] method of object O with argument "valueOf".
    2. If Result(1) is not an object, go to step 5.
    3. Call the [[Call]] method of Result(1), with O as the this value and an empty argument list.
    4. If Result(3) is a primitive value, return Result(3).
    5. Call the [[Get]] method of object O with argument "toString".
    6. If Result(5) is not an object, go to step 9.
    7. Call the [[Call]] method of Result(5), with O as the this value and an empty argument list.
    8. If Result(7) is a primitive value, return Result(7).
    9. Throw a TypeError exception.

    []的转换过程如下

    1这里首先 [].[[Get]](valueOf)。
    2valueOf是一个函数对象
    3valueOf.call([])===他自己
    4他自己不是一个原始值
    5[].[[Get]](toString)
    6toString是一个函数对象
    7toString.call([])===""
    8空字符串""是一个原始值,被返回
    所以[]的原始值=“”  . []=>""

    然后根据2中16条,空字符串""转换成0.[]=>""=>0
    这样0==0就true了。

  • 相关阅读:
    WebService-.Net:添加web引用和添加服务引用有什么区别?
    袁氏-人物-科学家:袁隆平(首届国家最高科学技术奖得主、杂交水稻之父)
    术语-BLOB:BLOB
    术语-PM:PM/项目管理 百科
    计算机:SAP (服务访问点(Service Accessing point))
    服务器-Web服务器-Tengine:Tengine 百科
    笔记-Git:Git 笔记
    DB-MDM:MDM/主数据管理 百科
    DB-MD:MD/主数据
    [Ext JS 4] 实战之 带week(星期)的日期选择控件
  • 原文地址:https://www.cnblogs.com/lunalord/p/2030839.html
Copyright © 2011-2022 走看看