Javascript 为什么1==1==1,而不是';A';==';A';==';A';

Javascript 为什么1==1==1,而不是';A';==';A';==';A';,javascript,string-comparison,Javascript,String Comparison,我正在尝试基于配置负载编写灵活的查询逻辑,例如: { "test": "( fieldA == fieldB == fieldC )" } 当我的应用程序用文本数据替换“fieldA”、“fieldB”和“fieldC”值时,结果总是错误的。 这显然与我混淆javascript运行比较的方式有关(它必须与数据类型和数学顺序有关),但是有人能用一个简单的字母数字值示例来解释这一点吗 e、 “约翰·史密斯”总是假的 法律允许A==B==C或A==A==A

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

{
 "test": "( fieldA == fieldB == fieldC )"
}
当我的应用程序用文本数据替换“fieldA”、“fieldB”和“fieldC”值时,结果总是错误的。 这显然与我混淆javascript运行比较的方式有关(它必须与数据类型和数学顺序有关),但是有人能用一个简单的字母数字值示例来解释这一点吗


e、 “约翰·史密斯”总是假的

法律允许A==B==C或A==A==A


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

x==y==z
不符合您的想法:

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

javascript的
==
操作符的怪癖:

(x === y) && (x === z)
  • 1==1
    A'==A'
    都转换为
    true
  • 但是:
    true==1
    返回true,而
    true==A'
    不返回true

您可能希望将条件重写为:

(x == y) && (x == z)
并且很可能希望使用明确的
===
运算符:

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

要避免您遇到的陷阱(
true==1
检查,而不是
true==1

将布尔值与字符串(甚至数字)进行比较一开始就很奇怪。这个逻辑的目标是什么?因为
true==1
,但是
true!='约翰·史密斯的
根本没有可比性,
(fieldA==fieldB==fieldC)
总是
(fieldA==fieldB==fieldC)
…在任何需要重写为
的语言中,fieldA==fieldB&&fieldA==fieldC&&fieldB==fieldC
这是因为操作顺序,所以
('A'==A'))
这是
真的
所以如果你做了
'A'='A'==true
你会得到真的,但是
('A'='A')=='A'
不是真的,因为最后一个
'A'
不等于
真的
。。。