【问题标题】:Obj.toString() both equal to false and true?Obj.toString() 都等于 false 和 true?
【发布时间】:2016-09-26 13:41:51
【问题描述】:

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

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

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

发生了什么?

【问题讨论】:

  • console.log(o.toString());
  • 它们都相等

标签: javascript google-chrome console tostring


【解决方案1】:

我希望 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()) {

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

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

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

【讨论】:

  • 很好的解释,点赞
  • 我认为 {}.toString 是一个空字符串,因为一个空数组(它也是一个对象......)给出一个空字符串 [].toString() === ""
  • @Francesco:Array.prototype.toString 的行为与Object.prototype.toString 非常不同。 Array 版本将其所有条目转换为字符串,然后对它们执行.join(",")。所以一个空数组给出""
【解决方案2】:

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

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

【讨论】:

  • 那么为什么不真实呢?
  • 如果你这样做了if({}.tostring())
  • @Francesco:将值强制转换为布尔值 (if (o.toString())) 和通过 == (if (o.toSring() == true)) 比较 将其与布尔值之间存在很大差异。
  • @Francesco 可以使用Object.keys(o).length检查空对象
【解决方案3】:

这是因为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');

加载

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

【讨论】:

  • if({}) 永远真实
猜你喜欢
  • 2013-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 2014-07-04
  • 2021-10-08
  • 1970-01-01
  • 2016-03-27
相关资源
最近更新 更多