一篇SO上的回答让我思考,JavaScript在各个操作系统和浏览器中是否保证了特定的字节序编码?
换句话说,在JavaScript中,对整数进行位移运算是否“安全”?
一篇SO上的回答让我思考,JavaScript在各个操作系统和浏览器中是否保证了特定的字节序编码?
换句话说,在JavaScript中,对整数进行位移运算是否“安全”?
位移操作是安全的,但你的问题存在缺陷,因为字节序无论如何都不会影响位移操作。在所有语言中,左移位操作在大端和小端系统上都是相同的。(右移操作可能会有所不同,但只是由于符号位的解释不同,而不是任何位的相对位置不同。)
字节序仅在您可以将一些内存块解释为字节或更大的整数值时才起作用。一般来说,Javascript不会给您这个选项,因为您不能访问任意内存块,尤其是变量占用的内存块。Typed arrays以端序敏感的方式提供数据视图,但排序取决于主机系统;它不一定适用于所有可能的Javascript主机环境。
字节序描述的是物理存储顺序,而不是逻辑存储顺序。从逻辑上讲,最右边的位始终是最低有效位。
无论该位的字节是否驻留在最低内存地址上都是完全独立的问题,只有当您的语言公开了“最低内存地址”这样的概念时,它才有意义,而Javascript则没有。Typed arrays则是在typed arrays的上下文中这样做的,但它们仍然无法访问任意数据的存储。
这些答案有些过时了,因为在使用类型化数组时,字节序可能是相关的!考虑以下代码:
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
,表明我的机器是小端(little-endian)。然而,类型化数组默认使用系统字节顺序,因此如果您的机器是大端(big-endian),则可能看到 0 0 0 255
。是的,它们是安全的。尽管由于JS位运算是“hack”,所以您可能无法获得预期的速度优势。
ECMA Script实际上具有整数类型的概念,但是根据需要(如果表示的数字太大或具有分数部分)它会被隐式转换为双精度浮点值。许多主流的Javascript解释器(例如SpiderMonkey)在实现中采取了一种捷径,将所有数字值解释为双精度以避免对每个指令检查值的实际本机类型。由于这种实现方式,位运算被实现为将其强制转换为整型,然后再强制转换回双精度表示。因此,在Javascript中使用位级操作不是一个好主意,并且您也不会获得性能提升。
JavaScript没有整数类型,只有浮点类型。你永远无法接近实现细节来担心这个问题。