JavaScript/TypeScript 中带有字符串的连续分配数组

Contiguous allocated arrays in JavaScript/TypeScript with strings

我有一个看起来像这样的系统:

    interface Data {
        x: number;
        y: number;
        n: string;
    }

    const array = Array<Data>(100);

我在 Chrome 中读到,如果数组只包含相同的类型,V8 引擎会将对象分配为 C 数组,但是是否可以实际检查我的“数组”对象是否将充当一个 C 数组或字典,例如内存是连续分配的吗?

如果无法做到这一点,我知道我可以使用像这样使用 TypedArrays 的 SoA 模型:

    interface Data {
        x: Float64Array;
        y: Float64Array;
        n: ????;
    }

    const dataArray = {
        x: new Float64Array(100),
        y: new Float64Array(100),
        n: ????????
    } as Data

但是我不知道如何在这样的数组中存储字符串

这里是 V8 开发人员。 var dataArray = new Array(100) 将为您提供一个包含 100 个指针的连续数组,因此从这个意义上讲,它将是 "C like",而不是字典。 dataArray[0] = new Data(x, y, n) 将在数组外分配一个新的 Data 对象,并将指向它的指针存储在数组的第一个槽中。在这样的 Data 对象中,在 64 位平台上,V8 可以直接在对象中存储数字(在您的示例中为 xy),而字符串和其他对象将始终存储作为指向另一个对象的指针。在只包含数字的数组中,V8 也可以将它们直接存储在数组中,因此您不需要为此使用 Float64Array

综上所述,任何性能差异都可能太小而不重要,因此我建议您编写对您最有意义的代码(最易读,最适合您的 algorithm/data 模型,等)。