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

在 javascript 中,

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

var b设置为 false

这种行为是可以依赖的吗?

129953 次浏览

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

在你的例子中,b 是评估后的 false。(我想你写错了 true)

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

请查看 http://www.sitepoint.com/javascript-truthy-falsy/中的假值

是的,Javascript 是 ECMAScript 的一种方言,ECMAScript 语言规范清楚地定义了这种行为:

布尔型

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

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

可以转换为 false 的表达式的示例包括 计算结果为 null、0、空字符串(“”)或未定义。 (见 MDN 参考资料)

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

Var b将被设置为 true

这种行为是可以依赖的吗?

如上所述,是的是空字符串 条件句(一个 if表达式,||&&? :,...)的定义行为。(必须应用内部 布尔型操作的 标准规定。)

当使用空字符串 比较一下(参见 真理、平等与 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 会根据它们的 价值(使用 行动的标准调用 到数字太原始了)努力将它们转换成数字,然后在内部应用 ===。但是当您直接使用 ===时,类型不会转换,因此将 String 与 Boolean 进行比较总是 false

粗略地说,JavaScript 条件句(布尔型)测试 定义,非空,非零,非空,非假值(一个空字符串是... 空的,数字 -0或 + 0是... 零,NaN 不是一个定义的数字,但一个空对象显然不是真正的空) ,或者像我喜欢想的那样,条件句测试 (真实的)事物,而 ==比较其操作数的 显然,仔细转换 < em > 值 (太原始了到数字) ,而 ===寻找 ===0。

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

是的,你可以相信这种行为。

一个简短的写法是:

var b = !!a;