【问题标题】:Explain how JavaScript converts type implicitly when both types are not equal? [duplicate]解释当两种类型不相等时 JavaScript 如何隐式转换类型? [复制]
【发布时间】:2019-03-20 12:17:55
【问题描述】:

运算符右侧是否强制转换为左侧类型?

number == string -> number == number

双方是否都转换为相同的底层类型,比如数字?

boolean == string -> number == number

每个运营商*-/+||&&%有不同的规则吗??

我查看了其他不清楚且令人困惑的问题/答案。

【问题讨论】:

  • 转换成什么类型​​有关系吗?重要的是 == 标准化为可比较的类型。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 这很重要...@AvinKavish 例如,要知道这是否正确,您需要知道发生了什么,例如首先将值转换为什么。 fasle == "0" 如果它们首先被转换为数字,那么它是真的 0 == 0 否则它们被转换为布尔值那么它是 false == true 因为字符串是真的
  • @AvinKavish——是的,请参阅Abstract Equality Comparison algorithm
  • 好吧,我明白了,这对我来说从来都不是问题,因为我总是使用严格比较和显式类型转换。
  • 如果您总是阅读自己的代码,那没关系,如果您正在阅读其他人的代码,那么您最终会遇到使用== 的情况。面试中也会问这个问题

标签: javascript


【解决方案1】:

当比较中涉及到类型转换(即非严格比较)时,JavaScript 将 String、Number、Boolean 或 Object 操作数的类型转换如下:

  • 比较数字和字符串时,字符串转换为 数值。 JavaScript 尝试将字符串转换为数字 字面量为数字类型值。首先,一个数学值是 从字符串数字文字派生。接下来,这个值被四舍五入 到最接近的数字类型值。

  • 如果其中一个操作数是布尔值,则转换布尔操作数 如果为真则为 1,如果为假则为 +0。

  • 如果将对象与数字或字符串进行比较,JavaScript 会尝试 返回对象的默认值。运营商试图 将对象转换为原始值、字符串或数字值, 使用对象的 valueOf 和 toString 方法。

  • 如果转换对象的尝试失败,则会出现运行时错误 生成。请注意,如果对象被转换为原始对象,并且 仅当它的比较对象是原始对象。如果两个操作数都是对象, 它们作为对象进行比较,只有当两者都引用同一个对象时,相等性测试才为真。

【讨论】:

    【解决方案2】:

    == 在进行比较之前将操作数转换为相同的类型。

    对于关系抽象比较(例如,

    使用 Unicode 值根据标准字典顺序比较字符串。

    阅读source 了解更多信息

    【讨论】:

      【解决方案3】:

      http://ecma-international.org/ecma-262/8.0/#sec-abstract-equality-comparison

      https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence

      比较 x == y,其中 x 和 y 是值,产生真或假。这样的比较是这样进行的:

      1. 如果 Type(x) 与 Type(y) 相同,则返回执行严格等式比较 x === y 的结果。

      2. 如果 x 为空且 y 未定义,则返回 true。如果 x 未定义且 y 为空,则返回 true。

      3. 如果 Type(x) 是 Number 并且 Type(y) 是 String,则返回比较结果x == ToNumber(y)

      4. 如果 Type(x) 是 String,Type(y) 是 Number,则返回比较结果Number(x) == y

      5. 如果 Type(x) 为布尔值,则返回比较结果ToNumber(x) == y

      6. 如果 Type(y) 为布尔值,则返回比较结果x == ToNumber(y)

      7. 如果 Type(x) 是字符串、数字或符号且 Type(y) 是 Object,则返回比较结果 x == ToPrimitive(y)

      8. 如果 Type(x) 是 Object 并且 Type(y) 是字符串、数字或符号,则返回比较结果 ToPrimitive(x) == y。返回 false。

      【讨论】:

        【解决方案4】:

        规则在Abstract Equality Comparison algorithm中给出。

        运算符右侧是否强制转换为左侧类型?

        number == string -> number == number
        

        第四步:如果Type(x)是Number,Type(y)是String,返回比较结果x == ToNumber(y)

        是的。

        双方是否都转换为相同的底层类型,例如数字?

        boolean == string -> number == number
        

        第六步:如果Type(x)是布尔值,返回比较结果ToNumber(x) == y

        它给出了不同的类型(数字和字符串),所以它转到第 4 步:number == ToNumber(y)

        所以再次是的。

        每个运算符*-/+||&&%有不同的规则吗??

        其他运算符可能会强制计算表达式的结果,所以我猜“是”。阅读ECMA-262#expressions的相关部分。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-04-24
          • 1970-01-01
          • 1970-01-01
          • 2020-04-19
          • 2020-07-28
          • 2014-08-01
          • 2011-10-19
          • 2016-09-24
          相关资源
          最近更新 更多