当我发现==-
或==+
时,我在尝试不同条件时遇到了绊脚石。
在JS控制台中,您可以写:
var a = " ";
然后以下是真的
a == " ";
但这是假的
a == " ";
但是,如果你这样说:
a ==- " ";
或
a ==+ " ";
那么这个漂亮的==-
运算符是什么?
答案 0 :(得分:9)
他们不是独特的运营商。
写作:
a ==- " ";
被解析为:
(a) == (-" ");
==+
同样如此。
由于Javascript的怪异类型转换规则,表达式的计算结果为true
。发生以下情况:
-
(或+
)运算符将其操作数转换为数字。如果它是空白字符串,则此转换的结果为0
。a == (-" ")
则等同于" " == 0
。如果与==
进行比较的类型不同,则将其中一个(可能两者)转换为获得通用类型。在这种情况下,左侧的" "
也会转换为0
。0
与0
进行比较,结果为true
。(以上是Javascript可能会出现此结果的粗略示例,actual rules隐藏在ECMAScript specification中。您可以使用===
运算符来阻止转换如果比较对象的类型不同,则获取false
。)
答案 1 :(得分:3)
只需==
后跟-
(或+
)。
(在下文中,我写"<four spaces>"
表示由四个空格组成的字符串。)
也就是说,如果您执行" " ==- "<four spaces>"
,则会将" "
与-"<four spaces>"
进行比较。 -"<four spaces>"
评估为0
,因为将减号转换为整数。因此,你实际上做" " == 0
,这是真的,因为它将" "
转换为整数进行比较。
" " == "<four spaces>"
是错误的,因为您正在比较两个不同的字符串。
答案 2 :(得分:1)
那不是运营商。您得到这些结果是因为-
和+
正在将字符串转换为数字,在这种情况下,空字符串会转换为数字0
,然后将其解释为false
加上等于运算符==
会导致比较和转换出现问题,这就是为什么建议总是使用===
运算符,然后你会得到你想要的结果:
console.log(a === ' '); // true
console.log(a === ' '); // false
console.log(a === -' '); // false
console.log(a === +' '); // false