Start · Sprachen · JavaScript · Referenz · IDBKeyRange.upperOpen

IDBKeyRange.upperOpen

Eigenschaft

Schreibgeschützter boolescher Wert: <code>true</code>, wenn der obere Grenzwert eines <code>IDBKeyRange</code> <em>nicht</em> im Bereich enthalten ist (offene Obergrenze).

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

Signatur

IDBKeyRange.upperOpen

Beschreibung

Die Eigenschaft upperOpen eines IDBKeyRange-Objekts gibt an, ob die Obergrenze upper ausgeschlossen ist. Der Name kommt aus der Mathematik: Ein „offenes“ Intervall enthält seinen Randwert nicht. upperOpen === true bedeutet also key < upper, false bedeutet key <= upper.

Der Wert wird beim Erzeugen des Bereichs festgelegt, entweder über den Parameter upperOpen von IDBKeyRange.upperBound(upper, open) oder über den vierten Parameter von IDBKeyRange.bound(lower, upper, lowerOpen, upperOpen). Danach lässt er sich nicht mehr ändern. Standardmäßig ist er false, die Obergrenze gehört dann also zum Bereich.

Praktisch brauchen Sie die Eigenschaft, wenn Sie einen übergebenen Schlüsselbereich untersuchen wollen, etwa beim Debuggen, beim Protokollieren oder in Hilfsfunktionen, die einen Bereich in einen lesbaren Text umwandeln oder daraus einen neuen Bereich ableiten, zum Beispiel für die Paginierung.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn die Obergrenze ausgeschlossen ist (offen). false, wenn sie zum Bereich gehört (geschlossen). Das ist auch der Standardwert.

Beispiele

Offene und geschlossene Obergrenze vergleichen

const geschlossen = IDBKeyRange.upperBound(100);
const offen = IDBKeyRange.upperBound(100, true);

console.log(geschlossen.upperOpen); // 100 ist enthalten
console.log(offen.upperOpen);       // 100 ist ausgeschlossen

console.log(geschlossen.includes(100));
console.log(offen.includes(100));
false true true false

Bereich als lesbare Intervall-Schreibweise ausgeben

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

console.log(bereichAlsText(IDBKeyRange.bound(10, 20, false, true)));
console.log(bereichAlsText(IDBKeyRange.upperBound('m')));
console.log(bereichAlsText(IDBKeyRange.lowerBound(5, true)));
[10, 20) (-∞, m] (5, ∞)

Preise unter 50 € aus einem Index lesen

const request = indexedDB.open('shop', 1);

request.onupgradeneeded = () => {
  const store = request.result.createObjectStore('produkte', { keyPath: 'id' });
  store.createIndex('preis', 'preis');
  store.add({ id: 1, name: 'Tasse', preis: 12 });
  store.add({ id: 2, name: 'Lampe', preis: 50 });
  store.add({ id: 3, name: 'Kissen', preis: 29 });
};

request.onsuccess = () => {
  const db = request.result;
  const range = IDBKeyRange.upperBound(50, true); // echt kleiner als 50
  console.log('Obergrenze offen:', range.upperOpen);

  const index = db.transaction('produkte').objectStore('produkte').index('preis');
  index.getAll(range).onsuccess = (e) => {
    console.log(e.target.result.map((p) => p.name));
  };
};
Obergrenze offen: true ["Tasse", "Kissen"]

// Wichtig · Fallstricke

  • Namensfalle: upperOpen: true heißt ausgeschlossen, nicht „offen im Sinne von inklusiv“. Dieser Punkt wird oft verwechselt.
  • Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wie range.upperOpen = true wird ignoriert (im Strict Mode gibt es einen TypeError). Wenn Sie etwas anderes brauchen, erzeugen Sie einen neuen Bereich.
  • Bei IDBKeyRange.lowerBound() gibt es keine Obergrenze: upper ist undefined und upperOpen ist true. Prüfen Sie deshalb immer zuerst upper.
  • Bei IDBKeyRange.only(x) ist upperOpen immer false.
  • IDBKeyRange.bound(5, 5, false, true) ist ein leerer Bereich und wirft eine DataError-DOMException.
  • Kompatibilität: Die Eigenschaft wird in allen modernen Browsern und in Web Workern unterstützt. IDBKeyRange.prototype.includes(), das in den Beispielen vorkommt, gibt es erst seit etwa 2016/2017.