【发布时间】:2019-08-12 19:56:12
【问题描述】:
我一直在审查一个看起来像这样的案例:
loggedInUser$ = this.select().pipe(
filter(({ user }) => toBoolean(user)),
map(({ user: { firstName: f, lastName: l } }) => `${f} ${l}`)
);
只是好奇我们是否总是可以用!! 代替这个方法来获得一个布尔值以及是否。 IIUC 的语义总是一样的?
换句话说,我们应该始终能够将toBoolean(...) 替换为!!?
实现如下所示:
// @internal
export function toBoolean(value: any): boolean
{
return value != null && `${value}` !== 'false';
}
分析
因此,根据答案,区别在于!! 为“假”返回真,而toBoolean() 为“假”返回false。
这有点主观,但我个人觉得告诉用户使用!! 比其他一些含糖的方法更好,因为我们应该先熟悉 Javascript 基础/语义,然后再从中构建。
因此,如果有人希望 'false' 为假,那么他们必须明确地实现它。在这种情况下,应用程序是某人的名字实际上是“假”,我们希望允许它为真。
【问题讨论】:
-
除非您发布“Akita
toBoolean”的实现(我从未听说过),否则我们无法判断它是否在语义上等同于!!。 -
您应该始终根据问题的背景调整您的状况。我认为最好和更易读的解决方案是使用
user && user.firstName && user.lastName -
将实现添加到问题中。
-
Akita 的toBoolean 实现检查值的字符串表示形式是否既不是
null也不是"false"。因此toBoolean("false")和!!"false"会有所不同,如this stackblitz 所示。
标签: javascript node.js angular typescript rxjs