var a = '';
var b = (a) ? false : true; // fixed!
console.log(b); // => true
var b
将设置为true
。
这是可以依靠的明确行为吗?
如以上回答,是,这是所定义的一个空字符串的行为在条件(一if
式,||
,&&
,? :
,...)。(标准说必须使用内部ToBoolean操作。)
在比较中使用空字符串时,评估结果是不同的(请参见Truth,Equality和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),然后在内部适用===
。但是,当您===
直接使用时,类型不会转换,因此将String与Boolean进行比较始终是false
。
粗略地说,JavaScript 条件(ToBoolean)测试定义的,非空,非零,非空,非假值(一个空String为...空,数字-0或+0为...零,NaN不是一个定义的数字,但是一个空的Object显然不是真的为空),或者正如我想的那样,对(true)事物进行条件测试,同时比较经过仔细检查的表观值(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?
还有更多的例子真相,平等和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
false
这里:jsfiddle.net/8CKbd