Obj.toString() 既等于假又等于真?

Obj.toString() both equal to false and true?

在 chrome 控制台的空白页中,我键入:

var o={};
o.toString() == false // false
o.toString() == true // false

我希望 o.toString 被评估为一个空字符串,所以是假的...

发生了什么事?

因为 {}.tostring() 产生 "[object Object]"

您的空字符串假设不正确并且很容易在控制台中测试

这是因为 o={} 和函数 toString return 你 "[object Object]"

如果你需要得到 true / false 如果对象是空的,使用像这样的东西:

ES5

var o1 = {};
if(Object.getOwnPropertyNames(o).length !== 0) console.log('true');
else console.log('false');

JQUERY: 检查这个:http://api.jquery.com/jQuery.isEmptyObject/

if($.isEmptyObject(o)) console.log('true');

Loadash:

if(_.isEmpty(o)) console.log('true');

I'm expecting o.toString to be evaluated as an empty string and so falsy...

这种期望与 specified behavior of Object.prototype.toString({}).toString 是什么)不一致,后者为普通对象输出 "[object Object]"

所以你正在做的是

"[object Object]" == true

(或== false)。如果我们遵循 the abstract equality comparison algorithm 的(复杂的)规则,最终会变成

Number("[object Object]") === Number(true)

...这是

NaN === 1

...这是 false,因为 NaN 不等于任何东西。

同样

"[object Object]" == false

...最终成为

NaN === 0

...这也是 false,因为(再次)NaN 不等于任何东西。

在您提出的评论中:

So why not truthy?

将值强制转换为布尔值有很大区别,如下所示:

if (o.toString()) {

...并且 通过 == 将其与布尔值进行比较 ,如下所示:

if (o.toString() == true) {

它们的定义根本不同,因为 == 通过一系列定义的步骤来尝试使值可以比较,并且在这样做时它不会偏向布尔值(它偏向于数字和字符串)。