考虑NodeJS中的以下示例:
let ar1 = new Uint8Array([1,2,3,4])
let ar2 = new Uint8Array([1,2,3,4,5,6,7,8])
for (var i = 0; i < 8; i++) {
console.log(ar1[i] ^ ar2[i]);
}
我使用的是Node 12.22.1版本,上面的代码输出如下:
0
0
0
0
5
6
7
8
在这里,我们看到超出一个数组界限的XORing元素只会导致另一个数组中元素的值。
仔细观察,我们发现ar1[5] === undefined
是true
。此外,undefined ^ 5 === 5
也是真(从技术上讲是一个非零值)。因此,假设undefined
XOR与Node中的任何内容一起生成原始值是安全的吗?
在上下文中,我试图异或两个大小不同的Uint8Arrays。最简单的实现是找到数组和XOR每个元素的最大长度,将结果存储到列表中。这是可行的,但我对依赖任何undefined
来产生可靠的行为持怀疑态度。我可以添加额外的代码,以确保不发生越界访问,但我想知道这在Node中是否必要。我还想知道,在其他JavaScript运行时环境中,特别是在web浏览器中,相同的代码是否会可靠地运行。
下面是我在本例中编写的简单的XOR数组代码。
private static xorArrays(array1: Uint8Array, array2: Uint8Array): Uint8Array
{
let length = array1.length > array2.length ? array1.length : array2.length;
let result = new Uint8Array(length);
for (let i = 0; i < length; i++) {
result[i] = array1[i] ^ array2[i];
}
return result;
}
发布于 2021-07-27 08:48:56
因此,假设未定义的XOR与Node中的任何内容一起生成原始值是安全的吗?
undefined ^ x
给x
的原因是当您尝试将undefined
转换为一个数字(例如+undefined
)时,NaN
。
在按位运算符中,NaN
在转换为32位整数(按位运算符根据这执行)后,作为0
操作。这可以在~NaN
、NaN >> 0
、5 << NaN
等方面看到。规格说明实际上指定在VM级别上,ToNumeric(undefined)
给出(间接) NaN
。我找不到任何规范提到为什么NaN
在位运算符中表示0,所以这可能与VM有关。
对于用例,您可以简单地使用array[i] || 0
,其中undefined
(和0
)将是错误的,因此“默认”为0
。然后,您就会知道它将如何运行,而不是依赖于undefined
中奇怪的按位运算符的行为。
https://stackoverflow.com/questions/68548728
复制相似问题