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