Javascript 强制对象计算为false

Javascript 强制对象计算为false,javascript,node.js,Javascript,Node.js,我猜这可能是特定于应用程序的,但是我使用node.js-只要它在v8引擎中工作,我不介意 我正在尝试创建一个计算结果为false的对象,例如: var Foo = function() { return this; } var bar = new Foo; if (bar) // returns false; 这是否可以通过重写对象的某个函数来实现,例如toString 如果有人想知道这可能有什么用例:它用于从通常返回布尔值的函数返回错误对象,但也可能遇到错误并返回我的自定义错误对象 我希望下

我猜这可能是特定于应用程序的,但是我使用node.js-只要它在v8引擎中工作,我不介意

我正在尝试创建一个计算结果为false的
对象,例如:

var Foo = function() { return this; }
var bar = new Foo;
if (bar) // returns false;
这是否可以通过重写对象的某个函数来实现,例如
toString

如果有人想知道这可能有什么用例:它用于从通常返回布尔值的函数返回错误对象,但也可能遇到错误并返回我的自定义错误对象


我希望下面的任何条件都像函数返回假值一样,而不必修改条件以适应非布尔值的可能性。

可以得到的最接近值如下

if (+obj)
其中falsy对象定义了一个
.valueOf()
函数,该函数返回
0
false

var o = {
    valueOf: function() {
        return false;
    }
};
if (+o) {
    throw unreachable();
}

最后一段——传播异常——是try/catch/throw的一个很好的用例。另外,您将反复看到这种需求的另一个地方是异步回调。在节点上的大多数异步系统中,回调通常发送两个参数,一个错误和一个数据对象,而不仅仅是一个参数。如果有一个很好的方法只使用一个对象,我怀疑人们会采用这个方法。为了反驳当前的答案,即操纵
.valueOf()
,我想指出
+({})
是NaN,因此是falsy。这应该适用于valueOf未被修改的任何对象。这非常好。虽然为什么需要将其转换为数字?我在chrome的控制台上尝试了不使用类型转换的方法,但它仍然可以工作。@George:否则将无法调用
valueOf
。你一定做了一些不同的事情,因为如果(o)
没有同样的效果。@FelixKling你是对的,我正在检查
o==false
,我只是把它放在三元结构中,除非你把它转换成一个数字,否则它会失败。@GeorgeReith是的,这是一个常见的错误
==false
与direct
if(..)
不同
=
会键入强制,如果(…)会立即执行
ToBoolean(…)
而不强制。虽然可以这样做,但缺点是什么?在未来的应用程序中,如果(!result){console.log(result.errorString)}有点脆弱。如果(!result&&result!==null&&typeof result!==undefined),可以编写
但是测试对象或单独错误变量的错误属性似乎更干净。