for...in
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since иÑÐ»Ñ 2015 г..
Цикл for...in пÑоÑ
Ð¾Ð´Ð¸Ñ ÑеÑез пеÑеÑиÑлÑемÑе ÑвойÑÑва обÑекÑа. Ðн пÑойдÑÑ Ð¿Ð¾ ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ Ð¾ÑделÑÐ½Ð¾Ð¼Ñ ÑлеменÑÑ.
СинÑакÑиÑ
for (variable in object) {...
}
ÐпиÑание
Цикл for...in пÑоÑ
Ð¾Ð´Ð¸Ñ ÑолÑко по пеÑеÑиÑлÑемÑм ÑвойÑÑвам. ÐбÑекÑÑ, ÑозданнÑе вÑÑÑоеннÑми конÑÑÑÑкÑоÑами, Ñакими как Array и Object имеÑÑ Ð½ÐµÐ¿ÐµÑеÑиÑлÑемÑе ÑвойÑÑва Ð¾Ñ Object.prototype и String.prototype, напÑимеÑ, Ð¾Ñ String-ÑÑо indexOf(), а Ð¾Ñ Object - меÑод toString(). Цикл пÑойдÑÑ Ð¿Ð¾ вÑем пеÑеÑиÑлÑемÑм ÑвойÑÑвам обÑекÑа, а Ñакже Ñем, ÑÑо он ÑнаÑледÑÐµÑ Ð¾Ñ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа пÑоÑоÑипа (ÑвойÑÑва обÑекÑа в Ñепи пÑоÑоÑипа).
Удаление, добавление и модиÑикаÑÐ¸Ñ ÑвойÑÑв
Цикл for...in пÑоÑ
Ð¾Ð´Ð¸Ñ Ð¿Ð¾ ÑвойÑÑвам в пÑоизволÑном поÑÑдке (Ñм. опеÑаÑÐ¾Ñ delete Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ ÑзнаÑÑ Ð¿Ð¾ÑÐµÐ¼Ñ Ð¿Ð¾ÑÑдок пÑоÑ
ода Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑлиÑаÑÑÑÑ Ð² завиÑимоÑÑи Ð¾Ñ Ð±ÑаÑзеÑа). ÐÑли ÑвойÑÑво изменÑеÑÑÑ Ð·Ð° Ð¾Ð´Ð½Ñ Ð¸ÑеÑаÑиÑ, а заÑем изменÑеÑÑÑ Ñнова, его знаÑением в Ñикле ÑвлÑеÑÑÑ ÐµÐ³Ð¾ поÑледнее знаÑение. СвойÑÑво, ÑдалÑнное до Ñого, как до него доÑÑл Ñикл, не бÑÐ´ÐµÑ ÑÑаÑÑвоваÑÑ Ð² нÑм. СвойÑÑва добавленнÑе в обÑекÑÑ Ð² Ñикле могÑÑ Ð±ÑÑÑ Ð¿ÑопÑÑенÑ. РобÑем, лÑÑÑе не добавлÑÑÑ, изменÑÑÑ Ð¸Ð»Ð¸ ÑдалÑÑÑ ÑвойÑÑво из обÑекÑа во вÑÐµÐ¼Ñ Ð¸ÑеÑаÑии, еÑли по Ð½ÐµÐ¼Ñ ÐµÑÑ Ð½Ðµ пÑоÑли. ÐÐµÑ Ð³Ð°ÑанÑии, ÑÑо добавленное ÑвойÑÑво бÑÐ´ÐµÑ Ð¿Ð¾ÑеÑено Ñиклом, низменное поÑле пÑÐ¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹, а ÑдалÑнное поÑле ÑдалениÑ.
ÐÑоÑ
од по маÑÑÐ¸Ð²Ñ Ð¸ for...in
ÐÑимеÑание:
for...in не ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð´Ð»Ñ Array, где важен поÑÑдок индекÑов.
ÐндекÑÑ Ð¼Ð°ÑÑива - ÑÑо пеÑеÑиÑлÑемÑе ÑвойÑÑва Ñ ÑелоÑиÑленнÑми именами, в оÑÑалÑном они аналогиÑÐ½Ñ ÑвойÑÑвам обÑекÑов. ÐÐµÑ Ð³Ð°ÑанÑии, ÑÑо for...in бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ Ð² конкÑеÑном поÑÑдке. Цикл for...in возвÑаÑÐ°ÐµÑ Ð²Ñе пеÑеÑиÑлÑемÑе ÑвойÑÑва, вклÑÑÐ°Ñ Ð¸Ð¼ÐµÑÑие неÑелоÑиÑлиненнÑе имена и наÑледÑемÑе.
Так как поÑÑдок пÑоÑ
ода завиÑÐ¸Ñ Ð¾Ñ ÑеализаÑии, пÑоÑ
од по маÑÑÐ¸Ð²Ñ Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ пÑоизойÑи в пÑавилÑном поÑÑдке. СледоваÑелÑно лÑÑÑе Ñ ÑиÑловÑми индекÑами иÑполÑзоваÑÑ ÑÐ¸ÐºÐ»Ñ for, Array.prototype.forEach() или for...of, когда пÑоÑ
одим по маÑÑивам, где важен поÑÑдок доÑÑÑпа к ÑвойÑÑвам.
ÐÑÐ¾Ñ Ð¾Ð´ ÑолÑко ÑеÑез ÑобÑÑвеннÑе ÑвойÑÑва
ÐÑли Ð²Ñ Ñ
оÑиÑе ÑаÑÑмаÑÑиваÑÑ ÑолÑко ÑвойÑÑва Ñамого обÑекÑа, а не его пÑоÑоÑипов, иÑполÑзÑйÑе getOwnPropertyNames(), hasOwnProperty() или propertyIsEnumerable. ÐÑоме Ñого, еÑли Ð²Ñ Ð·Ð½Ð°ÐµÑе, ÑÑо не бÑÐ´ÐµÑ Ð²Ð¼ÐµÑаÑелÑÑÑва в код извне, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑаÑÑиÑиÑÑ Ð²ÑÑÑоеннÑе пÑоÑоÑÐ¸Ð¿Ñ Ð¼ÐµÑодом пÑовеÑки.
ÐÑимеÑÑ
СледÑÑÑее вÑÑажение беÑÑÑ Ð°ÑгÑменÑом обÑекÑ. ÐаÑем пÑÐ¾Ñ Ð¾Ð´Ð¸Ñ Ð¿Ð¾ вÑем пеÑеÑиÑлимÑм ÑвойÑÑвам обÑекÑа и возвÑаÑÐ°ÐµÑ ÑÑÑÐ¾ÐºÑ ÑодеÑжаÑÑÑ Ð¸Ð¼ÐµÐ½Ð° ÑвойÑÑв и Ð¸Ñ Ð·Ð½Ð°ÑениÑ.
var obj = { a: 1, b: 2, c: 3 };
for (var prop in obj) {
console.log("obj." + prop + " = " + obj[prop]);
}
// ÐÑведеÑ:
// "obj.a = 1"
// "obj.b = 2"
// "obj.c = 3"
СледÑÑÑÐ°Ñ ÑÑнкÑÐ¸Ñ Ð¸Ð»Ð»ÑÑÑÑиÑÑÐµÑ Ð¸ÑполÑзование hasOwnProperty(): наÑледÑемÑе ÑвойÑÑва не оÑобÑажаÑÑÑÑ
var triangle = { a: 1, b: 2, c: 3 };
function ColoredTriangle() {
this.color = "red";
}
ColoredTriangle.prototype = triangle;
var obj = new ColoredTriangle();
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
console.log("obj." + prop + " = " + obj[prop]);
}
}
// ÐÑведеÑ:
// "obj.color = red"
СпеÑиÑикаÑии
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-for-in-and-for-of-statements> |
СовмеÑÑимоÑÑÑ Ñ Ð±ÑаÑзеÑами
ÐоддеÑжка: иниÑиализаÑÐ¾Ñ Ð¿ÐµÑеменнÑÑ
Ðо SpiderMonkey 40, можно бÑло иниÑиализиÑоваÑÑ Ð¿ÐµÑеменнÑе (i = 0) в Ñикле for...in:
var obj = { a: 1, b: 2, c: 3 };
for (var i = 0 in obj) {
console.log(obj[i]);
}
// 1
// 2
// 3
ÐÑо неÑÑандаÑÑное поведение игноÑиÑÑеÑÑÑ Ð² веÑÑии 40 и более поздниÑ
, оно бÑоÑÐ¸Ñ Ð¿ÑедÑпÑеждение SyntaxError ("for-in loop head declarations may not have initializers") в конÑÐ¾Ð»Ñ (Firefox bug 748550 и Firefox bug 1164741).
ÐÑÑгие движки, Ñакие как v8 (Chrome), Chakra (IE/Edge) и JSC (WebKit/Safari) Ñакже ÑобиÑаÑÑÑÑ ÑдалиÑÑ ÑÑо неÑÑандаÑÑное поведение.
СмоÑÑиÑе Ñакже
for...of- Ð¿Ð¾Ñ Ð¾Ð¶Ð¸Ð¹ Ñикл, пÑÐ¾Ñ Ð¾Ð´ÑÑий по знаÑениÑм ÑвойÑÑвfor each in- Ð¿Ð¾Ñ Ð¾Ð¶ÐµÐµ вÑÑажение, но пеÑебиÑÐ°ÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑвойÑÑв, а не Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð° (ÑÑÑаÑело)for- ÐенеÑаÑоÑÑ (иÑполÑзÑÑÑие ÑинÑакÑиÑ
for...in) - ÐеÑеÑиÑлимоÑÑÑ Ð¸ владение ÑвойÑÑвами
Object.getOwnPropertyNames()Object.prototype.hasOwnProperty()Array.prototype.forEach()