Obj.toString()都等于false和true?

时间:2016-09-26 13:41:51

标签: javascript google-chrome console tostring

在Chrome控制台的空白页面中,我输入:

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

我期待o.toString被评估为空字符串,所以很麻烦......

发生了什么事?

3 个答案:

答案 0 :(得分:3)

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

您的空字符串假设不正确,可以在控制台中轻松测试

答案 1 :(得分:3)

  

我期待o.toString被评估为空字符串,所以很麻烦......

这种期望与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并不等于任何事情。

在评论中你曾问过:

  

为什么不这样做呢?

将值强制转换为布尔值之间存在很大差异,如下所示:

if (o.toString()) {

... 与<{1}}的布尔值进行比较,如下所示:

==

他们刚刚从根本上有不同的定义,因为if (o.toString() == true) { 经历了一系列已定义的步骤,试图使价值可以比较的东西,并且在做这个时它并不偏向于布尔值(它偏向于数字和字符串)。

答案 2 :(得分:0)

这是因为o={}和函数toString会让你"[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');