根据我的理解,JavaScript没有 ints 或浮动,而只是 Number 类型,格式为double -precision 64位浮点值,但JavaScript也有typed arrays,可以是多种类型,包括: Int32Array , Uint32Array 和 Float32Array
所以我的问题是:下面的类型数组只是使用带有一些位操作包装函数的 Number 类型,还是实际上使用了其他一些数据类型?如果他们确实使用了其他类型,那么可以通过包装类型数组来实际创建自己的 int 和 float 类型。
答案 0 :(得分:3)
所以我的问题是:下面的类型数组只是使用带有一些位操作包装函数的 Number 类型,还是实际上使用了其他一些数据类型?
键入的数组不使用number
类型。例如,new Int32Array(10)
将创建一个包含10个32位整数的数组。因此,它确实会为您的数组分配40
个字节的空间。
在内部存储在数组中的任何整数只占用32位(4字节)的空间。但是,在读取数据时,int将被强制转换为JavaScript number
(原语,而不是对象 - 因此不会大写)。因此,没有办法将int读入JavaScript。
JavaScript number
数据类型是双精度浮点数。因此,它可以表示较小的数据类型。但是它不能代表64位整数,因为它本身就是一个64位浮点数。这就是我们没有Int64Array
或Uint64Array
。
如果他们确实使用了其他类型,那么可以通过包装类型数组来实际创建自己的 int 和 float 类型
是的,有可能。但是你必须为加法,减法,强制等定义自己的函数。例如,这就是我要做的:
var Num = defclass({
constructor: function (array) {
this.constructor = function () {
this.array = new array(arguments);
};
return defclass(this);
},
toValue: function () {
return this.array[0];
},
toString: function () {
return this.array[0];
},
plus: function (that) {
return new this.constructor(this + that);
}
});
var Int8 = new Num(Int8Array);
var Uint8 = new Num(Uint8Array);
var Int16 = new Num(Int16Array);
var Uint16 = new Num(Uint16Array);
var Int32 = new Num(Int32Array);
var Uint32 = new Num(Uint32Array);
var Float32 = new Num(Float32Array);
var Float64 = new Num(Float64Array);
您可以按如下方式使用它:
var a = new Int32(Math.pow(2, 31) - 1); // 2147483647
var b = new Int32(1);
var c = a.plus(b); // -2147483648
defclass函数定义如下:
function defclass(prototype) {
var constructor = prototype.constructor;
constructor.prototype = prototype;
return constructor;
}
一切都放在一起:
var Num = defclass({
constructor: function (array) {
this.constructor = function () {
this.array = new array(arguments);
};
return defclass(this);
},
toValue: function () {
return this.array[0];
},
toString: function () {
return this.array[0];
},
plus: function (that) {
return new this.constructor(this + that);
}
});
var Int8 = new Num(Int8Array);
var Uint8 = new Num(Uint8Array);
var Int16 = new Num(Int16Array);
var Uint16 = new Num(Uint16Array);
var Int32 = new Num(Int32Array);
var Uint32 = new Num(Uint32Array);
var Float32 = new Num(Float32Array);
var Float64 = new Num(Float64Array);
var a = new Int32(Math.pow(2, 31) - 1); // 2147483647
var b = new Int32(1);
var c = a.plus(b); // -2147483648
alert(a + " + " + b + " = " + c);
function defclass(prototype) {
var constructor = prototype.constructor;
constructor.prototype = prototype;
return constructor;
}
答案 1 :(得分:0)
JavaScript允许您使用三种原始数据类型:
数字,例如123,120.50等。
文字串例如“此文字字符串”等。
布尔值,例如是真还是假。
JavaScript还定义了两个简单的数据类型,null和undefined,每个数据类型只定义一个值。
除了这些原始数据类型之外,JavaScript还支持称为对象的复合数据类型。
但您可以声明类型化的数组,如下面的文字:
// create an 8-byte ArrayBuffer
var b = new ArrayBuffer(8);
// create a view v1 referring to b, of type Int32, starting at
// the default byte index (0) and extending until the end of the buffer
var v1 = new Int32Array(b);
// create a view v2 referring to b, of type Uint8, starting at
// byte index 2 and extending until the end of the buffer
var v2 = new Uint8Array(b, 2);
// create a view v3 referring to b, of type Int16, starting at
// byte index 2 and having a length of 2
var v3 = new Int16Array(b, 2, 2);