在阅读有关Angular的更改检测机制的文章时,我遇到了此打字稿代码:
detach(): void { this._view.state &= ~ViewState.ChecksEnabled; }
我一直在努力把那行代码缠起来。
我知道~
的窍门以及它与indexOf()
一起使用的方式。我发现很难用位来理解,但要记住可以用-(x+1)
代替它,因此仅使-1 falsy变得更容易。
似乎ViewState.ChecksEnabled
是布尔值,因此~ViewState.ChecksEnabled
给出-(0 + 1)或-(1 + 1)
然后按&=
按位分配(?),我们得到
this._view.state = this._view.state & -1; // or -2
这有什么窍门?
答案 0 :(得分:3)
我认为您应该将此视为二进制演算。
让我们假设_view.state
等于1,而ViewState.ChecksEnabled
等于1。
我们有两个按位运算符:
&
将对等于1的对应位执行AND操作~
将反转位因此,通过操作的“重写”,我们可以:
var = 1 & ~ 1
我们应用波浪号:
var = 1 & 0
然后输入AND:
var = 0
哪个给出纯零。如果您在_view.state
等于0的情况下应用此代码,则将得出:
var = 0 & ~1 = 0 & 0 = 0
当您使用0,0时:
var = 0 & ~0 = 0 & 1 = 0
和1,0:
var = 1 & ~0 = 1 & 1 = 1
所以总结一下:
0, 0 → 0
0, 1 → 0
1, 0 → 1
1, 1 → 0
您还可以创建一个沙箱来测试几个数字:
for (const i of [0, 1, 2, 3, 4]) {
for (const j of [0, 1, 2, 3, 4]) {
console.log(`${i} & ~${j} = ${ i & ~j }`);
}
}