in
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Der in
Operator gibt true
zurück, wenn die angegebene Eigenschaft im angegebenen Objekt oder seiner Prototypenkette vorhanden ist.
Der in
Operator kann nicht verwendet werden, um in anderen Sammlungen nach Werten zu suchen. Um zu überprüfen, ob ein bestimmter Wert in einem Array existiert, verwenden Sie Array.prototype.includes()
. Für Sets verwenden Sie Set.prototype.has()
.
Probieren Sie es aus
const car = { make: "Honda", model: "Accord", year: 1998 };
console.log("make" in car);
// Expected output: true
delete car.make;
if ("make" in car === false) {
car.make = "Suzuki";
}
console.log(car.make);
// Expected output: "Suzuki"
Syntax
prop in object
#prop in object
Parameter
prop
-
Ein String oder Symbol, das einen Eigenschaftsnamen repräsentiert (nicht-Symbole werden in Strings umgewandelt). Kann auch ein privates Elementkennzeichen sein.
object
-
Objekt, um zu überprüfen, ob es (oder seine Prototypenkette) die Eigenschaft mit dem angegebenen Namen (
prop
) enthält.
Ausnahmen
TypeError
-
Ausgelöst, wenn
object
kein Objekt ist (d.h. ein primitiver Wert).
Beschreibung
Der in
Operator testet, ob eine String- oder Symboleigenschaft in einem Objekt oder seiner Prototypenkette vorhanden ist. Wenn Sie nur nicht-vererbte Eigenschaften prüfen möchten, verwenden Sie stattdessen Object.hasOwn()
.
Eine Eigenschaft kann in einem Objekt vorhanden sein, aber den Wert undefined
haben. Daher ist "x" in obj
nicht dasselbe wie obj.x !== undefined
. Um in
dazu zu bringen, false
zurückzugeben, nachdem eine Eigenschaft hinzugefügt wurde, verwenden Sie den delete
Operator, anstatt den Wert dieser Eigenschaft auf undefined
zu setzen.
Sie können den in
Operator auch verwenden, um zu überprüfen, ob ein bestimmtes privates Klassenfeld oder Methode in einem Objekt definiert wurde. Der Operator gibt true
zurück, wenn die Eigenschaft definiert ist, und false
andernfalls. Dies ist bekannt als ein Branded Check, da er true
zurückgibt, wenn und nur wenn das Objekt mit diesem Klassenkonstruktor erstellt wurde, danach können Sie auch sicher auf andere private Elemente zugreifen.
Dies ist eine spezielle Syntax — die linke Seite des in
Operators ist ein Eigenschaftskennzeichen anstelle eines Ausdrucks, aber unzitiert (weil es sonst eine String-Eigenschaft wäre, nicht ein privates Element).
Da der Zugriff auf private Elemente in Objekten, die nicht mit der aktuellen Klasse verwandt sind, einen TypeError
auslöst, anstatt undefined
zurückzugeben, ermöglicht diese Syntax, zu verkürzen:
class C {
#x;
static isC(obj) {
try {
obj.#x;
return true;
} catch {
return false;
}
}
}
Zu:
class C {
#x;
static isC(obj) {
return #x in obj;
}
}
Es vermeidet auch im Allgemeinen die Notwendigkeit, mit Fehlerbehandlung umzugehen, nur um auf ein möglicherweise nicht existierendes privates Element zuzugreifen.
Der in
Operator erfordert jedoch, dass das private Element zuvor in der umgebenden Klasse deklariert wurde — andernfalls würde ein SyntaxError
("Private field '#x' must be declared in an enclosing class") ausgelöst werden, derselbe, der geworfen wird, wenn Sie versuchen, auf ein nicht deklariertes privates Element zuzugreifen.
class C {
foo() {
#x in this;
}
}
new C().foo(); // SyntaxError: Private field '#x' must be declared in an enclosing class
Beispiele
Grundlegende Verwendung
Die folgenden Beispiele zeigen einige Verwendungen des in
Operators.
// Arrays
const trees = ["redwood", "bay", "cedar", "oak", "maple"];
0 in trees; // returns true
3 in trees; // returns true
6 in trees; // returns false
"bay" in trees; // returns false (you must specify the index number, not the value at that index)
"length" in trees; // returns true (length is an Array property)
Symbol.iterator in trees; // returns true
// Predefined objects
"PI" in Math; // returns true
// Custom objects
const myCar = { make: "Honda", model: "Accord", year: 1998 };
"make" in myCar; // returns true
"model" in myCar; // returns true
Sie müssen ein Objekt auf der rechten Seite des in
Operators angeben. Zum Beispiel können Sie einen mit dem String
Konstruktor erstellten String angeben, aber keinen String-Literal.
const color1 = new String("green");
"length" in color1; // returns true
const color2 = "coral";
// generates an error (color2 is not a String object)
"length" in color2;
Verwendung des in Operators mit gelöschten oder undefinierten Eigenschaften
Wenn Sie eine Eigenschaft mit dem delete
Operator löschen, gibt der in
Operator false
für diese Eigenschaft zurück.
const myCar = { make: "Honda", model: "Accord", year: 1998 };
delete myCar.make;
"make" in myCar; // returns false
const trees = ["redwood", "bay", "cedar", "oak", "maple"];
delete trees[3];
3 in trees; // returns false
Wenn Sie eine Eigenschaft auf undefined
setzen, sie jedoch nicht löschen, gibt der in
Operator true
für diese Eigenschaft zurück.
const myCar = { make: "Honda", model: "Accord", year: 1998 };
myCar.make = undefined;
"make" in myCar; // returns true
const trees = ["redwood", "bay", "cedar", "oak", "maple"];
trees[3] = undefined;
3 in trees; // returns true
Der in
Operator gibt false
für leere Array-Slots zurück, auch wenn der direkte Zugriff undefined
zurückgibt.
const empties = new Array(3);
empties[2]; // returns undefined
2 in empties; // returns false
Um dies zu vermeiden, stellen Sie sicher, dass ein neues Array immer mit nicht-leeren Werten gefüllt oder nicht auf Indizes über das Ende des Arrays hinaus geschrieben wird.
const empties = new Array(3).fill(undefined);
2 in empties; // returns true
Vererbte Eigenschaften
Der in
Operator gibt true
für Eigenschaften in der Prototypenkette zurück. Dies kann unerwünscht sein, wenn Sie Objekte verwenden, um beliebige Schlüssel-Wert-Paare zu speichern.
const ages = { alice: 18, bob: 27 };
function hasPerson(name) {
return name in ages;
}
hasPerson("hasOwnProperty"); // true
Sie können Object.hasOwn()
verwenden, um zu überprüfen, ob das Objekt den Schlüssel besitzt.
const ages = { alice: 18, bob: 27 };
function hasPerson(name) {
return Object.hasOwn(ages, name);
}
hasPerson("hasOwnProperty"); // false
Alternativ sollten Sie erwägen, ein Null-Prototyp-Objekt oder eine Map
zum Speichern von ages
zu verwenden, um andere Fehler zu vermeiden.
const ages = new Map([
["alice", 18],
["bob", 27],
]);
function hasPerson(name) {
return ages.has(name);
}
hasPerson("hasOwnProperty"); // false
Verwendung des in Operators zur Implementierung von Branded Checks
Der folgende Codeausschnitt demonstriert eine statische Funktion, die angibt, ob ein Objekt mit dem Person
Konstruktor erstellt wurde und daher andere Methoden sicher ausführen kann.
class Person {
#age;
constructor(age) {
this.#age = age;
}
static isPerson(o) {
return #age in o;
}
ageDifference(other) {
return this.#age - other.#age;
}
}
const p1 = new Person(20);
const p2 = new Person(30);
console.log(p1.ageDifference(p2)); // -10
console.log(Person.isPerson(p1)); // true
if (Person.isPerson(p1) && Person.isPerson(p2)) {
console.log(p1.ageDifference(p2)); // -10
}
Es hilft, den folgenden Fall zu verhindern:
const p2 = {};
p1.ageDifference(p2); // TypeError: Cannot read private member #age from an object whose class did not declare it
Ohne den in
Operator müssten Sie einen try...catch
Block verwenden, um zu überprüfen, ob das Objekt das private Element hat.
Sie können dies auch als eine [Symbol.hasInstance]()
Methode der Klasse implementieren, sodass Sie den instanceof
Operator verwenden können, um die gleiche Überprüfung durchzuführen (der standardmäßig nur auf die Existenz von Person.prototype
in der Prototypenkette des Objekts prüft).
class Person {
#age;
constructor(age) {
this.#age = age;
}
static [Symbol.hasInstance](o) {
// Testing `this` to prevent false-positives when
// calling `instanceof SubclassOfPerson`
return this === Person && #age in o;
}
ageDifference(other) {
return this.#age - other.#age;
}
}
const p1 = new Person(20);
const p2 = new Person(30);
if (p1 instanceof Person && p2 instanceof Person) {
console.log(p1.ageDifference(p2)); // -10
}
Für weitere Beispiele siehe Private Elemente und den Klassenleitfaden.
Spezifikationen
Specification |
---|
ECMAScript® 2026 Language Specification # sec-relational-operators |