Javascript:空格字符串布尔转换

时间:2010-11-18 15:18:47

标签: javascript

在Javascript中:

!!" " == true // => true
" " == true // => false

if ("  " == true){a = 1;} else {a = 0;}
a; // => 0

if ("  "){b = 1;} else {b = 0;}
b; // => 1

关于这里发生了什么的任何想法?

3 个答案:

答案 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。

from MDC docs

  

如果两个操作数的类型不同,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)