【问题标题】:Why does 1 == 1 == 1, but not 'A' == 'A' == 'A' [duplicate]为什么1 == 1 == 1,而不是'A' =='A' =='A' [重复]
【发布时间】:2020-09-28 12:00:23
【问题描述】:

我正在尝试基于配置负载编写灵活的查询逻辑,例如:

{
 "test": "( fieldA == fieldB == fieldC )"
}

当我的应用用文本数据替换“fieldA”、“fieldB”和“fieldC”值时,结果始终为 false。 这显然与我混淆了 javascript 运行比较的方式有关(它必须与数据类型和数学排序有关),但谁能用一个简单的字母数字值示例来解释这一点?

例如'John Smith' == 'John Smith' == 'John Smith' 总是错误的;

【问题讨论】:

  • 开始比较布尔值和字符串(甚至是数字)是很奇怪的。这个逻辑的目标是什么?
  • 因为true == 1,但是true != 'John Smith'
  • 根本没有可比性,"( fieldA == fieldB == fieldC )" 永远是"( fieldA == fieldB == fieldC )" ...
  • 在任何语言中必须重写为fieldA == fieldB && fieldA == fieldC && fieldB == fieldC
  • 这是因为操作的顺序,所以('A' == 'A')true 所以如果你做了'A' == 'A' == true 你会得到真实的,但('A' == 'A') == 'A' 不是真实的,因为最后一个'A' 是不等于true...

标签: javascript string-comparison


【解决方案1】:

x == y == z 没有按照你的想法做:

它转换为(x == y) == z

使用 javascript 的 == 运算符的怪癖:

  • 1 == 1'A' == 'A' 都转换为 true
  • 但是:true == 1 返回 true,而 true == 'A' 不返回

您可能想将您的条件重写为:

(x == y) && (x == z)

并且很可能想要使用明确的=== 运算符:

(x === y) && (x === z)

为了避免您遇到的陷阱(true == 1 检查,但不是 true === 1

【讨论】:

    【解决方案2】:

    A==B==C 或 A==A==A 是合法允许的。

    但问题是,A==C 永远不会发生,或者在您的情况下 fieldA==fieldC 永远不会发生。因此,这会导致歧义

    【讨论】:

      猜你喜欢
      • 2011-09-07
      • 2017-01-30
      • 1970-01-01
      • 2021-10-21
      • 2011-12-04
      • 1970-01-01
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多