【问题标题】:Does OO Javascript have a `to_bool` or `__len__` equivalent?OO Javascript 是否有 `to_bool` 或 `__len__` 等价物?
【发布时间】:2016-05-05 16:08:00
【问题描述】:

OO JS 是否有将实例对象转换为布尔值的机制?我希望能够直接在条件中使用自定义实例对象,并按照!!(new Foo(0)) === false!!(new Foo(1)) === true 的方式进行断言。

  • Python 有__nonzero____len__(见here

  • Ruby 有to_bool

JS 如何对字符串字面量"" 和零0 执行此操作?

【问题讨论】:

  • !!(new Foo(1)) === true 没关系。当您将对象与另一种类型进行比较时,Javascript 会转换对象 toString()
  • @MarcosPérezGude 具体将什么转换为字符串?
  • @MarcosPérezGude !!(new Foo(1)) 总是返回 true
  • @MarcosPérezGude:它不会与=== 进行任何转换。对于==,它将取决于另一个操作数。如果您显示的是布尔值,它会将布尔值转换为数字,然后对象将通过toPrimitive 操作,其中涉及.toString()。在您的示例中,您直接转换了对象,因此这是一个简单的 true === true 操作。
  • @MarcosPérezGude:差不多。您需要删除!!,因为它优先于==,从而导致true == true。如果没有!!.toString() 将被调用,因此 OP 实际上可以提供一个自定义的.toString() 函数,该函数可能会在这种情况下给出所需的结果。

标签: javascript oop casting boolean instance


【解决方案1】:

不,JS 不提供用于转换为布尔值的陷阱方法。根据语言规则,值的真实性是statically determined,不能更改。

您应该为您的实例提供一个可以显式调用的方法,例如 isValid()isTruthy()isEmpty() 或您的对象所代表的任何概念。

【讨论】:

  • 看起来有一个内部机制(toBoolean)。可惜它不是暴露的 API!
  • @nathanallen:它被暴露为Boolean 函数或使用!!(双重否定运算符)。
猜你喜欢
  • 1970-01-01
  • 2015-11-03
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 2010-09-24
相关资源
最近更新 更多