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

在 JavaScript 中,

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

var b 将设置为 false

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

【问题讨论】:

  • 你确定吗,我在这里收到falsejsfiddle.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 不是不可读,而是输出另一个答案。现在我已经更正了。

标签: javascript string boolean


【解决方案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 也不是 nulljsfiddle.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) 不会。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-03
      • 2021-03-30
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      相关资源
      最近更新 更多