Table des matières
Introduction
1 Sujet principal
1.1 Comportement de base
1.2 Implémentation simple
1.3 return & throw
2 Support natif
2.1 Traverseur de maintien par défaut
2.2 默认调用遍历器
Maison interface Web js tutoriel Iterator est une méthode d'interface unifiée pour accéder aux collections de données.

Iterator est une méthode d'interface unifiée pour accéder aux collections de données.

Jul 20, 2018 am 10:15 AM
es6 iterator javascript 前端 接口

Cet article vous présente la méthode d'interface unifiée pour accéder à la collecte de données par Iterator. Elle a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Introduction

TraverserIterator est une interface unifiée fournie par ES6 pour accéder aux collections de données. Pour toute collecte de données disposant d'une interface Traverser déployée en interne, les utilisateurs peuvent obtenir la structure de données correspondante de la même manière. Si vous utilisez la dernière version du navigateur Chrome, alors vous devez savoir que la Miss Argument que nous connaissons a tranquillement ouvert un autre chemin vers son cœur.

1 Sujet principal

Une certaine collection de données déploie l'interface Iterator, ce qui signifie que son attribut Symbol.iterator pointe vers une fonction qui renvoie l'interface Iterator. Toute méthode qui utilise un traverseur par défaut pour accéder à une collection de données appellera cette propriété pour obtenir l'objet traverseur, puis accédera aux membres de la structure de données dans l'ordre défini (voir la lecture étendue dans la dernière section pour Symbol.iterator) . Par exemple, le traverseur d'un tableau natif est [][Symbol.iterator], et Array.prototype[Symbol.iterator] peut également être obtenu directement via le prototype de son constructeur.

1.1 Comportement de base

L'appel de l'interface Iterator renverra un nouvel objet traverseur (objet pointeur). Il doit y avoir une méthode
dans l'objet next, qui est utilisée pour accéder au membre de données suivant. Le pointeur pointe initialement vers le début de la structure de données actuelle.

La première fois que la méthode next de l'objet est appelée, le pointeur pointe vers le premier membre de la structure de données.
La deuxième fois que la méthode next de l'objet est appelée, le pointeur pointe vers le deuxième membre de la structure de données.
Appelle en continu la méthode next de l'objet jusqu'à ce qu'elle pointe vers la fin de la structure de données.

Chaque fois que la méthode next est appelée, la même structure de données sera renvoyée : { value, done }.
value représente la valeur pointant actuellement vers le membre, sinon, c'est undefined.
done est une valeur booléenne, indiquant si le parcours se termine, la fin est true, sinon false.

Le standard de l'interface traverser est très simple et ne fournit pas de méthodes telles que faire fonctionner des pointeurs internes, déterminer s'il y a une valeur, etc. Continuez simplement à appeler la méthode next, obtenez le done actuel lorsque false est value et arrêtez-vous lorsque done est true. La première fois que je suis entré en contact avec le comportement du traverseur, c'était à l'hiver 2016. À cette époque, je n'avais pas suffisamment d'expérience pour comprendre l'applicabilité et le pouvoir de la simplicité. Ce n'est que maintenant, juste avant d'être sur le point de faire mes valises et d'être obligé de quitter l'entreprise, que je me suis soudainement réveillé. Quelle douloureuse prise de conscience.

let iterator = [1, 2, 3][Symbol.iterator]();

console.log( iterator.next() ); // {value: 1, done: false}
console.log( iterator.next() ); // {value: 2, done: false}
console.log( iterator.next() ); // {value: 3, done: false}
console.log( iterator.next() ); // {value: undefined, done: true}
Copier après la connexion

1.2 Implémentation simple

Pour différentes structures de données, il existe différentes méthodes d'implémentation du traverseur. Nous implémentons simplement la méthode du traverseur de tableau.

let res = null;
let iterator = myIterator([3, 7]);

console.log( iterator.next() ); // {value: 3, done: false}
console.log( iterator.next() ); // {value: 7, done: false}
console.log( iterator.next() ); // {value: undefined, done: true}

function myIterator(array = []) {
  let index = 0;
  return {
    next() {
      return index < array.length 
        ? { value: array[index++], done: false }
        : { value: undefined, done: true };
    }
  };
}
Copier après la connexion

1.3 return & throw

En plus de déployer la méthode next pour l'objet traverseur, il peut également y avoir des méthodes return et throw. La méthode return sera appelée lors de la sortie anticipée de la boucle for of (généralement à cause d'une erreur ou du déclenchement de l'instruction break). La méthode throw est principalement utilisée en conjonction avec la fonction Generator Les objets traverseurs généraux n'utilisent pas cette méthode, elle ne sera donc pas présentée.

