在javascript中,空字符串作为布尔值总是假的吗?

IT技术 javascript string boolean
2021-02-12 17:07:17

在 JavaScript 中,

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

var b将被设置为false

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

6个回答

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

布尔值

如果参数是空字符串(其长度为零),则结果为假;否则结果为真

引自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)不会。
2021-03-30 17:07:17
Aaaa 已经解决了
2021-04-13 17:07:17

是的。所有false, 0, 空字符串''"", NaN, undefined, 和null总是被评估为false其他一切都是true

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

nullfalse,没有truenullnulljsfiddle.net/sq1Lkpg0
2021-03-24 17:07:17
@Bruno,您可以使用NaN执行相同的测试undefined他们不是,false但他们是假的。这是什么被问到的。
2021-03-31 17:07:17

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

varb将设置为true.

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

如上所述,yes,这是条件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的力图将其转换为数字,根据自己的value,(使用 操作的标准要求ToNumberToPrimitive),然后在内部适用===但是当您===直接使用时,类型不会转换,因此将 String 与 Boolean 进行比较总是false.

粗略地说,JavaScript条件( ToBoolean ) 测试定义的、非空、非零、非空、非假值(空字符串是...空,数字 -0 或 +0 是...零,NaN 不是一个定义的数字,但一个空的 Object 显然不是真的空),或者像我想的那样,条件测试一个(真)事物,同时==比较明显的、仔细转换的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

起初我想,“pssh,这太过分了,这已经得到了很好的回答。” 但那是很好的介绍和信息。谢谢。
2021-03-21 17:07:17

var b将被设置为true这是因为空字符串在 JavaScript 中被视为“falsey”值,其他一些值也是如此。

请查看http://www.sitepoint.com/javascript-truthy-falsy/以获取虚假值

你的答案是错误的。var b实际上将被设置为true因为它与var a如果您查看代码相反
2021-03-20 17:07:17
@bombek 谢谢 - 我会更新的。看起来原始问题在我回答后被编辑(值被交换了)
2021-03-30 17:07:17
问题中有如此多的编辑,它又是相反的。
2021-04-14 17:07:17

可以转换为 false 的表达式示例包括计算结果为 null、0、空字符串 ("") 或 undefined 的表达式。(参见MDN 参考