它总是足够使用!在JavaScript中获取正确的布尔值

时间:2019-03-21 21:08:39

标签: javascript node.js angular typescript rxjs

我一直在审查一个看起来像这样的案件:

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”,我们希望允许其为真。

2 个答案:

答案 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))