在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 测试(真)事物,而==
比较明显的、经过仔细转换的值( 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?
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】:是的。所有false
、0
、空字符串''
和""
、NaN
、undefined
和null
总是被评估为false
;其他的都是true
。
在您的示例中, b 在评估后是 false
。 (我觉得你写错了true
)
【讨论】:
null
不是 false
,true
,null
也不是 null
。 jsfiddle.net/sq1Lkpg0
@Bruno,您可以使用NaN
和undefined
执行相同的测试。它们不是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中,空字符串总是作为布尔值是假的吗?的主要内容,如果未能解决你的问题,请参考以下文章