JavaScript中的"!~"是什么意思?

14
(function () {
    var names = [];
    return function (name) {
        addName(name);
    }
    function addName(name) {
        if (!~names.indexOf(name))//
            names.push(name);
    console.log(names);// ["linkFly"]
    }
}())('linkFly');

有时我看到这个逻辑,它是什么意思?谢谢~


1
你可以从中得出任何你喜欢的意义。我认为它意味着代码的编写者并没有想到其他人会阅读他们的代码。 - bhspencer
我知道它是如何工作的,这是一种糟糕的做法。 谢谢大家~~~ - simotophs23
2个回答

24

简短版:

indexOf 在数组中找不到元素时返回 -1。因此,if 语句检查 name 是否未在 names 中找到。 ! ~-1 ==> true

详细版:

波浪号(~)操作符(按位非)返回 a 的反转值(也称为一的补数)。[来源] 例如,~-1 === 0。请注意,0 == false!0 === trueindexOf 在数组中找不到元素时返回 -1。因此,我们可以使用 ! ~-1 === true 来判断 indexOf 是否未在 names 中找到 name(即返回 -1)。

个人观点:

如您所见,使用这些混淆或“聪明”的技巧而没有注释会让读者真正困惑。如果您喜欢这些技巧,请为读者记录代码行的作用!


只有 !~(-1) 返回 true 吗? - simotophs23
你认为这是不好的做法吗?它并不完全是自我说明的代码。 - bhspencer
3
这是一个简化的解释,波浪号会翻转比特位,而 ! 会将其反转为布尔值,尽管基本上与 names.indexOf(name) != -1 相同,但这个答案几乎没有以有意义的方式解释其行为。 - adeneo
8
顺便提一下:这段代码过于“聪明”,为了节省一些字符而带来的困惑并不值得。我认为这是不好的实践。 - kapex
@simotophs23 是的,因为零是唯一的假值数字。请注意 ~-1 === 0 - rgajrawala

0

!(逻辑非) 如果其单个操作数可转换为 true,则返回 false;否则,返回 true。

对于除 -1 之外的所有整数操作数,在应用 ~ 运算符进行!运算符后,净操作数的本质将是真实的,从而导致 FALSE。 -1 是特殊的,因为 ~(-1) 给出 0,这在 JavaScript 中是 falsy。添加 ! 运算符给我们唯一的 TRUE。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接