在 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 语言规范明确定义了这种行为:
布尔值
如果参数是空字符串(其长度为零),则结果为假;否则结果为真
引自http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
是的。所有false
, 0
, 空字符串''
和""
, NaN
, undefined
, 和null
总是被评估为false
;其他一切都是true
。
在您的示例中, b 是false
经过评估的。(我觉得你写错了true
)
var a = '';
var b = (a) ? false : true; // fixed!
console.log(b); // => true
var
b
将设置为true
.这是一个可以依赖的定义行为吗?
如上所述,yes,这是条件(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的力图将其转换为数字,根据自己的value,(使用 操作的标准要求ToNumber和ToPrimitive),然后在内部适用===
。但是当您===
直接使用时,类型不会转换,因此将 String 与 Boolean 进行比较总是false
.
粗略地说,JavaScript条件( ToBoolean ) 测试定义的、非空、非零、非空、非假值(空字符串是...空,数字 -0 或 +0 是...零,NaN 不是一个定义的数字,但一个空的 Object 显然不是真的空),或者像我想的那样,条件测试一个(真)事物,同时==
比较明显的、仔细转换的值(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
var b
将被设置为true
。这是因为空字符串在 JavaScript 中被视为“falsey”值,其他一些值也是如此。
可以转换为 false 的表达式示例包括计算结果为 null、0、空字符串 ("") 或 undefined 的表达式。(参见MDN 参考)