跳至正文
LNN的博客!

JavaScript,但是你可以用 new int[len] 来创建类型化数组

int* arr = new int[20];

🤔…

const array = new int[20]
console.log(array) // ==> Int32Array(20)

今天跟 FCC 同学讨论时提到,JavaScript 中调用构造函数时如果不需要传入任何参数,则可以不写调用函数的括号:

var map = new Map

我立刻想到,只要利用 Proxy(en),就可以创建一个名为 int 的对象,使得 int[len] 返回一个可以被当作构造函数调用的函数,调用后返回一个指定长度的 Int32Array,从而实现用 new int[len] 的语法来创建类型化数组。(C++ 化 JS!)于是当场写了这个。

const handler = {
  get(_, prop) {
    return function () {
      return new Int32Array(prop)
    }
  }
}
const int = new Proxy({}, handler)

new int[32] // => Int32Array(32)

显然这里的 int[32] 只是在对 int 进行索引,这样会调用 handler.get(int, "32")。此时我们就返回一个函数来创建对应长度的类型化数组。然后把 int[32] 的结果当作构造函数来调用,就能得到这个新数组。

又写了一个能创建其他各种数组的版本。Class 只要是一个接受数组长度的构造函数就可以。

function ArrayCreator(Class) {
  return new Proxy({}, {
    get(_, length) {
      length = +length
      if (!Number.isSafeInteger(length) || length < 0)
        throw new TypeError(`ArrayCreator(${Class.name}): length must be a non-negative safe integer`)
      return function () {
        return new Class(length)
      }
    },
  })
}

const int = ArrayCreator(Int32Array)
const long = ArrayCreator(BigInt64Array)
const short = ArrayCreator(Int16Array)
const float = ArrayCreator(Float32Array)
const double = ArrayCreator(Float64Array)

console.log(new int[20]) // => Int32Array[20]
console.log(new long[20]) // => BigInt64Array(20)
console.log(new short[20]) // => Int16Array[20]
console.log(new float[20]) // => Float32Array[20]
console.log(new double[20]) // => Float64Array[20]

const any = ArrayCreator(Array) // (?)
console.log(new any[20]) // => Array(20)

没了。(


评论区

加载基于 GitHub issues 的 utteranc.es 评论区组件……