在 javascript 中,
var a = ''; var b = (a) ? true : false;
将 var b设置为 false。
var b
false
这种行为是可以依赖的吗?
是的。所有 false、 0、空字符串 ''和 ""、 NaN、 undefined和 null总是计算为 false; 其他的都是 true。
0
''
""
NaN
undefined
null
true
在你的例子中,b 是评估后的 false。(我想你写错了 true)
将 var b设置为 true。这是因为在 JavaScript 中,空字符串和其他一些值一样被视为“假值”。
请查看 http://www.sitepoint.com/javascript-truthy-falsy/中的假值
是的,Javascript 是 ECMAScript 的一种方言,ECMAScript 语言规范清楚地定义了这种行为:
布尔型 如果参数为空 String (其长度为零) ,则结果为 false; 否则结果就是真的
布尔型
如果参数为空 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。 这种行为是可以依赖的吗?
Var b将被设置为 true。
b
如上所述,是的是空字符串 条件句(一个 if表达式,||,&&,? :,...)的定义行为。(必须应用内部 布尔型操作的 标准规定。)
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(它是一个东西并且有一个非零值)。
'0'
'1'
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;