我一直在审查一个看起来像这样的案件:
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';
}
因此,根据答案,不同之处在于!!
的false值返回true,而toBoolean()
的false值返回false
。
这有点主观,但我个人认为告诉用户使用!!
比使用其他加糖方法更好,因为我们应该先熟悉Javascript基础知识/语义,然后再从中进行构建
因此,如果有人希望'false'
为假,那么他们必须明确实现这一点。在这种情况下,应用程序将是某人的姓名实际上为“ false”,我们希望允许其为真。
答案 0 :(得分:3)
否,您的toBoolean
和!!
在语义上并不等效。 toBoolean
取决于字符串序列化,这是一种将值强制转换为布尔值的怪异方法。以下是一些导致不同结果的值:
toBoolean(0) == true
toBoolean('false') == false
toBoolean('') == true
toBoolean({toString(){return "false"}}) == false
答案 1 :(得分:2)
否,!!
不等于toBoolean
。
为进一步说明,!!
始终会返回一个布尔值MDN,即使有关于!!
用法的注释:
可以串联使用两个NOT运算符来显式强制将任何值转换为相应的布尔基元。转换基于值的“真实性”或“虚假性”(请参阅“真实性”和“虚假性”)。
可以通过
Boolean
函数完成相同的转换。
因此,您始终可以将Boolean(x)
替换为!!x
,但是toBoolean
呢?请注意,toBoolean
将其参数转换为字符串并将其与字符串'false'
进行比较,因此至少在一种情况下,其参数不相同:
function toBoolean(value: any): boolean
{
return value != null && `${value}` !== 'false';
}
console.log(Boolean('false'))
console.log(toBoolean('false'))
并显示一个更微妙的问题:
function toBoolean(value: any): boolean
{
return value != null && `${value}` !== 'false';
}
const foo = { toString: () => 'false' };
console.log(Boolean(foo))
console.log(toBoolean(foo))