在Chrome控制台的空白页面中,我输入:
var o={};
o.toString() == false // false
o.toString() == true // false
我期待o.toString被评估为空字符串,所以很麻烦......
发生了什么事?
答案 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');