为什么1===1===1是错误的?

35
在浏览器控制台中,输入1===1会被计算为true。输入1===1===1会被计算为false
我认为这是由于语句的计算方式所致: 1 === 1 === 1 变成了 (1 === 1) === 1 这将计算为 true === 1 这是false
这个解释正确吗?如果不是,这种行为的真正原因是什么?

5
实际上,运算是从左向右解析的。因此 1 === 1 === 1 被计算为 (1 === 1) === 1,而不是 1 === (1 === 1)。在这种情况下,显然没有任何区别。 - Guilherme Sehn
谢谢 - 我已经更新了答案以反映这一点 :) - shauneba
感谢所有提供信息的答案。我本来就怀疑这是推理,但得到确认还是很好的。 - shauneba
5个回答

43

没错,你说得对。这里有两个相等性检查,它们具有相同的运算符优先级。第一个首先被评估,然后其结果应用于下一个相等性检查。

1===1===1(1===1)===1相同,这是true===1,这是false,因为在此处您按值和类型进行检查。1==1==1将得出true,因为它仅按值检查相等性,所以1==1==1等于(1==1)==1等于true==1等于true


20
=== 操作符不仅测试相等性,还测试类型相等性。由于整数不是布尔值,因此 true === 1 的结果为 false。
比较:
true == 1; // true
true === 1; // false

示例


3
因为相等运算符是从左往右结合的,所以true === 1是成立的。但true === 1 === 1 // false,而1 === 1 === true // true - Tibos
@Tibos:没错,但这并不改变答案的观点。true == 1仍然为真,而true === 1仍然为假。 - David
1
是的,答案的内容完全准确,但与问题相关时它是具有误导性的。感谢您的编辑! - Tibos

3

正确行为。由于

1===1 // value is true

但是
true===1 // it's false

这有两个原因:

  1. true 是布尔类型,而 1 是整数类型。
  2. 简单来说,1 不等于 true。

因此

1===1===1 // false

点2)取决于浏览器的实现。例如,在 C 中,没有“Boolean”类型,而是使用整数,其中 0 表示 false,任何其他值表示 true,因此数字 1 确实等于“true”。因此 1==true简而言之,在某些实现中,1 和 true 的唯一区别在于它们的类型不同。 - 11684
@11684 - 它不依赖于浏览器的实现,而是依赖于规范的正确实现。这是JavaScript,不是C语言,而且boolean不是数字类型(尽管根据规范,如果使用==运算符而不是===运算符,则可能会进行类型强制转换)。 - Ted Hopp
在 C 语言中没有布尔类型,通常使用整数作为布尔值,其中 0 自动评估为 false,任何其他整数值则为 true。JavaScript 大多是解释执行的,因此浏览器会本地执行这样的比较。 - 11684

2

您提到的行为是正确的。

这是因为===基于类型和值进行匹配。 true === 1不匹配类型,但true == 1基于值进行匹配。


这是 true === 1,因为相等运算符是左结合的。 - Tibos
抱歉,我的错。我知道它是左结合的 :) - Pratik
5
您可以编辑您的答案以改进它(或者如果您认为您无法为潜在的未来读者添加价值,则删除它)。 - Tibos

-2

如果 1==1==1 那么它将是真的


== 会改变参数类型,而 === 不会。 - microbingbing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接