在Javascript中:
!!" " == true // => true
" " == true // => false
if (" " == true){a = 1;} else {a = 0;}
a; // => 0
if (" "){b = 1;} else {b = 0;}
b; // => 1
关于这里发生了什么的任何想法?
答案 0 :(得分:3)
让我们逐步完成您的示例:
!!" " == true // => true
你已经通过否定它将字符串“”转换为布尔值。当转换为布尔值时,具有非零长度的字符串将评估为true,因此将其否定两次会导致布尔值为true。 true == true
显然。此示例不会导致第二个参数转换为字符串,因为一元!
运算符的优先级高于==
运算符,因此在评估==
运算符时,两者都是操作数是相同的类型(布尔值)。
" " == true // => false
Per Mozilla docs(patrick dw's answer中显示的相关部分),如果操作数是数字或布尔值,则两个操作数都将转换为数字。你最终得到0 == 1
,这是假的。
在这种情况下,我相信第二个参数被强制转换为字符串。你实际上在做 " " == "true"
,这是假的。这是字符串的比较,而不是字符串和布尔值的比较。
if (" " == true){a = 1;} else {a = 0;}
这与前一个相同:一个操作数是布尔值,因此两个值都转换为数字。
if (" "){b = 1;} else {b = 0;}
这与第一个相同。该字符串被强制转换为布尔值。该字符串具有非零长度,因此它返回true。
答案 1 :(得分:2)
从ECMAScript 5中的 9.3.1 部分开始,关于将字符串转换为数字:
StringNumericLiteral为空或仅包含空格,将转换为+0。
如果两个操作数的类型不同,JavaScript会转换操作数,然后应用严格比较。如果操作数是数字或布尔值,操作数将尽可能转换为数字;否则,如果任一操作数是一个字符串,则另一个操作数将转换为字符串(如果可能)。
因此,由于字符串与布尔值进行比较,因此尝试将其转换为数字。由于空字符串或仅包含空格的字符串转换为0
,因此它将被视为错误。
" " == false; // true
" " == 0; // true
"false" == false; // false because "false" can't be converted to a number
所以当你这样做时:
!!" "
您不再依赖==
为您做转换。相反,您将使用自己的条件手动转换它,即不将其转换为数字,而是在==
发生之前将其转换为布尔值。
所以你正在做true == true
或者实际上1 == 1
。
要查看仅将空格转换为数字的字符串,请使用这样的一元+
运算符:
alert( +" " ); // alerts 0
答案 2 :(得分:0)
长度等于值true的字符串。 对Boolean的字符串求值为false,因为它们的数据类型不同。
双!!
是一种非假操作用法。
所以你说:
“”== false - > false == false - > true == true
故障:
(!(!" ") == true)
(!(false) == true)
(true == true)
(true)