这行JavaScript代码中的波浪线(tilde)有什么作用?

4

我正在尝试理解这行代码。减号和波浪线对r[e]做了什么?

r = {}
for (e of s)
    r[e] = -~r[e] // What is this specific line assigning?

for (e in r)
    if (r[e] == 1)
        return e
return '_'

这段代码解决的问题是(具体的行已有注释):
给定一个字符串s,找到并返回其中第一个不重复的字符。如果没有这样的字符,则返回'_'。
除了被注释的那一行,我理解其他的行。

我认为你的代码并不能解决你所描述的问题。它假设 for (e in r) 按照它们被创建的顺序迭代属性。 - melpomene
这是一个CodeFights面试问题,这个解决方案得到了30个赞。我想出了一个使用indexOf/lastIndexOf的解决方案,但看了这个链接后并没有理解。这是链接:https://codefights.com/interview-practice/task/uX5iLwhc6L5ckSyNC/description - Dream_Cap
2个回答

5
波浪符是一种一元运算符,它将其右侧的表达式带入并执行该小算法。
-(N+1) // N is the expression right to the tilde

所以在您的代码中,它通过双重否定使r[e]增加1。

请参见以下示例:

console.log(~-2); // 1
console.log(~-1); // 0
console.log(~0);  // -1
console.log(~1);  // -2
console.log(~2);  // -3


2

“~”是按位非运算符。

它接收一个数作为操作数,将其转换为32位整数(参见 IEEE_754-1985),并翻转所有位。0变成1,1变成0。

例如,如果数字5表示为

00000000 00000000 00000000 00000101

数字~5是上面的数字,只是各个位的二进制数值反转了。
11111111 11111111 11111111 11111010

~5的十进制值为(-6),这也被称为2的补码。由于在JavaScript中表示数字的最高位代表符号的位是翻转的,因此符号将始终改变。 2的补码导致X的值变为-(X+1)

某些应用程序(如引擎)使用位数据结构,位运算在其中起到了作用。

  • 按位或(|)
  • 按位与(&)
  • 按位非(~)
  • 按位异或(^)
  • 按位左移(<<)
  • 按位右移(>>)

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