当我发现==-
或==+
时,我正在尝试不同的条件
在 JS 控制台中,您可以编写:
var a = " ";
那么以下情况是正确的
a == " ";
但这是错误的
a == " ";
但是,如果您说:
a ==- " ";
或
a ==+ " ";
那么这个漂亮的==-
运算符是什么?
它们不是不同的运算符。
写作:
a ==- " ";
解析为:
(a) == (-" ");
==+
也是如此.
由于 Javascript 奇怪的类型转换规则,表达式的计算结果为 true
。将发生类似以下情况:
- 一元
-
(或+
(运算符将其操作数转换为数字。如果是空字符串,则此转换的结果为0
。 - 然后
a == (-" ")
等效于" " == 0
。如果与==
相比的类型不同,则转换一个(可能两个(以获取通用类型。在这种情况下,左侧的" "
也会转换为0
。 - 你最终将
0
与0
进行比较,这会产生true
。
(以上是Javascript如何得出这个结果的粗略例子,实际的规则隐藏在ECMAScript规范中。您可以改用 ===
运算符来阻止转换,并在比较对象的类型不同时获取false
。
它只是一个==
后跟一个-
(或+
(。
(在下文中,我写"<four spaces>"
表示由四个空格组成的字符串。
也就是说,如果你做" " ==- "<four spaces>"
,你把" "
比作-"<four spaces>"
。 -"<four spaces>"
的计算结果为 0
,因为应用减号转换为整数。因此,您实际上执行 " " == 0
,这是正确的,因为它将" "
转换为整数进行比较。
但是," " == "<four spaces>"
是错误的,因为您正在比较两个不同的字符串。
这不是运算符。您得到这些结果是因为-
和+
将字符串转换为数字,在这种情况下,空字符串将转换为数字0
然后解释为false
,加上等于运算符==
会导致比较和强制转换的一些麻烦,这就是为什么建议始终使用 ===
运算符,您将获得所需的结果:
console.log(a === ' '); // true
console.log(a === ' '); // false
console.log(a === -' '); // false
console.log(a === +' '); // false