JavaScript数据类型

时间:2014-08-07 01:03:18

标签: javascript arrays types number-formatting

根据我的理解,JavaScript没有 ints 浮动,而只是 Number 类型,格式为double -precision 64位浮点值,但JavaScript也有typed arrays,可以是多种类型,包括: Int32Array Uint32Array Float32Array

所以我的问题是:下面的类型数组只是使用带有一些位操作包装函数的 Number 类型,还是实际上使用了其他一些数据类型?如果他们确实使用了其他类型,那么可以通过包装类型数组来实际创建自己的 int float 类型。

2 个答案:

答案 0 :(得分:3)

  

所以我的问题是:下面的类型数组只是使用带有一些位操作包装函数的 Number 类型,还是实际上使用了其他一些数据类型?

键入的数组不使用number类型。例如,new Int32Array(10)将创建一个包含10个32位整数的数组。因此,它确实会为您的数组分配40个字节的空间。

在内部存储在数组中的任何整数只占用32位(4字节)的空间。但是,在读取数据时,int将被强制转换为JavaScript number(原语,而不是对象 - 因此不会大写)。因此,没有办法将int读入JavaScript。

JavaScript number数据类型是双精度浮点数。因此,它可以表示较小的数据类型。但是它不能代表64位整数,因为它本身就是一个64位浮点数。这就是我们没有Int64ArrayUint64Array

的原因
  

如果他们确实使用了其他类型,那么可以通过包装类型数组来实际创建自己的 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);