A response on SO让我思考,JavaScript是否保证跨操作系统和浏览器的某种字节序编码?
或者说另一种方式是在JavaScript中对整数进行按位移位“安全”吗?
答案 0 :(得分:31)
移位是安全的,但你的问题是有缺陷的,因为无论如何,字节顺序不会影响位移操作。在所有语言的big-endian和little-endian系统中,左移是相同的。 (右移可能不同,但仅由于符号位的解释,而不是任何位的相对位置。)
当您可以选择将某些内存块解释为字节或更大的整数值时,仅使用字节顺序。通常,Javascript不会为您提供该选项,因为您无法访问任意内存块,尤其是不能访问变量占用的内存块。 Typed arrays以字节序敏感的方式提供数据视图,但排序取决于主机系统;对于所有可能的Javascript主机环境,它不一定相同。
Endianness描述物理存储顺序,而非逻辑存储顺序。逻辑上,最右边的位总是最低有效位。该位的字节是否是位于最低内存地址的字节是一个完全独立的问题,只有当您的语言暴露出“最低内存地址”这样的概念时才会发生这种情况,而Javascript则不然。类型化数组,但仅在类型化数组的上下文中;他们仍然无法访问任意数据的存储。
答案 1 :(得分:12)
其中一些答案已过时,因为在使用类型化数组时,字节序可以相关!考虑:
var arr32 = new Uint32Array(1);
var arr8 = new Uint8Array(arr32.buffer);
arr32[0] = 255;
console.log(arr8[0], arr8[1], arr8[2], arr8[3]);
当我在Chrome的控制台中运行它时,它会产生255 0 0 0
,表示我的机器是小端的。但是,typed arrays use the system endianness by default,如果您的计算机是big-endian,您可能会看到0 0 0 255
。
答案 2 :(得分:6)
是的,他们很安全。虽然由于JS位操作是“a hack”,但您可能无法获得速度优势。
答案 3 :(得分:4)
ECMA脚本实际上有一个整数类型的概念,但它根据需要隐式强制转换为双精度浮点值(如果表示的数字太大或者它有一个小数分量)。 / p>
许多主流Javascript解释器(SpiderMonkey就是一个例子)在实现中采用快捷方式并将所有数值解释为双精度,以避免检查每条指令的实际本机类型值。作为实现hack的结果,位操作被实现为对整数类型的强制转换,然后是强制转换为双表示。因此,在Javascript中使用位级操作并不是一个好主意,无论如何你都不会获得性能提升。
答案 4 :(得分:3)
是JavaScript中整数“安全”的按位移位吗?
仅适用于32位(31 +符号)内的整数。与Python不同,你不能得到1<<< 40。
这就是ECMA-262定义的按位运算符的工作方式,即使JavaScript数字实际上是浮点数。 (从技术上讲,双精度浮点数,为您提供52位尾数,足以覆盖32位整数范围。)
按位运算不涉及'endianness'的问题,并且JavaScript中没有可能涉及字节序的字节存储格式。
答案 5 :(得分:0)
JavaScript没有整数类型,只有浮点类型。你可能永远无法接近实施细节而担心这一点。