为什么在JS中true * true === 1?

4

在学习《JavaScript语言精粹》并且在node中测试时,我想知道为什么会出现这种行为。我知道!表示“逻辑非”操作符,而!!基本上将!x的返回值布尔化,但是为什么要这样做呢?

var x = 3, y = 4;

x != y;     // true
x = !y      // false ----> But really, its setting x to "not y", a truthy value, correct
x = !!x*x   // 1 --- wut?

经过一番尝试,我理解声明的是:“x等于非非x(因为!x === false而被视为“true”)乘以x(true)”。

所以我的疑问是,在JS中为什么true * true === 1?


1
我得到的是 x = 0 而不是 1,http://jsfiddle.net/55128e39/ - Musa
你应该能够询问 true * true 并得到 1,或者 false * false 并得到 0。 - newswim
你是不是想说 !!(x*x) - Bergi
通过跟随您的引导,我学到了以下内容...x = 5 //5 x*x //25 !(x*x) //false !!(x*x) //true (!!(x*x)) //true !(!!(x*x)) //false !!(!!(x*x)) //true 等等...显然,您可以无限地翻转二进制值,但我认为这个教训是这样的; 逻辑非语句将引发一种不完全明显的类型强制转换。 - newswim
2个回答

4
* 操作符会将 true 强制转换为 1,用于计算乘法,因此 1 * 1 === 1

2
根据ECMAScript 2015:应用乘法运算符的规定进行正确操作。;-) - RobG

1
虽然 false 是 0 的位值,True 是 1 的位值。所以我相信你问的是为什么 1 * 1 = 1?希望这解释得足够清楚了。

酷,谢谢!这种行为是源自另一种语言吗?在JS中强制转换似乎非常普遍。 - newswim
1
@newswim 这很可能存在于几乎所有其他弱类型语言中。 - zerkms
1
它在许多编程语言中表示为true = 1。无论您在何处使用布尔表达式,它都会归结为真为1,假为0。但不要将其与二进制混淆,因为它并不是二进制。在SQL中,您将看到使用“BIT”,并且真/假声明为1或0。这样做的好处是,“BIT”值每个记录只需要1位内存。VARCHARs需要“FALSE”作为最大值,并且每个字段为2位/字符,总计10位。直到您需要处理可能只需1位而不是10位的2亿条记录时,才会占用大量内存。 - Mike Horstmann
如何表示真和假在内部是无关紧要的,重要的是 * 运算符将其参数强制转换为数字,并且 true 转换为 1。 - RobG
由于True最初是1的“别名”,因此在Python中也可以使用@newswim。 - knight

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