Get to know MDN better
This page was translated from English by the community. Learn more and join the MDN Web Docs community.
This feature is well established and works across many devices and browser versions. It’s been available across browsers since июль 2015 г..
Оператор in возвращает true, если свойство содержится в указанном объекте или в его цепочке прототипов.
Оператор in не может быть использован для поиска значений в других видах коллекций. Чтобы проверить, существует ли определённое значение в массиве, можно использовать Array.prototype.includes(). А у наборов есть метод Set.prototype.has().
Строковое или символьное значение, представляющее название свойства (несимвольные значения будут преобразованы в строки). Также может быть именем приватного свойства.
objectОбъект, для которого будет производится проверка, содержит ли он (или его цепочка прототипов) свойство с указанным именем (prop).
Возникает, если object не является объектом (например, является примитивом).
Оператор in проверяет, существует ли указанное свойство в объекте или его цепочке прототипов. Для проверки наличия только собственных свойств следует использовать Object.hasOwn().
Свойство может существовать в объекте, но иметь значение undefined. Поэтому x in obj не то же самое, что obj.x !== undefined. Для того, чтобы оператор in возвращал значение false, используйте оператор delete вместо присваивания свойству значения undefined.
Также можно использовать оператор in, чтобы проверить, существует ли в объекте приватное поле класса или метод. Оператор in возвращает true, если свойство определено и false в противном случае. Такая проверка называется бренд-чек, потому что in возвращает true только в том случае, когда объект был создан с помощью конструктора класса и имеет доступ к приватным свойствам.
В этом случае используется особый синтаксис: левая сторона оператора in является идентификатором свойства, а не выражением, но без кавычек (иначе это будет свойством с типом строка, а не приватным свойством).
Поскольку обращение к приватным свойствам объекта не связанного с текущим классом приводит к появлению TypeError вместо возвращения undefined, то оператор in позволяет сократить запись такой проверки:
До более короткой:
Оператор in также позволяет избежать необходимости обрабатывать ошибки доступа к несуществующим приватным свойствам.
Однако, оператор in по-прежнему требует предварительно объявлять приватные свойства заранее в окружающем классе, иначе будет выброшена ошибка SyntaxError ("Private field '#x' must be declared in an enclosing class") такая же, как и когда вы пытаетесь получить доступ к необъявленному приватному свойству.
В примере ниже показаны некоторые способы использования оператора in.
Необходимо указать объект справа от оператора in. Например, можно указать строку, созданную с помощью конструктора String, но нельзя использовать строковый литерал.
Если удалить свойство при помощи оператора delete, то оператор in возвратит false для этого свойства.
Если задать свойству значение undefined, а не удалять его, то для этого свойства оператор in вернёт значение true.
Оператор in вернёт false для пустых слотов в массиве, несмотря на то, что прямой доступ к свойству вернёт undefined.
Чтобы избежать подобного, следует заполнять новый массив непустыми значениями и не записывать значения по индексам, превышающим длину массива.
Оператор in возвратит true для свойств, которые унаследованы по цепочке прототипов. Это может быть нежелательно при использовании объектов для хранения произвольных пар ключ-значение.
Можно использовать Object.hasOwn(), чтобы проверить, существует ли в объекте данный ключ.
Также можно использовать объект с прототипом null или Map, чтобы избежать других ошибок.
Фрагмент кода ниже демонстрирует статическую функцию, которая проверяет, был ли объект создан конструктором класса Person, и следовательно безопасно ли использовать методы этого класса.
Это помогает предотвратить следующую ошибку:
Без оператора in пришлось бы использовать блок try...catch, чтобы проверить, есть ли в объекте приватное свойство.
Также это можно реализовать с помощью метода класса @@hasInstance, и в дальнейшем использовать оператор instanceof для выполнения такой же проверки (которая по умолчанию проверяет только наличие Person.prototype в цепочке прототипов объекта).
Дополнительные примеры есть в разделе «Приватные свойства» и в руководстве по классам.
| ECMAScript® 2027 Language Specification # sec-relational-operators |
Enable JavaScript to view this browser compatibility table.
This page was last modified on 27 июл. 2025 г. by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.