将RxJS与filter(Boolean)一起使用进行查询?

时间:2018-12-28 02:24:21

标签: javascript angular typescript rxjs rxjs6

我正在阅读带有代码段的一些代码:

search(query: string) {
  of(query).
  pipe(
    filter(Boolean), 
    debounceTime(300), 

filter(Boolean)filter(v=>!!v)本质上是同一件事吗?

2 个答案:

答案 0 :(得分:5)

是的,它们是相同的。

   console.log(typeof Boolean); // prints function
   console.log(Boolean.prototype.constructor("truthy")); // prints true
   console.log(Boolean === Boolean.prototype.constructor); // prints true

Boolean全局引用指向构造函数,该构造函数从第一个参数返回布尔值。

构造函数可用于创建 boolean 包装对象,但它与原始的 true 值不同。

    console.log(new Boolean("truthy")); // prints an object.
    console.log(new Boolean("truthy").valueOf() === true); // prints true
    console.log((new Boolean("truthy")) === true); // prints false
    console.log(Boolean("truthy") === true); // prints true

参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean

答案 1 :(得分:4)

它们达到相同的结果,因为您不会在订阅中获得未定义的值。

区别在于,使用filter(Boolean)时会丢失类型推断

const query = 'the query';

of(query).
  pipe(
     filter(Boolean)
  ).subscribe(val); // val here is of type 'Any'

of(query).
  pipe(
     filter(Boolean)
  ).subscribe((val: String)); // we can infer it back to String later

of(query).
   pipe(
      filter(v=> v!== undefined)
   ).subscribe(val); // val here is of type 'String'