Javascript 强制对象计算为false
我猜这可能是特定于应用程序的,但是我使用node.js-只要它在v8引擎中工作,我不介意 我正在尝试创建一个计算结果为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 如果有人想知道这可能有什么用例:它用于从通常返回布尔值的函数返回错误对象,但也可能遇到错误并返回我的自定义错误对象 我希望下
对象,例如:
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
与directif(..)
不同=
会键入强制,如果(…)会立即执行ToBoolean(…)
而不强制。虽然可以这样做,但缺点是什么?在未来的应用程序中,如果(!result){console.log(result.errorString)}有点脆弱。如果(!result&&result!==null&&typeof result!==undefined),可以编写。
但是测试对象或单独错误变量的错误属性似乎更干净。