let obj = {
  [Symbol.iterator]() {
    let index = 0;
    let array = [1, 2, 3];

    return {
      next() {
        return index < array.length 
          ? { value: array[index++], done: false }
          : { value: undefined, done: true };
      },
      return() {
        console.log(&#39;Trigger return.&#39;);
        return {};
      }
    };
  }
};

for (let v of obj) {
  console.log(v); // 打印出:1, 2, 3,没触发 return 函数。
}

for (let v of obj) {
  if (v === 2) break;
  console.log(v); // 打印出:1,之后触发 return 函数。
}

for (let v of obj) {
  if (v === 3) break;
  console.log(v); // 打印出:1, 2,之后触发 return 函数。
}

for (let v of obj) {
  if (v === 4) break;
  console.log(v); // 打印出:1, 2, 3,没触发 return 函数。
}

for (let v of obj) {
  if (v === 2) throw Error(&#39;error&#39;);
  console.log(v); // 打印出:1,之后触发 return 函数,并报错停止执行。
}
Copier après la connexion

2 Support natif

2.1 Traverseur de maintien par défaut

Les structures de données de l'interface de traverseur de maintien par défaut natif sont :
Type de base : Array, Set, Map (quatre ensembles de données de base : Array, Object, Set et Map).
Objets de type tableau : arguments, NodeList, String.

let iterator = &#39;123&#39;[Symbol.iterator]();

console.log( iterator.next() ); // {value: "1", done: false}
console.log( iterator.next() ); // {value: "2", done: false}
console.log( iterator.next() ); // {value: "3", done: false}
console.log( iterator.next() ); // {value: undefined, done: true}
Copier après la connexion

Traverseurs et méthodes de traversée précédentes
Ce n'est pas parce qu'une collection de données a une interface de traversée que toutes les méthodes qui la traversent utilisent cette interface. En fait, seules quelques nouvelles méthodes et certaines méthodes ajoutées dans ES6 seront utilisées, qui seront présentées ci-dessous. Pour les tableaux, l'utilisation de for et for of peut accéder aux mêmes membres, mais les opérations réelles sont différentes.

// 改变数组默认的遍历器接口。
Array.prototype[Symbol.iterator] = function () {
  let index = 0;
  let array = this;

  console.log(&#39;Use iterator&#39;);

  return {
    next() {
      return index < array.length 
        ? { value: array[index++], done: false }
        : { value: undefined, done: true };
    }
  }
};

let arr = [1, 2];

for (let v of arr) {
  console.log(v); // 打印出 Use iterator, 1, 2。
}

for (let i = 0; i < arr.length; i++) {
  console.log(arr[i]); // 打印出 1, 2。
}

arr.forEach(d => {
  console.log(d); // 打印出 1, 2。
});
Copier après la connexion

L'objet n'a pas d'interface traverseur par défaut
Pourquoi l'objet n'a-t-il pas d'interface traverseur par défaut ? Cela doit être expliqué sous deux aspects. Premièrement, le traverseur est une structure de traitement linéaire.Pour toute structure de données non linéaire, déployer l'interface traverseur équivaut à déployer une transformation linéaire. Deuxièmement, l'objet est à l'origine une collection non ordonnée. Si vous souhaitez qu'il soit ordonné, vous pouvez utiliser Map à la place. Cela signifie que chacun a ses propres atouts et chacun a ses propres devoirs. Si le bousier ne roule pas la boule de fumier et ne va pas chercher du miel, alors, eh bien, la bouquetière pourrait en souffrir.

自行生成的类数组对象(拥有length属性),不具备遍历器接口。这与String等原生类数组对象不同,毕竟人家是亲生的,一出生就含着金钥匙(也不怕误吞)。不过我们可以将数组的遍历器接口直接应用于自行生成的类数组对象,简单有效无副作用。

let obj = {
  0: 'a',
  1: 'b',
  length: 2,
  [Symbol.iterator]: Array.prototype[Symbol.iterator]
};

let iterator = obj[Symbol.iterator]();
console.log( iterator.next() ); // {value: "a", done: false}
console.log( iterator.next() ); // {value: "b", done: false}
console.log( iterator.next() ); // {value: undefined, done: true}
Copier après la connexion

为对象添加遍历器接口,也不影响之前不使用遍历器的方法,比如for in, Object.keys等等(两者不等同)。

let obj = {
  0: 'a',
  1: 'b',
  length: 2,
  [Symbol.iterator]: Array.prototype[Symbol.iterator]
};

console.log( Object.keys(obj) ); // ["0", "1", "length"]

for (let v of obj) {
  console.log(v); // 依次打印出:"a", "b"。
}

for (let k in obj) {
  console.log(k); // 依次打印出:"0", "1", "length"。
}
Copier après la connexion

2.2 默认调用遍历器

for of  
for of是专门用来消费遍历器的,其遍历的是键值(for in遍历的是键名)。

for (let v of [1, 2, 3])  {
  console.log(v); // 依次打印出:1, 2, 3。
}
Copier après la connexion

扩展运算符  
无论是解构赋值或扩展运算都是默认调用遍历器的。

let [...a] = [3, 2, 1]; // [3, 2, 1]
let b = [...[3, 2, 1]]; // [3, 2, 1]
Copier après la connexion

yield*  
Generator函数中有yield*命令,如果其后面跟的是一个可遍历的结构,它会调用该结构的遍历器接口。

for (let v of G()) {
  console.log(v); // 依次打印出:1, 2, 3, 4, 5
}

function* G() {
  yield 1;
  yield* [2,3,4];
  yield 5;
}
Copier après la connexion

其它场合  
有些接受数组作为参数的函数,会默认使用数组的遍历器接口,所以也等同于默认调用。比如Array.from(), Promise.all()

相关推荐:

angularjs关于页面模板清除的使用方法

在JS中用slice封装数组方法

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Vous avez un jeu croisé?
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quelles sont les interfaces internes d'une carte mère d'ordinateur ? Introduction recommandée aux interfaces internes d'une carte mère d'ordinateur ? Quelles sont les interfaces internes d'une carte mère d'ordinateur ? Introduction recommandée aux interfaces internes d'une carte mère d'ordinateur ? Mar 12, 2024 pm 04:34 PM

Lorsque nous assemblons l'ordinateur, bien que le processus d'installation soit simple, nous rencontrons souvent des problèmes de câblage. Souvent, les utilisateurs branchent par erreur la ligne d'alimentation du radiateur du processeur au SYS_FAN. Bien que le ventilateur puisse tourner, il peut ne pas fonctionner lorsque le ventilateur fonctionne. L'ordinateur est allumé. Il y aura une erreur F1 "CPUFanError", qui empêchera également le refroidisseur du processeur d'ajuster intelligemment la vitesse. Partageons les connaissances communes sur les interfaces CPU_FAN, SYS_FAN, CHA_FAN et CPU_OPT sur la carte mère de l'ordinateur. Science populaire sur les interfaces CPU_FAN, SYS_FAN, CHA_FAN et CPU_OPT sur la carte mère de l'ordinateur 1. CPU_FANCPU_FAN est une interface dédiée pour le radiateur du processeur et fonctionne à 12 V.

Paradigmes de programmation et modèles de conception courants en langage Go Paradigmes de programmation et modèles de conception courants en langage Go Mar 04, 2024 pm 06:06 PM

En tant que langage de programmation moderne et efficace, le langage Go possède de riches paradigmes de programmation et des modèles de conception qui peuvent aider les développeurs à écrire du code maintenable de haute qualité. Cet article présentera les paradigmes de programmation et les modèles de conception courants dans le langage Go et fournira des exemples de code spécifiques. 1. Programmation orientée objet Dans le langage Go, vous pouvez utiliser des structures et des méthodes pour implémenter une programmation orientée objet. En définissant une structure et des méthodes de liaison à la structure, les fonctionnalités orientées objet d'encapsulation de données et de liaison de comportement peuvent être obtenues. packagemaini

PHP et Vue : une combinaison parfaite d'outils de développement front-end PHP et Vue : une combinaison parfaite d'outils de développement front-end Mar 16, 2024 pm 12:09 PM

PHP et Vue : une combinaison parfaite d'outils de développement front-end À l'ère actuelle de développement rapide d'Internet, le développement front-end est devenu de plus en plus important. Alors que les utilisateurs ont des exigences de plus en plus élevées en matière d’expérience des sites Web et des applications, les développeurs front-end doivent utiliser des outils plus efficaces et plus flexibles pour créer des interfaces réactives et interactives. En tant que deux technologies importantes dans le domaine du développement front-end, PHP et Vue.js peuvent être considérés comme une arme parfaite lorsqu'ils sont associés. Cet article explorera la combinaison de PHP et Vue, ainsi que des exemples de code détaillés pour aider les lecteurs à mieux comprendre et appliquer ces deux éléments.

Questions fréquemment posées par les enquêteurs front-end Questions fréquemment posées par les enquêteurs front-end Mar 19, 2024 pm 02:24 PM

Lors des entretiens de développement front-end, les questions courantes couvrent un large éventail de sujets, notamment les bases HTML/CSS, les bases JavaScript, les frameworks et les bibliothèques, l'expérience du projet, les algorithmes et les structures de données, l'optimisation des performances, les requêtes inter-domaines, l'ingénierie front-end, les modèles de conception et les nouvelles technologies et tendances. Les questions de l'intervieweur sont conçues pour évaluer les compétences techniques du candidat, son expérience en matière de projet et sa compréhension des tendances du secteur. Par conséquent, les candidats doivent être parfaitement préparés dans ces domaines pour démontrer leurs capacités et leur expertise.

Introduction aux interfaces PHP et comment les définir Introduction aux interfaces PHP et comment les définir Mar 23, 2024 am 09:00 AM

Introduction à l'interface PHP et à sa définition. PHP est un langage de script open source largement utilisé dans le développement Web. Il est flexible, simple et puissant. En PHP, une interface est un outil qui définit des méthodes communes entre plusieurs classes, réalisant le polymorphisme et rendant le code plus flexible et réutilisable. Cet article présentera le concept des interfaces PHP et comment les définir, et fournira des exemples de code spécifiques pour démontrer leur utilisation. 1. Concept d'interface PHP L'interface joue un rôle important dans la programmation orientée objet, définissant l'application de classe

Explorer la technologie front-end du langage Go : une nouvelle vision du développement front-end Explorer la technologie front-end du langage Go : une nouvelle vision du développement front-end Mar 28, 2024 pm 01:06 PM

En tant que langage de programmation rapide et efficace, le langage Go est très populaire dans le domaine du développement back-end. Cependant, peu de gens associent le langage Go au développement front-end. En fait, l’utilisation du langage Go pour le développement front-end peut non seulement améliorer l’efficacité, mais également ouvrir de nouveaux horizons aux développeurs. Cet article explorera la possibilité d'utiliser le langage Go pour le développement front-end et fournira des exemples de code spécifiques pour aider les lecteurs à mieux comprendre ce domaine. Dans le développement front-end traditionnel, JavaScript, HTML et CSS sont souvent utilisés pour créer des interfaces utilisateur.

Combinaison de Golang et de technologie front-end : découvrez comment Golang joue un rôle dans le domaine front-end Combinaison de Golang et de technologie front-end : découvrez comment Golang joue un rôle dans le domaine front-end Mar 19, 2024 pm 06:15 PM

Combinaison de Golang et de la technologie front-end : pour explorer le rôle de Golang dans le domaine front-end, des exemples de code spécifiques sont nécessaires. Avec le développement rapide d'Internet et des applications mobiles, la technologie front-end est devenue de plus en plus importante. Dans ce domaine, Golang, en tant que puissant langage de programmation back-end, peut également jouer un rôle important. Cet article explorera comment Golang est combiné avec la technologie front-end et démontrera son potentiel dans le domaine front-end à travers des exemples de code spécifiques. Le rôle de Golang dans le domaine front-end est celui d'un outil efficace, concis et facile à apprendre.

Application d'interfaces et de classes abstraites dans les modèles de conception en Java Application d'interfaces et de classes abstraites dans les modèles de conception en Java May 01, 2024 pm 06:33 PM

Les interfaces et les classes abstraites sont utilisées dans les modèles de conception pour le découplage et l'extensibilité. Les interfaces définissent les signatures des méthodes, les classes abstraites fournissent une implémentation partielle et les sous-classes doivent implémenter des méthodes non implémentées. Dans le modèle de stratégie, l'interface est utilisée pour définir l'algorithme, et la classe abstraite ou la classe concrète assure l'implémentation, permettant une commutation dynamique des algorithmes. Dans le modèle d'observateur, les interfaces sont utilisées pour définir le comportement de l'observateur, et les classes abstraites ou concrètes sont utilisées pour s'abonner et publier des notifications. Dans le modèle d'adaptateur, les interfaces sont utilisées pour adapter les classes existantes ou les classes concrètes peuvent implémenter des interfaces compatibles, permettant une interaction avec le code d'origine.

See all articles