代码之家  ›  专栏  ›  技术社区  ›  msc

怎么了!!~'用javascript做?[副本]

  •  3
  • msc  · 技术社区  · 6 年前

    我在github上看到了下面一段代码。

    /**
     * Filters an array of objects with multiple criteria.
     *
     * @param  {Array}  array: the array to filter
     * @param  {Object} filters: an object with the filter criteria as the property names
     * @return {Array}
     */
    function multiFilter(array, filters) {
      const filterKeys = Object.keys(filters);
      // filters all elements passing the criteria
      return array.filter((item) => {
        // dynamically validate all filter criteria
        return filterKeys.every(key => !!~filters[key].indexOf(item[key]));
      });
    }
    

    我不明白,为什么 !!~ 在这里吗?

    附言: 我知道C语言和C++语言,但我是JavaScript的新手。我知道那个运算符,但我不明白,为什么要用双反( !! )按位不( ~ )接线员?

    4 回复  |  直到 6 年前
        1
  •  6
  •   SandroKSG    6 年前

    indexOf 将返回索引 0-x 如果找到元素, -1 否则。

    ~ 将改变数字中的所有位 -1个 0 (对 -1个 1111 1111 ... )中。

    0个 是一个错误的值,所有其他数字都是真实的。

    !! 将错误值转换为 false 一个真实的价值 true 是的。这里不需要,因为 every 不管它得到的是真值还是真值。

    正如其他人提到的,现在你可以使用 includes 是的。然而, 包括 对于javascript生态系统来说比 指数 ,所以这个解决方案可以在ie中使用 include 不会的。你还可以用 包括 通过提供 polyfill 或者通过传输你的代码。

        2
  •  3
  •   CertainPerformance    6 年前

    这个 tilde 使结果 indexOf 如果项目被发现,则表示真实;如果项目未被发现,则表示虚假。这个 !! 然后将结果从数字转换为布尔值。(这根本没用,因为 every 只关心结果是真是假)

    非常不清楚。最好用这个代替:

    return array.filter((item) => {
      // dynamically validate all filter criteria
      return filterKeys.every(key => filters[key].includes(item[key]));
    });
    
        3
  •  1
  •   Isaac    6 年前

    var fruits = ["Banana", "Orange", "Apple", "Mango"];
    var a = ~fruits.indexOf("Banana");
    var b = !a;
    var c = !!a;
    console.log('a:',a);
    console.log('b:',b);
    console.log('c:',c);

    它可以分成上述步骤,试图了解发生了什么。 Bitwise operator: ~ 是代替丑陋的 0/-1 使用时比较 indexOf 方法。双重否定 !! 会给我们一个布尔值来判断是否找到它

        4
  •  0
  •   Harshal Patil    6 年前

    !!~ 表示按位不 ~ 后跟双否定 !! 是的。

    按位不 通过反转操作数中的所有位进行操作。