在javascript中,空字符串是否始终为布尔值false?


134

在javascript中

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

var b将设置为false

这是可以依靠的明确行为吗?


您确定吗,我要到达false这里:jsfiddle.net/8CKbd
anubhava'1

我更进一步了。带空格的字符串为true。if(''){console.log('!')},但''== 0为true。
2015年

2
我认为@JonH版本是错误的,''在布尔上下文中,空字符串被评估为false,所以如果a = '';那么a ? false : true=> '' ? false : true=> false ? false : true=> true(因为是对假值的评估)。我认为var b = (a) ? true : false;下一条声明应该是正确的。
–'PhoneixS

@PhoneixS已编辑,希望现在更有意义。
SwissCoder

1
@SwissCoder不是不是不可读,而是输出另一个答案。现在我已更正它。
PhoneixS

Answers:


191

是。Javascript是ECMAScript的方言,而ECMAScript语言规范明确定义了这种行为:

布尔型

如果参数为空String(长度为零),则结果为false;否则,结果为false。否则结果为真

引用摘自http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf


Aaaaand已定居
安东尼

28
一个警告是,这new String("")是事实!这是因为它是一个对象,而缩写形式""表示原始值版本。同样new Number(0),甚至new Boolean(false)。在代码中不使用对象版本是一个很好的理由,这确实意味着可以if (str.length)处理这种边缘情况,而if (str)不会。
克里斯·米德尔顿

54

是。所有false0空弦''""NaNundefined,和null总是评价为false; 其他的一切都是true

在您的示例中,b是false经过评估的。(我认为你写错了true


2
nullfalse,没有truenullnulljsfiddle.net/sq1Lkpg0
Bruno Finger

7
@Bruno,您可以使用NaN和进行相同的测试undefined。他们不是,false但他们是虚假的。问的是哪一个。
约瑟夫

11

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

var b将设置为true

这是可以依靠的明确行为吗?

如以上回答,,这是所定义的一个空字符串的行为在条件(一if式,||&&? :,...)。(标准说必须使用内部ToBoolean操作。)

在比较中使用空字符串时,评估结果是不同的(请参见Truth,Equality和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),然后在内部适用===。但是,当您===直接使用时,类型不会转换,因此将String与Boolean进行比较始终是false

粗略地说,JavaScript 条件ToBoolean)测试定义的,非空,非零,非空,非假值(一个空String为...空,数字-0或+0为...零,NaN不是一个定义的数字,但是一个空的Object显然不是真的为空),或者正如我想的那样,对(true)事物进行条件测试,同时比较经过仔细检查表观ToPrimitiveToNumber)其操作数,并寻找完全相同的内容=====

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'true在有条件(非零长度,或者,它是一个东西),但false在一个==比较(该是零)。'1'同样,true在两种情况下都是这样(这是事物,并且具有非零值)。

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
一开始我以为,“ pssh,那太过分了,这已经得到了很好的回答。” 但这是很好的表述和有益的信息。谢谢。
Marc L.


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.