你如何使一个 JavaScript 对象被视为假值?

4
我考虑的使用场景是创建一个极度自私的 Null 用于合并。这段代码可以工作,但需要对所涉及的Null进行显式检查:

const Null = new Proxy({}, {get: () => Null});

let data = Null;

console.log(data.a.b.c.d !== Null ? "Has value" : "Is Null");

我希望能够省略明确的检查并直接执行以下操作:

console.log(data.a.b.c.d ? "Has value" : "Is Null");

但是这并不起作用,因为我的Null是一个对象,因此被视为真值。

规范似乎表明这是不可能的,但javascript是一个奇怪的生态系统,我希望有人能提出可能的解决方案。

(另外,请不要辩论这种类型的Null的优点,我知道这可能是一个有争议的问题,我只是想知道它是否可以被完成,而不是是否应该完成。)


可能是重复的问题:一个对象可以是 false 吗? - Sheepy
使用一个实用函数来返回你想要的内容。 - charlietfl
1个回答

2
不可以。对象引用永远不会是“假”的。你可以添加valueOf()toString()方法,在调用时返回false值,但如果被测试的只是一个引用,这样做没有任何作用。

1
一个直接的反例是 document.all instanceof Object,其中 !!document.all === false,但这似乎是一个孤立的例外,无法模拟。我并不是真的想要一个不到5分钟的“不”的答案,所以我将让问题保持开放状态,直到有人使用新方法或语言发展到可以实现这一点的地步。 - david
@david 什么?document.all已经过时了,在当今任何浏览器中该值都将是“未定义”。也许IE会保留它,甚至在Edge中,但那样它就不会是“未定义”。我不确定你在这里想表达什么。无论如何,一个真正的对象引用肯定永远不会是假的。 - Pointy
是的,它有些过时,但它仍然存在。大多数浏览器会保留它,因为在Web开发中向后兼容性非常重要。 - david
有趣的是,我的 Firefox 版本返回 !!document.all === falsetrue。你检查的是哪个版本?我的版本是 52.0a2 (2016-12-06) (64-bit) - david
Firefox 50.1.0 返回 true 对于 !!document.all === false,因为它是真的。在现代 Firefox 中,document.allundefined - Pointy
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接