Baseline Widely available
ÐпеÑаÑÐ¾Ñ in
возвÑаÑÐ°ÐµÑ true
, еÑли ÑвойÑÑво ÑодеÑжиÑÑÑ Ð² Ñказанном обÑекÑе или в его ÑепоÑке пÑоÑоÑипов.
ÐпеÑаÑÐ¾Ñ in
не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзован Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка знаÑений в дÑÑгиÑ
видаÑ
коллекÑий. ЧÑÐ¾Ð±Ñ Ð¿ÑовеÑиÑÑ, ÑÑÑеÑÑвÑÐµÑ Ð»Ð¸ опÑеделÑнное знаÑение в маÑÑиве, можно иÑполÑзоваÑÑ Array.prototype.includes()
. Ð Ñ Ð½Ð°Ð±Ð¾Ñов еÑÑÑ Ð¼ÐµÑод Set.prototype.has()
.
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"
СинÑакÑиÑ
prop in object
#prop in object
ÐаÑамеÑÑÑ
prop
СÑÑоковое или ÑимволÑное знаÑение, пÑедÑÑавлÑÑÑее название ÑвойÑÑва (неÑимволÑнÑе знаÑÐµÐ½Ð¸Ñ Ð±ÑдÑÑ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ñ Ð² ÑÑÑоки). Также Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸Ð¼ÐµÐ½ÐµÐ¼ пÑиваÑного ÑвойÑÑва.
object
ÐбÑекÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑого бÑÐ´ÐµÑ Ð¿ÑоизводиÑÑÑ Ð¿ÑовеÑка, ÑодеÑÐ¶Ð¸Ñ Ð»Ð¸ он (или его ÑепоÑка пÑоÑоÑипов) ÑвойÑÑво Ñ ÑказаннÑм именем (prop
).
TypeError
:
ÐозникаеÑ, еÑли 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
позволÑÐµÑ ÑокÑаÑиÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ñакой пÑовеÑки:
class C {
#x;
static isC(obj) {
try {
obj.#x;
return true;
} catch {
return false;
}
}
}
Ðо более коÑоÑкой:
class C {
#x;
static isC(obj) {
return #x in obj;
}
}
ÐпеÑаÑÐ¾Ñ in
Ñакже позволÑÐµÑ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑи обÑабаÑÑваÑÑ Ð¾Ñибки доÑÑÑпа к неÑÑÑеÑÑвÑÑÑим пÑиваÑнÑм ÑвойÑÑвам.
Ðднако, опеÑаÑÐ¾Ñ in
по-пÑÐµÐ¶Ð½ÐµÐ¼Ñ ÑÑебÑÐµÑ Ð¿ÑедваÑиÑелÑно обÑÑвлÑÑÑ Ð¿ÑиваÑнÑе ÑвойÑÑва заÑанее в окÑÑжаÑÑем клаÑÑе, инаÑе бÑÐ´ÐµÑ Ð²ÑбÑоÑена оÑибка SyntaxError
("Private field '#x' must be declared in an enclosing class") ÑÐ°ÐºÐ°Ñ Ð¶Ðµ, как и когда Ð²Ñ Ð¿ÑÑаеÑеÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´Ð¾ÑÑÑп к необÑÑÐ²Ð»ÐµÐ½Ð½Ð¾Ð¼Ñ Ð¿ÑиваÑÐ½Ð¾Ð¼Ñ ÑвойÑÑвÑ.
class C {
foo() {
#x in this;
}
}
new C().foo(); // SyntaxError: Private field '#x' must be declared in an enclosing class
ÐÑимеÑÑ ÐбÑÑное иÑполÑзование
РпÑимеÑе ниже Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð½ÐµÐºÐ¾ÑоÑÑе ÑпоÑÐ¾Ð±Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑа in
.
// ÐаÑÑивÑ
const trees = ["redwood", "bay", "cedar", "oak", "maple"];
0 in trees; // true
3 in trees; // true
6 in trees; // false
"bay" in trees; // false (необÑ
одимо ÑказаÑÑ Ð¸Ð½Ð´ÐµÐºÑ ÑлеменÑа в маÑÑиве, а не знаÑение)
"length" in trees; // true (length ÑвлÑеÑÑÑ ÑвойÑÑвом Array)
Symbol.iterator in trees; // true
// Уже ÑÑÑеÑÑвÑÑÑие обÑекÑÑ
"PI" in Math; // true
// ÐолÑзоваÑелÑÑкие обÑекÑÑ
const mycar = { make: "Honda", model: "Accord", year: 1998 };
"make" in mycar; // true
"model" in mycar; // true
ÐеобÑ
одимо ÑказаÑÑ Ð¾Ð±ÑÐµÐºÑ ÑпÑава Ð¾Ñ Ð¾Ð¿ÐµÑаÑоÑа in
. ÐапÑимеÑ, можно ÑказаÑÑ ÑÑÑокÑ, ÑозданнÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа String
, но нелÑÐ·Ñ Ð¸ÑполÑзоваÑÑ ÑÑÑоковÑй лиÑеÑал.
const color1 = new String("green");
"length" in color1; // true
const color2 = "coral";
// ÑгенеÑиÑÑÐµÑ Ð¾ÑÐ¸Ð±ÐºÑ (color2 не ÑвлÑеÑÑÑ Ð¾Ð±ÑекÑом String)
"length" in color2;
ÐÑполÑзование опеÑаÑоÑа in
Ñ Ð½ÐµÐ¾Ð¿ÑеделÑннÑми или Ñ Ñже ÑдалÑннÑми ÑвойÑÑвами
ÐÑли ÑдалиÑÑ ÑвойÑÑво пÑи помоÑи опеÑаÑоÑа delete
, Ñо опеÑаÑÐ¾Ñ in
возвÑаÑÐ¸Ñ false
Ð´Ð»Ñ ÑÑого ÑвойÑÑва.
const mycar = { make: "Honda", model: "Accord", year: 1998 };
delete mycar.make;
"make" in mycar; // false
const trees = ["redwood", "bay", "cedar", "oak", "maple"];
delete trees[3];
3 in trees; // false
ÐÑли задаÑÑ ÑвойÑÑÐ²Ñ Ð·Ð½Ð°Ñение undefined
, а не ÑдалÑÑÑ ÐµÐ³Ð¾, Ñо Ð´Ð»Ñ ÑÑого ÑвойÑÑва опеÑаÑÐ¾Ñ in
веÑнÑÑ Ð·Ð½Ð°Ñение true
.
const mycar = { make: "Honda", model: "Accord", year: 1998 };
mycar.make = undefined;
"make" in mycar; // true
const trees = ["redwood", "bay", "cedar", "oak", "maple"];
trees[3] = undefined;
3 in trees; // true
ÐпеÑаÑÐ¾Ñ in
веÑнÑÑ false
Ð´Ð»Ñ Ð¿ÑÑÑÑÑ
ÑлоÑов в маÑÑиве, неÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо пÑÑмой доÑÑÑп к ÑвойÑÑÐ²Ñ Ð²ÐµÑнÑÑ undefined
.
const empties = new Array(3);
empties[2]; // undefined
2 in empties; // false
ЧÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾Ð³Ð¾, ÑледÑÐµÑ Ð·Ð°Ð¿Ð¾Ð»Ð½ÑÑÑ Ð½Ð¾Ð²Ñй маÑÑив непÑÑÑÑми знаÑениÑми и не запиÑÑваÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ индекÑам, пÑевÑÑаÑÑим Ð´Ð»Ð¸Ð½Ñ Ð¼Ð°ÑÑива.
const empties = new Array(3).fill(undefined);
2 in empties; // true
ÐаÑледÑемÑе ÑвойÑÑва
ÐпеÑаÑÐ¾Ñ in
возвÑаÑÐ¸Ñ true
Ð´Ð»Ñ ÑвойÑÑв, коÑоÑÑе ÑнаÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ñ Ð¿Ð¾ ÑепоÑке пÑоÑоÑипов. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÐ¶ÐµÐ»Ð°ÑелÑно пÑи иÑполÑзовании обÑекÑов Ð´Ð»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¿ÑоизволÑнÑÑ
Ð¿Ð°Ñ ÐºÐ»ÑÑ-знаÑение.
const ages = { alice: 18, bob: 27 };
function hasPerson(name) {
return name in ages;
}
hasPerson("hasOwnProperty"); // true
Ðожно иÑполÑзоваÑÑ Object.hasOwn()
, ÑÑÐ¾Ð±Ñ Ð¿ÑовеÑиÑÑ, ÑÑÑеÑÑвÑÐµÑ Ð»Ð¸ в обÑекÑе даннÑй клÑÑ.
const ages = { alice: 18, bob: 27 };
function hasPerson(name) {
return Object.hasOwn(ages, name);
}
hasPerson("hasOwnProperty"); // false
Также можно иÑполÑзоваÑÑ Ð¾Ð±ÑÐµÐºÑ Ñ Ð¿ÑоÑоÑипом null или Map
, ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð´ÑÑгиÑ
оÑибок.
const ages = new Map([
["alice", 18],
["bob", 27],
]);
function hasPerson(name) {
return ages.has(name);
}
hasPerson("hasOwnProperty"); // false
ÐÑполÑзование опеÑаÑоÑа in
Ð´Ð»Ñ ÑеализаÑии бÑенд-Ñека
ФÑÐ°Ð³Ð¼ÐµÐ½Ñ ÐºÐ¾Ð´Ð° ниже демонÑÑÑиÑÑÐµÑ ÑÑаÑиÑеÑкÑÑ ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð¿ÑовеÑÑеÑ, бÑл ли обÑÐµÐºÑ Ñоздан конÑÑÑÑкÑоÑом клаÑÑа Person
, и ÑледоваÑелÑно безопаÑно ли иÑполÑзоваÑÑ Ð¼ÐµÑÐ¾Ð´Ñ ÑÑого клаÑÑа.
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
}
ÐÑо Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ Ð¿ÑедоÑвÑаÑиÑÑ ÑледÑÑÑÑÑ Ð¾ÑибкÑ:
const p2 = {};
p1.ageDifference(p2); // TypeError: Cannot read private member #age from an object whose class did not declare it
Ðез опеÑаÑоÑа in
пÑиÑлоÑÑ Ð±Ñ Ð¸ÑполÑзоваÑÑ Ð±Ð»Ð¾Ðº try...catch
, ÑÑÐ¾Ð±Ñ Ð¿ÑовеÑиÑÑ, еÑÑÑ Ð»Ð¸ в обÑекÑе пÑиваÑное ÑвойÑÑво.
Также ÑÑо можно ÑеализоваÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¼ÐµÑода клаÑÑа @@hasInstance
, и в далÑнейÑем иÑполÑзоваÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ instanceof
Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñакой же пÑовеÑки (коÑоÑÐ°Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð¿ÑовеÑÑÐµÑ ÑолÑко налиÑие Person.prototype
в ÑепоÑке пÑоÑоÑипов обÑекÑа).
class Person {
#age;
constructor(age) {
this.#age = age;
}
static [Symbol.hasInstance](o) {
// ÐÑовеÑÑем `this` Ð´Ð»Ñ Ð¿ÑедоÑвÑаÑÐµÐ½Ð¸Ñ Ð»Ð¾Ð¶Ð½Ð¾-положиÑелÑнÑÑ
// ÑезÑлÑÑаÑов пÑи вÑзове `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
}
ÐополниÑелÑнÑе пÑимеÑÑ ÐµÑÑÑ Ð² Ñазделе «ÐÑиваÑнÑе ÑвойÑÑва» и в ÑÑководÑÑве по клаÑÑам.
СпеÑиÑикаÑии СовмеÑÑимоÑÑÑ Ñ Ð±ÑаÑзеÑами СмоÑÑиÑе ÑакжеRetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4