是的,有一个简单的方法,无需手动编写循环(循环仍然存在于后台某处):
new Uint16Array([1,2,3]);
就是这样。当然,浮点数会四舍五入,大数会溢出。
将类型化数组转换为缓冲区
任何类型数组的缓冲区都可以通过.buffer属性访问,如anyone can read on MDN:
new Uint16Array([1,2,3]).buffer;
选择正确的类型数组
请注意,提到的Uint16Array 将仅保存 0 到 65535 之间的整数(无浮点)。要保存任何 javascript 数字1,您需要使用 Float64Array - 最大的一个,总共占用 8 个字节。
1:这是unrestricted double,貌似是64bit IEEE 754 number
这是我创建的地图,其中映射了与数字数据类型相关的一些重要信息:
var NUMBER_TYPE = [
{name: "uint8", bytes:1, max: 255, min: 0, floating: false, array: Uint8Array},
{name: "int8", bytes:1, max: 127, min: -128, floating: false, array: Int8Array},
{name: "uint16", bytes:2, max: 65535, min: 0, floating: false, array: Uint16Array},
{name: "int16", bytes:2, max: 32767, min: -32768, floating: false, array: Int16Array},
{name: "uint32", bytes:4, max: 4294967295, min: 0, floating: false, array: Uint32Array},
{name: "int32", bytes:4, max: 2147483647, min: -2147483648, floating: false, array: Int32Array},
{name: "float64", bytes:8, max: Number.MAX_VALUE, min: Number.MIN_VALUE, floating: true , array: Float64Array}
];
Float 32 丢失,因为我无法为其计算必要的信息。地图可以用来计算可以容纳数字的最小类型数组:
function findNumberType(num) {
// detect whether number has something after the floating point
var float = num!==(num|0);
// Prepare the return variable
var type = null;
for(var i=0,l=NUMBER_TYPE.length; i<l; i++) {
// Assume this type by default - unless break is hit, every type ends as `float64`
type = NUMBER_TYPE[i];
// Comparison asserts that number is in bounds and disalows floats to be stored
// as integers
if( (!float || type.floating) && num<=type.max && num>=type.min) {
// If this breaks, the smallest data type has been chosen
break;
}
}
return type;
}
用作:
var n = 1222;
var buffer = new (findNumberType(n).array)([n]);
请注意,这仅在正确订购 NUMBER_TYPE 时才有效。