Ближайшая вещь к "int" в JS - PullRequest
0 голосов
/ 29 апреля 2020

Я пробовал mimi c 32-битные числа со знаком в JS. Я надеюсь, что есть какой-то способ заставить его действовать синтаксически идентично (после инициализации, конечно) языкам, таким как C, C ++, Java, et c.

let a = ....
...

// Once initalized
a = 4294967296

// Should return true
console.log(a == 0)

a = Math.pow(2, 31)

// Should return false
console.log(a == Math.pow(2, 31))

Моя попытка ниже. Я думаю, что это довольно близко, но я считаю ._, определенно неловким. Есть ли лучшие способы, которыми такие типы данных могут имитироваться в JS? (Я также могу использовать Object.defineProperties на window и получить желаемый синтаксис для глобальных объектов, не уверен, что так будет лучше)

function int32_t(n) {
	this._value = new Int32Array([n])
	Object.defineProperties(this, {
		_: {
			get: () => this._value[0],
			set: (n) => {
				this._value[0] = n
				return this._value[0]
			},
			configurable: true
		}
	})
}
let a = new int32_t(10);

// Once initalized
a._ = 4294967296

// Should return true
console.log(a._ == 0)

a._ = Math.pow(2, 31)

// Should return false
console.log(a._ == Math.pow(2, 31))

1 Ответ

0 голосов
/ 04 мая 2020

Для тех, кто ищет решение , это самое близкое, что я мог получить. Это, безусловно, не самое оптимальное решение, поскольку переменные должны быть глобализированы, и, надеюсь, его можно улучшить в будущем.

function globalInt(destVar) {
  const varName = Object.keys(destVar)[0]
  const globalName = 'fakeInt_' + varName
  window[globalName] = new Int32Array([0]);
  Object.defineProperties(window, {
    [varName]: {
      get: () => window[globalName][0],
      set: (n) => {
        window[globalName][0] = n
        return window[globalName][0]
      },
      configurable: true
    }
  })
}

// Only works for globals
a = 5;

// Initalize
globalInt({a})

// Once initalized
a = 4294967296

// Should return true
console.log(a == 0)

a = Math.pow(2, 31)

// Should return false
console.log(a == Math.pow(2, 31))
...