Con*_*mus 41 javascript operator-keyword
我在JS项目中找到了以下代码:
var a = new Array();
a[0] = 0;
for (var b = 0; b < 10; b++) {
a[0] |= b;
}
Run Code Online (Sandbox Code Playgroud)
|=for循环体内有什么作用?
代码示例是可疑的,但V8 已经在这里提供了一个改进性能的示例.
更新的示例
上面的例子相当于var a = [15];大多数意图和目的.|=操作员的一个更现实的例子是在单个变量中设置二进制标志,例如在权限对象上:
//Set up permission masks
var PERMISSION_1_MASK = parseInt('0001',2);
var PERMISSION_2_MASK = parseInt('0010',2);
..
//Set up permissions
userPermissions = 0;
userPermissions |= hasPermissionOne && PERMISSION_1_MASK;
userPermissions |= hasPermissionTwo && PERMISSION_2_MASK;
..
//Use permissions
if(userPermissions & PERMISSION_1_MASK){
..//Do stuff only allowed by permission 1
}
Run Code Online (Sandbox Code Playgroud)
Jac*_*rge 88
a[0] |= b
Run Code Online (Sandbox Code Playgroud)
基本上是
a[0] = a[0] | b
Run Code Online (Sandbox Code Playgroud)
"|" 是一个或按位运算符
更新
何时a[0]分配0,a[0]二进制是0000.在循环,
b = 0
a[0] = 0 (base 10) = 0000 (base 2)
b = 0 (base 10) = 0000 (base 2)
---------------
a[0] | b = 0000 (base 2) = 0 (base 10)
Run Code Online (Sandbox Code Playgroud)b = 1
a[0] = 0 (base 10) = 0000 (base 2)
b = 1 (base 10) = 0001 (base 2)
---------------
a[0] | b = 0001 (base 2) = 1 (base 10)
Run Code Online (Sandbox Code Playgroud)b = 2
a[0] = 1 (base 10) = 0001 (base 2)
b = 2 (base 10) = 0010 (base 2)
---------------
a[0] | b = 0011 (base 2) = 3 (base 10)
Run Code Online (Sandbox Code Playgroud)b = 3
a[0] = 3 (base 10) = 0011 (base 2)
b = 3 (base 10) = 0011 (base 2)
---------------
a[0] | b = 0011 (base 2) = 3 (base 10)
Run Code Online (Sandbox Code Playgroud)b = 4
a[0] = 3 (base 10) = 0011 (base 2)
b = 4 (base 10) = 0100 (base 2)
---------------
a[0] | b = 0111 (base 2) = 7 (base 10)
Run Code Online (Sandbox Code Playgroud)b = 5
a[0] = 7 (base 10) = 0111 (base 2)
b = 5 (base 10) = 0101 (base 2)
---------------
a[0] | b = 0111 (base 2) = 7 (base 10)
Run Code Online (Sandbox Code Playgroud)b = 6
a[0] = 7 (base 10) = 0111 (base 2)
b = 6 (base 10) = 0110 (base 2)
---------------
a[0] | b = 0111 (base 2) = 7 (base 10)
Run Code Online (Sandbox Code Playgroud)b = 7
a[0] = 7 (base 10) = 0111 (base 2)
b = 7 (base 10) = 0111 (base 2)
---------------
a[0] | b = 0111 (base 2) = 7 (base 10)
Run Code Online (Sandbox Code Playgroud)b = 8
a[0] = 7 (base 10) = 0111 (base 2)
b = 8 (base 10) = 1000 (base 2)
---------------
a[0] | b = 1111 (base 2) = 15 (base 10)
Run Code Online (Sandbox Code Playgroud)b = 9
a[0] = 15 (base 10) = 1111 (base 2)
b = 9 (base 10) = 1001 (base 2)
---------------
a[0] | b = 1111 (base 2) = 15 (base 10)
Run Code Online (Sandbox Code Playgroud)在循环的最后的值a[0]是15
fre*_*ish 49
x |= y;
Run Code Online (Sandbox Code Playgroud)
相当于
x = x | y;
Run Code Online (Sandbox Code Playgroud)
其中|代表按位OR.
与大多数赋值运算符一样,它等同于再次使用左手值应用运算符:
a |= b
a = a | b
Run Code Online (Sandbox Code Playgroud)
就像
a += b
a = a + b
Run Code Online (Sandbox Code Playgroud)
查看Moz Dev Net了解更多信息.
[编辑:大脑失败,混淆了| 和||.需要更多咖啡.修改如下]
由于|是Bitwise OR运算符,结果a|b将是表示带有所有1位a和的bitstring的整数b.需要注意的是JavaScript有没有本地int或位串类型,所以它会先投a和b为int,然后做一个位或对位.所以9 | 二进制2是1001 | 0010 = 1011,即11,但是8 | 2 = 8.
其效果是增加的标志位b进入a.所以,如果你有一些旗帜WEEVILFLAG=parseInt(00001000,2):
// a = parseInt(01100001,2)
if(isWeevilish(a))
a |= WEEVILFLAG;
// now a = parseInt(01101001,2)
Run Code Online (Sandbox Code Playgroud)
将该位设置为1.
在每个位位置返回一个位,其中一个或两个操作数的相应位是1.
代码:result = a | b;
^是按位XOR运算符,它为每个位置返回一个运算符,其中一个(不是两个)其操作数的相应位是1.下一个示例返回4(0100):
| 归档时间: |
|
| 查看次数: |
8052 次 |
| 最近记录: |