page(Doc) not found /ru/docs/Web/JavaScript/Guide/Details_of_the_Object_Model
ÐбÑабоÑка каждого ÑлеменÑа коллекÑии ÑвлÑеÑÑÑ Ð²ÐµÑÑма ÑаÑпÑоÑÑÑанÑнной опеÑаÑией. JavaScript пÑедоÑÑавлÑÐµÑ Ð½ÐµÑколÑко ÑпоÑобов пеÑебоÑа коллекÑии, Ð¾Ñ Ð¿ÑоÑÑого Ñикла for
до map()
, filter()
и array comprehensions. ÐÑеÑаÑоÑÑ Ð¸ генеÑаÑоÑÑ Ð²Ð½ÐµÐ´ÑÑÑÑ ÐºÐ¾Ð½ÑепÑÐ¸Ñ Ð¿ÐµÑебоÑа непоÑÑедÑÑвенно в ÑдÑо ÑзÑка и обеÑпеÑиваÑÑ Ð¼ÐµÑ
анизм наÑÑÑойки Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ for...of
Ñиклов.
ÐодÑобнее Ñм. Ñакже:
for...of
function*
и Generator
yield
и yield*
ÐбÑÐµÐºÑ ÑвлÑеÑÑÑ Ð¸ÑеÑаÑоÑом, еÑли он ÑÐ¼ÐµÐµÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº ÑлеменÑам коллекÑии по Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð·Ð° Ñаз, пÑи ÑÑом оÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ñ ÑÐ²Ð¾Ñ ÑекÑÑее положение внÑÑÑи ÑÑой поÑледоваÑелÑноÑÑи. Ð JavaScript иÑеÑаÑÐ¾Ñ - ÑÑо обÑекÑ, коÑоÑÑй пÑедоÑÑавлÑÐµÑ Ð¼ÐµÑод next(), возвÑаÑаÑÑий ÑледÑÑÑий ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑи. ÐÑÐ¾Ñ Ð¼ÐµÑод возвÑаÑÐ°ÐµÑ Ð¾Ð±ÑÐµÐºÑ Ñ Ð´Ð²ÑÐ¼Ñ ÑвойÑÑвами: done и value.
ÐоÑле ÑозданиÑ, обÑекÑ-иÑеÑаÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñвно иÑполÑзован, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð²Ñзовов меÑода next().
function makeIterator(array) {
var nextIndex = 0;
return {
next: function () {
return nextIndex < array.length
? { value: array[nextIndex++], done: false }
: { done: true };
},
};
}
ÐоÑле иниÑиализаÑии, меÑод next() Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñзван Ð´Ð»Ñ Ð¿Ð¾Ð¾ÑеÑÑдного доÑÑÑпа к паÑам клÑÑ-знаÑение в обÑекÑе:
var it = makeIterator(["yo", "ya"]);
console.log(it.next().value); // 'yo'
console.log(it.next().value); // 'ya'
console.log(it.next().done); // true
ÐенеÑаÑоÑÑ
Ð Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº полÑзоваÑелÑÑкие иÑеÑаÑоÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð²ÐµÑÑма полезнÑ, пÑи Ð¸Ñ Ð¿ÑогÑаммиÑовании ÑÑебÑеÑÑÑ ÑделÑÑÑ ÑеÑÑÑзное внимание поддеÑжке внÑÑÑеннего ÑоÑÑоÑниÑ. ÐенеÑаÑоÑÑ Ð¿ÑедоÑÑавлÑÑÑ Ð¼Ð¾ÑнÑÑ Ð°Ð»ÑÑеÑнаÑивÑ: они позволÑÑÑ Ð¾Ð¿ÑеделиÑÑ Ð°Ð»Ð³Ð¾ÑиÑм пеÑебоÑа, напиÑав единÑÑвеннÑÑ ÑÑнкÑиÑ, коÑоÑÐ°Ñ ÑÐ¼ÐµÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ ÑобÑÑвенное ÑоÑÑоÑние.
ÐенеÑаÑоÑÑ - ÑÑо ÑпеÑиалÑнÑй Ñип ÑÑнкÑии, коÑоÑÑй ÑабоÑÐ°ÐµÑ ÐºÐ°Ðº ÑабÑика иÑеÑаÑоÑов. ФÑнкÑÐ¸Ñ ÑÑановиÑÑÑ Ð³ÐµÐ½ÐµÑаÑоÑом, еÑли ÑодеÑÐ¶Ð¸Ñ Ð¾Ð´Ð¸Ð½ или более yield
опеÑаÑоÑов и иÑполÑзÑÐµÑ function*
ÑинÑакÑиÑ.
function* idMaker() {
var index = 0;
while (true) yield index++;
}
var it = idMaker();
console.log(it.next().value); // 0
console.log(it.next().value); // 1
console.log(it.next().value); // 2
// ...
ÐÑеÑиÑÑемÑе обÑекÑÑ
ÐбÑÐµÐºÑ ÑвлÑеÑÑÑ Ð¸ÑеÑиÑÑемÑм, еÑли в нем опÑеделÑн ÑпоÑоб пеÑебоÑа знаÑений, Ñо еÑÑÑ, напÑимеÑ, как знаÑÐµÐ½Ð¸Ñ Ð¿ÐµÑебиÑаÑÑÑÑ Ð² конÑÑÑÑкÑии for..of
. ÐекоÑоÑÑе вÑÑÑоеннÑе ÑипÑ, Ñакие как Array
или Map
, по ÑмолÑÐ°Ð½Ð¸Ñ ÑвлÑÑÑÑÑ Ð¸ÑеÑиÑÑемÑми, в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº дÑÑгие ÑипÑ, как, напÑимеÑ, Object
, ÑаковÑми не ÑвлÑÑÑÑÑ.
ЧÑÐ¾Ð±Ñ Ð±ÑÑÑ Ð¸ÑеÑиÑÑемÑм, обÑÐµÐºÑ Ð¾Ð±Ñзан ÑеализоваÑÑ Ð¼ÐµÑод @@iterator, ÑÑо ознаÑаеÑ, ÑÑо он (или один из обÑекÑов вÑÑе по ÑепоÑке пÑоÑоÑипов) обÑзан имеÑÑ ÑвойÑÑво Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ Symbol.iterator
:
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ ÑоздаÑÑ Ñвои ÑобÑÑвеннÑе иÑеÑиÑÑемÑе обÑекÑÑ Ñак:
var myIterable = {};
myIterable[Symbol.iterator] = function* () {
yield 1;
yield 2;
yield 3;
};
[...myIterable]; // [1, 2, 3]
ÐÑÑÑоеннÑе иÑеÑиÑÑемÑе обÑекÑÑ
ÐбÑекÑÑ String
, Array
, TypedArray
, Map
и Set
ÑвлÑÑÑÑÑ Ð¸ÑеÑиÑÑемÑми, поÑÐ¾Ð¼Ñ ÑÑо иÑ
пÑоÑоÑÐ¸Ð¿Ñ ÑодеÑÐ¶Ð°Ñ Ð¼ÐµÑод Symbol.iterator
.
ÐекоÑоÑÑе вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑабоÑаÑÑ Ñ Ð¸ÑеÑиÑÑемÑми обÑекÑами, напÑимеÑ, for-of
ÑиклÑ, spread operator, yield*
, и destructuring assignment.
for (let value of ["a", "b", "c"]) {
console.log(value);
}
// "a"
// "b"
// "c"
[..."abc"]; // ["a", "b", "c"]
function* gen() {
yield* ["a", "b", "c"];
}
gen().next()[(a, b, c)] = // { value:"a", done:false }
new Set(["a", "b", "c"]);
a; // "a"
ÐÑодвинÑÑÑе генеÑаÑоÑÑ
ÐенеÑаÑоÑÑ Ð²ÑÑиÑлÑÑÑ ÑезÑлÑÑаÑÑ ÑÐ²Ð¾Ð¸Ñ yield вÑÑажений по ÑÑебованиÑ, ÑÑо позволÑÐµÑ Ð¸Ð¼ ÑÑÑекÑивно ÑабоÑаÑÑ Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑÑми Ñ Ð²ÑÑокой вÑÑиÑлиÑелÑной ÑложноÑÑÑÑ, или даже Ñ Ð±ÐµÑконеÑнÑми поÑледоваÑелÑноÑÑÑми, как пÑодемонÑÑÑиÑовано вÑÑе.
ÐеÑод
next()
Ñакже пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð·Ð½Ð°Ñение, коÑоÑое Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð½ÑÑÑеннего ÑоÑÑоÑÐ½Ð¸Ñ Ð³ÐµÐ½ÐµÑаÑоÑа. ÐнаÑение, пеÑеданное в next(), бÑÐ´ÐµÑ ÑаÑÑмаÑÑиваÑÑÑÑ ÐºÐ°Ðº ÑезÑлÑÑÐ°Ñ Ð¿Ð¾Ñледнего yield вÑÑажениÑ, коÑоÑое пÑиоÑÑановило генеÑаÑоÑ.
ÐÐ¾Ñ Ð³ÐµÐ½ÐµÑаÑÐ¾Ñ ÑиÑел ФибонаÑÑи, иÑполÑзÑÑÑий next(x)
Ð´Ð»Ñ Ð¿ÐµÑезапÑÑка поÑледоваÑелÑноÑÑи:
function* fibonacci() {
var fn1 = 1;
var fn2 = 1;
while (true) {
var current = fn2;
fn2 = fn1;
fn1 = fn1 + current;
var reset = yield current;
if (reset) {
fn1 = 1;
fn2 = 1;
}
}
}
var sequence = fibonacci();
console.log(sequence.next().value); // 1
console.log(sequence.next().value); // 1
console.log(sequence.next().value); // 2
console.log(sequence.next().value); // 3
console.log(sequence.next().value); // 5
console.log(sequence.next().value); // 8
console.log(sequence.next().value); // 13
console.log(sequence.next(true).value); // 1
console.log(sequence.next().value); // 1
console.log(sequence.next().value); // 2
console.log(sequence.next().value); // 3
ÐÑимеÑание: ÐнÑеÑеÑно, ÑÑо вÑзов next(undefined)
ÑавноÑилен вÑÐ·Ð¾Ð²Ñ next()
. ÐÑи ÑÑом вÑзов next() Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ генеÑаÑоÑа Ñ Ð»ÑбÑм аÑгÑменÑом, кÑоме undefined, ÑпÑовоÑиÑÑÐµÑ Ð¸ÑклÑÑение TypeError
.
Ðожно заÑÑавиÑÑ Ð³ÐµÐ½ÐµÑаÑÐ¾Ñ Ð²ÑбÑоÑиÑÑ Ð¸ÑклÑÑение, вÑзвав его меÑод throw()
и пеÑедав в каÑеÑÑве паÑамеÑÑа знаÑение иÑклÑÑениÑ, коÑоÑое должно бÑÑÑ Ð²ÑбÑоÑено. ÐÑо иÑклÑÑение бÑÐ´ÐµÑ Ð²ÑбÑоÑено из ÑекÑÑего пÑиоÑÑановленного конÑекÑÑа генеÑаÑоÑа Ñак, бÑдÑо ÑекÑÑий пÑиоÑÑановленнÑй yield
опеÑаÑÐ¾Ñ ÑвлÑлÑÑ throw
опеÑаÑоÑом.
ÐÑли yield
опеÑаÑÐ¾Ñ Ð½Ðµ вÑÑÑеÑаеÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð¾Ð±ÑабоÑки вÑбÑоÑенного иÑклÑÑениÑ, Ñо иÑклÑÑение пеÑедаÑÑÑÑ Ð²ÑÑе ÑеÑез вÑзов throw()
, и ÑезÑлÑÑаÑом поÑледÑÑÑиÑ
вÑзовов next()
бÑÐ´ÐµÑ ÑвойÑÑво done
Ñавное true
.
У генеÑаÑоÑов еÑÑÑ Ð¼ÐµÑод return(value)
, коÑоÑÑй возвÑаÑÐ°ÐµÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ðµ знаÑение и оÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÑабоÑÑ Ð³ÐµÐ½ÐµÑаÑоÑа.
page(Doc) not found /ru/docs/Web/JavaScript/Guide/Details_of_the_Object_Model
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