在JavaScript中,空字符串作为布尔类型值始终为false吗?

175

在JavaScript中,

var a = '';
var b = (a) ? true : false;

var b 将被设置为false

这是一个可以依赖的已定义行为吗?


你确定吗?我在这里得到了 false:http://jsfiddle.net/8CKbd/ - anubhava
我更进一步了。带空格的字符串为true。if (' ') {console.log('!')} 但 ' ' == 0 也为true。 - Azat
2
我认为@JonH的修改是错误的,空字符串''在布尔上下文中被评估为false,因此如果a = '';,那么a?false:true =>''?false:true => false?false:true => true(因为这是对false值的评估)。我认为应该是var b = (a) ? true : false;才能正确地与下一条语句匹配。 - PhoneixS
@PhoneixS编辑,希望现在更有意义了。 - SwissCoder
1
@SwissCoder,不是代码不可读,而是输出了另一个答案。现在我已经纠正了它。 - PhoneixS
@PhoneixS 完美!抱歉在编辑时自己混淆了 :D - SwissCoder
6个回答

249

1
好的,就这么定了。 - Anthony
48
有一个要注意的地方,就是new String("")是真值(truthy),这是因为它是一个对象,而短形式""表示基本数据类型。同样的情况也适用于new Number(0)和甚至new Boolean(false)。这是不使用对象版本在你的代码中的一个好理由,这意味着if (str.length)可以处理这种边缘情况,而if (str)则不能。 - Chris Middleton

67

是的,所有false0、空字符串''""NaNundefinednull总是被评估为false;其他所有东西都是true

在你的例子中,b在评估后是false。(我认为你错误地写成了true


2
null 不是 false,也不是 truenull 就是 null。https://jsfiddle.net/sq1Lkpg0/ - Bruno Finger
12
@Bruno,你可以使用“NaN”和“undefined”执行相同的测试。它们不是“false”,但它们是falsy(伪造的值)。这就是被问到的内容。 - Joseph

17

var a = '';
var b = (a) ? false : true;   // fixed!
console.log(b);               // => true

变量 b 将被设置为 true

这是一种可靠的定义行为吗?

如上所述,是的,在条件语句(if 表达式、||&&? : 等)中,空字符串的定义行为是如此。 (标准 中说必须应用内部的 ToBoolean 操作。)

当空字符串用于比较时(请参阅 Truth, Equality and JavaScript),评估是不同的,即使结果大多相同

// conditional (note: evaluation to false prints false here!)
console.log('' ? true : false); // zero length     => false

// comparisons
console.log('' == true);        // +0 === 1        => false
console.log('' == false);       // +0 === +0       => true
console.log('' === true);       // different types => false
console.log('' === false);      // different types => false

解释:基本上,当==的操作数具有不同类型时,JavaScript会尝试根据它们的将它们转换为数字(使用 标准调用ToNumberToPrimitive操作),然后在内部应用===。但是,当您直接使用===时,类型不会被转换,因此将字符串与布尔值进行比较始终为false

粗略地说,JavaScript 的条件语句(ToBoolean)测试一个已定义、非空、非零、非假值(空字符串是...空的,数字-0或+0是...零,NaN不是一个定义的数字,但一个空对象显然不是真正的空),或者像我想的那样,条件语句测试一个(真实的)东西,而 == 比较其操作数的表面上、经过仔细转换的值(ToPrimitive、ToNumber),=== 则寻找完全相同。
if (X) {}        // is X a (true) thing?
if (X == Y) {}   // are the values of X and Y same-ish?
if (X === Y) {}  // are X and Y exactly the same?

《真相、平等和JavaScript》中有更多的例子,这种区别非常重要,例如,在条件语句中'0'为真(长度不为零,或者说它是一个东西),但在==比较中为假(值为零)。而'1'则在两种情况下都为真(它是一个东西并且具有非零值)。

console.log('' ? true : false);   // zero length     => false
console.log('' == true);          // +0 === 1        => false
console.log('0' ? true : false);  // non-zero length => true
console.log('0' == true);         // +0 === 1        => false
console.log('1' ? true : false);  // non-zero length => true
console.log('1' == true);         //  1 === 1        => true


1
起初我想,“嘘,这太过了,这个问题已经得到了很好的回答。” 但是那个回答呈现得非常好,也很有启发性。谢谢。 - Marc L.

9

你的答案是错误的。如果你看代码,var b 实际上会被设置为 true,因为它是 var a 的相反值。 - bombek
@bombek 谢谢 - 我会更新的。看起来原问题在我的回答之后被编辑了(值被交换了)。 - Jonathon Bolster
问题中有太多的编辑,又变回了原来的样子。 - Carl Kroeger Ihl

5

可以转换为false的表达式示例包括:评估为null、0、空字符串("")或未定义的表达式。 (请参见MDN参考文档


3

是的,你可以依赖于这种行为。

更短写法如下:

var b = !!a;

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