对SO的回应让我思考,JavaScript是否保证跨操作系统和浏览器的某种字节序编码?
或者换一种方式是在JavaScript中对整数"安全"进行按位移位?
移位是安全的,但你的问题是有缺陷的,因为无论如何,字节顺序不会影响位移操作.在所有语言的big-endian和little-endian系统中,左移是相同的.(右移可能不同,但仅由于符号位的解释,而不是任何位的相对位置.)
当您可以选择将某些内存块解释为字节或更大的整数值时,字节顺序才会发挥作用.通常,Javascript不会为您提供该选项,因为您无法访问任意内存块,尤其是不能访问变量占用的内存块.类型化数组以字节序敏感的方式提供数据视图,但排序取决于主机系统; 对于所有可能的Javascript主机环境,它不一定相同.
Endianness描述物理存储顺序,而不是逻辑存储顺序.从逻辑上讲,最右边的位始终是最低位.该位的字节是否位于最低内存地址是一个完全独立的问题,只有当您的语言暴露出"最低内存地址"这样的概念时才会发生这种情况,而Javascript则不然.类型化数组,但仅在类型化数组的上下文中; 他们仍然无法访问任意数据的存储.
其中一些答案是过时的,因为在使用类型化数组时,字节序可能是相关的!考虑:
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
,表明我的机器是小端的.但是,默认情况下,类型化数组使用系统字节顺序,因此您可能会看到0 0 0 255
您的计算机是否为big-endian.
是的,他们很安全.虽然你没有获得速度优势,但你可能希望因为JS位操作是" 黑客 ".