вы можете определять их как свои собственные константы.На самом деле это может сделать ваш код быстрее
const TEXTURE_2D = 0x0DE1
...
gl.bindTexture(TEXTURE_2D, someTexture);
Отлично.И, если этот код выполняется через современный JavaScript-компрессор, он превратится в этот
gl.bindTexture(0x0DE1, someTexture);
, что, возможно, будет быстрее.Быстрее, чем gl.TEXTURE_2D
, потому что при использовании gl.TEXTURE_2D
движок JavaScript должен всегда проверять, что кто-то не назначил gl.TEXTURE_2D
чему-то другому.Быстрее, чем TEXTURE_2D
, потому что даже константная переменная представляет собой нечто, создаваемое, а 0x0DE1
определенно не создает.
Просто потому, что я, вероятно, получу несколько вопросов позже, моя точка зрения выше о скорости заключается в том, что движок JavaScript имеетпроверять каждый раз, когда вы звоните
gl.bindTexture(gl.TEXTURE2D, ...)
Что кто-то где-то не делал
gl.TEXTURE_2D = 123
или не получал свойство
Object.defineProperty(gl, 'TEXTURE_2D', {
enumerable: true,
writable: false,
get() {
console.log('TEXTURE_2D was accessed at', (new Error()).stack));
return 0xDE1;
}
});
Механизм JavaScript можетПредполагается, что свойство TEXTURE_2D
не было изменено.Он должен проверять каждый раз.
Что касается const
, то может быть или не быть общая разница в скорости, но, например, если мы сделаем функцию, которая возвращает функцию, подобную этой
function makeFuncThatReturnsValue(value) {
const v = value;
return function() {
return v;
}
}
Мы можем видеть, что каждый раз, когда мы вызываем makeFuncThatReturnsValue
, новый v
будет создан и захвачен в закрытии.
Простое использование литерала не вызовет этой проблемы, ничего не будет создано.Конечно, вы не хотите использовать литерал напрямую, магические числа плохие, но если вы скомпилируете свой JavaScript с современным компрессором, он заменит любые 1034 * s для литералов, где это уместно.
Запуск примерачерез компилятор закрытия Google
код:
const w = {
TEXTURE_2D: 0x0DE1,
};
gl.bindTexture(w.TEXTURE_2D, null);
результат :
gl.bindTexture(3553,null);