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

Posted

技术标签:

【中文标题】在javascript中,空字符串总是作为布尔值是假的吗?【英文标题】:In javascript, is an empty string always false as a boolean? 【发布时间】:2012-01-31 08:30:16 【问题描述】:

javascript 中,

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

var b 将设置为 false

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

【问题讨论】:

你确定吗,我在这里收到false:jsfiddle.net/8CKbd 我更进一步。带空格的字符串为真。 if (' ') console.log('!') 但 ' ' == 0 为真。 我认为@JonH 版本是错误的,空字符串'' 在布尔上下文中被评估为false 所以如果a = ''; 然后a ? false : true => '' ? false : true => false ? false : true => true(因为是对错误值的评估)。我认为下一条语句应该是var b = (a) ? true : false; @PhoneixS 已编辑,希望现在更有意义。 @SwissCoder 不是不可读,而是输出另一个答案。现在我已经更正了。 【参考方案1】:

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

更短的写法是:

var b = !!a;

【讨论】:

【参考方案2】:

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

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

【讨论】:

你的回答错了。 var b 实际上将设置为 true,因为如果您查看代码,它与 var a 相反。 @bombek 谢谢 - 我会更新的。看起来原始问题是在我回答后编辑的(交换了值) 问题的编辑太多了,又是反过来。【参考方案3】:

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

var b 将被设置为 true

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

如上所述,,这是一个空字符串的定义行为条件if 表达式,||&&? :, ...)。 (必须应用内部 ToBoolean 操作的standard says。)

比较中使用空字符串(参见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会努力根据它们的将它们转换为数字,(usingoperations标准调用ToNumber 和 ToPrimitive),然后在内部应用 ===。但是当你直接使用===时,类型不会被转换,所以比较String和Boolean总是false

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

Truth, Equality and 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,这有点矫枉过正,这已经得到了很好的回答。”但这是很好的介绍和信息。谢谢。【参考方案4】:

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

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

【讨论】:

null 不是 falsetruenull 也不是 null。 jsfiddle.net/sq1Lkpg0 @Bruno,您可以使用NaNundefined 执行相同的测试。它们不是false,但它们是虚假的。这是什么要求。【参考方案5】:

可以转换为 false 的表达式示例是 计算结果为 null、0、空字符串 ("") 或未定义。 (见MDN Reference)

【讨论】:

【参考方案6】:

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

ToBoolean

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

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

【讨论】:

Aaaa 解决了 需要注意的是new String("") 是真实的!这是因为它是一个对象,而缩写形式 "" 代表原始值版本。 new Number(0) 甚至 new Boolean(false) 也是如此。不在代码中使用对象版本是一个很好的理由,这确实意味着if (str.length) 可以处理这种极端情况,而if (str) 不会。

以上是关于在javascript中,空字符串总是作为布尔值是假的吗?的主要内容,如果未能解决你的问题,请参考以下文章

javascript基础:逻辑运算符

js 过滤所有空字符串

js一些if语句判断条件为fasle的情况

JavaScript中布尔值为false的几种情况

go变量类的概念以及类的使用方式,嵌套结构体

go变量类的概念以及类的使用方式,嵌套结构体