在JavaScript中,
var a = '';
var b = (a) ? true : false;
var b
将被设置为false
。
这是一个可以依赖的已定义行为吗?
在JavaScript中,
var a = '';
var b = (a) ? true : false;
var b
将被设置为false
。
这是一个可以依赖的已定义行为吗?
是的。Javascript是ECMAScript的一种方言,而ECMAScript语言规范明确定义了这种行为:
ToBoolean
如果参数是空字符串(长度为零),则结果为false;否则结果为true。
引用自http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
new String("")
是真值(truthy),这是因为它是一个对象,而短形式""
表示基本数据类型。同样的情况也适用于new Number(0)
和甚至new Boolean(false)
。这是不使用对象版本在你的代码中的一个好理由,这意味着if (str.length)
可以处理这种边缘情况,而if (str)
则不能。 - Chris Middleton是的,所有false
、0
、空字符串''
和""
、NaN
、undefined
和null
总是被评估为false
;其他所有东西都是true
。
在你的例子中,b在评估后是false
。(我认为你错误地写成了true
)
null
不是 false
,也不是 true
,null
就是 null
。https://jsfiddle.net/sq1Lkpg0/ - Bruno Fingervar a = '';
var b = (a) ? false : true; // fixed!
console.log(b); // => true
变量
b
将被设置为true
。这是一种可靠的定义行为吗?
如上所述,是的,在条件语句(if
表达式、||
、&&
、? :
等)中,空字符串的定义行为是如此。 (标准 中说必须应用内部的 ToBoolean 操作。)
当空字符串用于比较时(请参阅 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会尝试根据它们的值将它们转换为数字(使用 标准调用ToNumber和ToPrimitive操作),然后在内部应用===
。但是,当您直接使用===
时,类型不会被转换,因此将字符串与布尔值进行比较始终为false
。
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'
为真(长度不为零,或者说它是一个东西),但在==
比较中为假(值为零)。而'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
将被设置为true
。这是因为在JavaScript中,空字符串被视为“假值”,还有其他一些值也是如此。var b
实际上会被设置为 true
,因为它是 var a
的相反值。 - bombek是的,你可以依赖于这种行为。
更短写法如下:
var b = !!a;
false
:http://jsfiddle.net/8CKbd/ - anubhavavar b = (a) ? true : false;
才能正确地与下一条语句匹配。 - PhoneixS