Нет, вы не можете, не в общем случае. The Вы можете использовать итератор² напрямую, хотя:
const hasAny = xs => !xs[Symbol.iterator]().next().done;
Или, если вы хотите обеспечить активное освобождение любых ресурсов, которые удерживает итератор (вместо того, чтобы ждать их автоматического освобождения - подумайте о соединении с БД в функции генератора или подобном), предварительно вызовите return
для него, если он предоставляет return
(не все делают), как for-of
делает под прикрытием:
const hasAny = xs => {
const it = xs[Symbol.iterator]();
const result = !it.next().done;
if (it.return) it.return();
return result;
};
Live Пример:
const hasAny = xs => !xs[Symbol.iterator]().next().done;
console.log(hasAny([])); // false
console.log(hasAny([1])); // true
¹ Если вы точно знаете, что первое значение итератора не будет null
или undefined
, вы можете сделать этот трюк с деструктуризацией .
² Для тех, кто не знает, for-of
использует итератор под одеялом.