Start · Sprachen · JavaScript · Referenz · IDBKeyRange.lowerOpen

IDBKeyRange.lowerOpen

Eigenschaft

Schreibgeschützter Boolean, der angibt, ob die untere Grenze eines <code>IDBKeyRange</code> offen ist, der Grenzwert also <em>nicht</em> zum Bereich gehört.

seit JavaScript Baseline: alle Browser (IndexedDB 1.0) Kategorie: webapi

Signatur

IDBKeyRange.lowerOpen

Beschreibung

Die schreibgeschützte Eigenschaft lowerOpen eines IDBKeyRange-Objekts zeigt, wie die untere Grenze (lower) des Schlüsselbereichs behandelt wird. Bei false ist die Grenze geschlossen, der Wert von lower gehört also dazu (key >= lower). Bei true ist sie offen, der Grenzwert selbst ist ausgeschlossen (key > lower).

Festgelegt wird der Wert beim Erzeugen des Bereichs, und zwar über den Parameter open von IDBKeyRange.lowerBound(lower, open) oder über lowerOpen von IDBKeyRange.bound(lower, upper, lowerOpen, upperOpen). Wer nichts angibt, bekommt false. Nachträglich ändern lässt sich der Wert nicht. Für eine andere Einstellung legt man einen neuen Bereich an.

Praktisch ist die Eigenschaft vor allem, wenn Code einen fremden oder dynamisch erzeugten Schlüsselbereich prüfen, protokollieren oder in einen anderen Bereich umrechnen muss. Das kommt etwa bei der seitenweisen Abfrage vor („alles nach dem zuletzt gelesenen Schlüssel“) oder beim Umwandeln in eine URL- bzw. Debug-Darstellung wie (5, 10].

Rückgabewert

Typ
boolean
Beschreibung
true, wenn die untere Grenze offen ist, der Grenzwert also nicht dazugehört. false, wenn der Grenzwert dazugehört.

Beispiele

lowerOpen bei verschiedenen Bereichen auslesen

const inklusive = IDBKeyRange.lowerBound(10);        // key >= 10
const exklusive = IDBKeyRange.lowerBound(10, true);  // key > 10
const beidseitig = IDBKeyRange.bound(1, 5, true, false); // 1 < key <= 5

console.log(inklusive.lowerOpen);
console.log(exklusive.lowerOpen);
console.log(beidseitig.lowerOpen, beidseitig.upperOpen);
false true true false

Schlüsselbereich lesbar als Intervall ausgeben

const formatRange = (range) => {
  const links = range.lower === undefined ? '(-∞' : `${range.lowerOpen ? '(' : '['}${range.lower}`;
  const rechts = range.upper === undefined ? '∞)' : `${range.upper}${range.upperOpen ? ')' : ']'}`;
  return `${links}, ${rechts}`;
};

console.log(formatRange(IDBKeyRange.bound(5, 10, true)));
console.log(formatRange(IDBKeyRange.lowerBound('M')));
console.log(formatRange(IDBKeyRange.only(42)));
(5, 10] [M, ∞) [42, 42]

Seitenweise laden: alles nach dem letzten Schlüssel

// Voraussetzung: Object Store "artikel" mit numerischem Schlüssel
const ladeSeite = (db, letzterKey, anzahl = 20) =>
  new Promise((resolve, reject) => {
    // Offene Untergrenze: den zuletzt gelesenen Datensatz nicht noch einmal liefern
    const range = letzterKey === undefined
      ? null
      : IDBKeyRange.lowerBound(letzterKey, true);

    console.log('Untergrenze offen?', range?.lowerOpen ?? 'kein Bereich');

    const store = db.transaction('artikel', 'readonly').objectStore('artikel');
    const request = store.getAll(range, anzahl);
    request.onsuccess = () => resolve(request.result);
    request.onerror = () => reject(request.error);
  });

// Nutzung:
// const seite1 = await ladeSeite(db);
// const seite2 = await ladeSeite(db, seite1.at(-1).id);
Untergrenze offen? true

Bestehenden Bereich mit geschlossener Untergrenze neu erzeugen

const original = IDBKeyRange.bound(100, 200, true, true);

// lowerOpen ist schreibgeschützt, also einen neuen Bereich bauen
const inklusiv = IDBKeyRange.bound(original.lower, original.upper, false, original.upperOpen);

console.log(original.lowerOpen, inklusiv.lowerOpen);
console.log(original.includes(100), inklusiv.includes(100));
true false false true

// Wichtig · Fallstricke

  • Die Bedeutung ist leicht zu verwechseln: lowerOpen === true heißt, dass der Grenzwert ausgeschlossen ist. Die Bezeichnung „open“ stammt aus der Mathematik (offenes Intervall) und bedeutet nicht „der Wert ist enthalten“.
  • Schreibgeschützt: Eine Zuweisung wie range.lowerOpen = true hat keine Wirkung. Im Strict Mode löst sie einen TypeError aus. Für eine andere Grenze erzeugt man einen neuen Bereich.
  • Bereiche ohne Untergrenze: Bei IDBKeyRange.upperBound() ist lower gleich undefined, und lowerOpen ist laut Spezifikation true. Ob überhaupt eine Untergrenze existiert, prüft man daher über lower, nicht über lowerOpen.
  • Bei IDBKeyRange.only(key) sind lowerOpen und upperOpen immer false.
  • IDBKeyRange.bound(x, x, true, …) wirft einen DataError, weil ein Bereich mit gleichen, aber offenen Grenzen leer wäre. Dasselbe gilt, wenn lower > upper ist.
  • Kompatibilität: Wird von allen aktuellen Browsern unterstützt, auch in Web Workern. Nicht verfügbar in Node.js ohne Polyfill (z. B. fake-indexeddb).