Как получить список задекларированных констант (const name = val) в JS?

Рейтинг: 0Ответов: 2Опубликовано: 03.03.2025

Хочу получить список констант, объявленных через const name = val. Не могу понять это вообще возможно или нет. Если мне нужен список переменных, тут не каких проблем:

// Условный массив всего что есть в объекте.
let winList = Object.keys(window);
let winListResult = [];

// Перебор
for (let item of winList) {
  // Тут какая то проверка, не принципиально сейчас
  try {
    if (typeof window[item] != 'function' && typeof window[item] != 'object'){
      // Тут действие допустим пишем имя в массив
      winListResult.push(item);
    }
  } catch {}
}

console.log(winListResult)

Все, профит, у нас есть список всего что не объект и не функция.

Возможно ли провернуть тоже самое с константами? Они ведь не входят в объект globalThis.

Ответы

▲ 2Принят

Получить список нельзя, проверить существование конкретного имени и того, что это константа - можно.

function checkGlobal(name) {
  if (name in window) {
    var d = Object.getOwnPropertyDescriptor(window, name)
    
    if (!d) {
      return 'inherited'
    }
  
    return 'value' in d && d.writable && d.enumerable && !d.configurable
      ? 'var-like'
      : 'property'
  }

  try {
    var old = (0, eval)(name)
  } catch (err) {
    return 'unexisting'
  }
  
  try {
    new Function(`${name} = arguments[0]`)(old)
  } catch (err) {
    return 'const'
  }
  
  return 'let'
}

const abc = 10
let qwe = 11
var qqq = 12
function f() {}

for (const x of ['zzz', 'abc', 'qwe', 'qqq', 'f', 'location', 'undefined', 'PERSISTENT', 'atob']) {
  console.log(x, checkGlobal(x))
}
.as-console-wrapper.as-console-wrapper { max-height: 100vh }

▲ 1

Если ты хочешь найти не только переменные, но и глобальные свойства, надо заменить Object.keys на Object.getOwnPropertyNames. Но обращаю внимание, что они не являются и не называются константами.

// Условный массив всего что есть в объекте.
let winList = Object.getOwnPropertyNames(window);
let winListResult = [];

// Перебор
for (let item of winList) {
  // Тут какая то проверка, не принципиально сейчас
  try {
    if (typeof window[item] != 'function' && typeof window[item] != 'object'){
      // Тут действие допустим пишем имя в массив
      winListResult.push(item);
    }
  } catch {}
}

console.log(winListResult)