什么!~myVar呢?

时间:2015-12-11 13:02:42

标签: javascript operators

我正在尝试阅读此代码:

  var cloneKeys = Object.keys(base).filter(function ( k ) {
    return !~noCloneKeys.indexOf(k);
  });

!~在这做什么?我以前从未见过它,而且很难搜索。从expressions and operators reference开始,它看起来像是逻辑运算符和按位运算符的组合,但这对我来说没有任何意义。

2 个答案:

答案 0 :(得分:2)

这是noCloneKeys.indexOf(k) == -1的一种(非常难以理解的)简短形式。

~value = binary inverse, ~(-1) => 0
!value = boolean inverse, !(0) => true

为了让您的开发人员精神健全,请写下== -1< 0 ...

详细说明:

-1 == binary 11111111111111111111111111111111 (assuming 32 bit integer)
~(-1)   ==   00000000000000000000000000000000
!(~(-1)) == !(0) == true

答案 1 :(得分:1)

这是两个不是!和波浪~的运营商的组合。

Tilde(按位不) - ~

此运算符执行-(input + 1)(它实际上是在翻转位,但我认为这是一个很好的初学者思考方式)。因此,对于indexOf(),如果找不到输入则会返回-1,代字号会将-1转换为0。对于找到输入的所有情况,代字号会将0或更高的值转换为-1-2-3-4等。

不 - !

这是一个反转输入的布尔运算符。或者在您的情况下,将任何0反转为true,将任何非零反转为false

因此,如果我们将它们组合在一起,我们会说0indexOf无法找到输入的实例提供true,并将其反转为false。对于所有其他有效输入,请返回... DEBUG [f85d7a84] Command: cd /home/deploy/my_app/releases/20151210184710 && ( export RVM_BIN_PATH="~/.rvm/bin" aws_access_key_id="<MY_AWS_ACCESS_KEY_ID>" aws_secret_access_key="<MY_AWS_SECRET_ACCESS_KEY>" RAILS_ENV="production" ; ~/.rvm/bin/rvm default do bundle exec rake assets:precompile ) DEBUG [f85d7a84] RVM used your Gemfile for selecting Ruby, it is all fine - Heroku does that too, DEBUG [f85d7a84] DEBUG [f85d7a84] you can ignore these warnings with 'rvm rvmrc warning ignore /home/deploy/my_app/releases/20151210184710/Gemfile'. DEBUG [f85d7a84] DEBUG [f85d7a84] To ignore the warning for all files run 'rvm rvmrc warning ignore allGemfiles'. DEBUG [f85d7a84] DEBUG [f85d7a84] DEBUG [f85d7a84] DEBUG [f85d7a84] rake aborted! DEBUG [f85d7a84] DEBUG [f85d7a84] ArgumentError: Missing required arguments: aws_access_key_id, aws_secret_access_key ...