在javascript中,一个空字符串总是false作为布尔值?

cc *_*ung 126 javascript string boolean

在javascript中,

var a = '';
var b = (a) ? false : true;   // fixed!
Run Code Online (Sandbox Code Playgroud)

var b将被设置为false.

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

小智 177

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

ToBoolean

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

报价取自http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

  • 有一点需要注意:`new String("")`是真的!这是因为它是一个对象,而简短形式"""表示原始值版本."new Number(0)"甚至"new Boolean(false)"也是如此.这是一个很好的理由不在代码中使用对象版本,它确实意味着`if(str.length)`处理这种边缘情况,而`if(str)`则不会. (23认同)

Hos*_*ein 54

是.所有false,0空弦''"",NaN,undefined,和null总是评价为false; 其他一切都是true.

在您的示例中,b是false在评估之后.(我想你错误地写了true)

  • @Bruno,您可以使用`NaN`和`undefined`执行相同的测试.他们不是"假",但他们是假的.这就是问的问题. (7认同)
  • `null`不是'false`,'true`,`null`都不是`null`.https://jsfiddle.net/sq1Lkpg0/ (2认同)

Ora*_*afu 10

var a = '';
var b = (a) ? false : true;   // fixed!
console.log(b);               // => true
Run Code Online (Sandbox Code Playgroud)

var b将设置为true.

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

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

在比较中使用空字符串时(参见真值,等式和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
Run Code Online (Sandbox Code Playgroud)

说明:从本质上讲,当操作数==有不同的类型,JavaScript的力图将其转换为数字,根据自己的价值,(使用 操作标准调用ToNumberToPrimitive),然后在内部适用===.但是当你===直接使用时,类型不会被转换,所以总是将String与布尔值进行比较false.

粗略地说,JavaScript 条件(ToBoolean)测试定义的,非null,非零,非空,非假值(空String是......空,Numbers -0或+ 0是......零,NaN不是一个定义的数字,但是一个空的Object显然不是真的空的,或者我想,条件测试一个(真)的东西,同时==比较明显的,精心转换的(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?
Run Code Online (Sandbox Code Playgroud)

还有更多的例子真相,平等和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
Run Code Online (Sandbox Code Playgroud)


Jon*_*ter 8

var b将被设置为true.这是因为空字符串在JavaScript中被计为"falsey"值,其他值也是如此.

请查看http://www.sitepoint.com/javascript-truthy-falsy/了解虚假值


Mar*_*rth 5

可转换为false的表达式示例包括求值为null,0,空字符串("")或未定义的表达式.(参见MDN参考)