Baseline Widely available
Цикл for...in
пÑоÑ
Ð¾Ð´Ð¸Ñ ÑеÑез пеÑеÑиÑлÑемÑе ÑвойÑÑва обÑекÑа. Ðн пÑойдÑÑ Ð¿Ð¾ ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ Ð¾ÑделÑÐ½Ð¾Ð¼Ñ ÑлеменÑÑ.
for (variable in object) {... }
variable
ÐÑÑгое (оÑеÑедное) Ð¸Ð¼Ñ ÑвойÑÑва назнаÑаеÑÑÑ Ð¿ÐµÑеменной на каждой иÑеÑаÑии.
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"
СпеÑиÑикаÑии СовмеÑÑимоÑÑÑ Ñ Ð±ÑаÑзеÑами ÐоддеÑжка: иниÑиализаÑÐ¾Ñ Ð¿ÐµÑеменнÑÑ
Ðо 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()
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