Heim > Web-Frontend > js-Tutorial > Was ist der Unterschied zwischen for…in und for…of in JS?

Was ist der Unterschied zwischen for…in und for…of in JS?

青灯夜游
Freigeben: 2020-12-23 10:48:51
nach vorne
4920 Leute haben es durchsucht

Dieser Artikel stellt Ihnen den Unterschied zwischen for...in und for...of in JavaScript vor. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

Was ist der Unterschied zwischen for…in und for…of in JS?

Verwandte Empfehlungen: „Javascript-Video-Tutorial

Der Unterschied zwischen for...in und for...of

1 Beim Durchlaufen eines Arrays wird normalerweise eine for-Schleife verwendet

ES5 Sie können forEach verwenden. ES5 hat die Funktion, Arrays wie Map, Filter, Some, Every, Reduce, ReduceRight usw. zu durchlaufen, aber ihre Rückgabeergebnisse sind unterschiedlich. Aber Wenn Sie foreach verwenden, um das Array zu durchlaufen, können Sie die Schleife nicht mit break unterbrechen und Sie können nicht mit return zur äußeren Funktion zurückkehren.

Array.prototype.method=function(){
  console.log(this.length);
}
var myArray=[1,2,4,5,6,7]
myArray.name="数组"
for (var index in myArray) {
  console.log(myArray[index]);
}
Nach dem Login kopieren

2. Probleme beim Durchlaufen von Arrays

1 Der Index ist eine Zeichenfolgenzahl und kann keine direkten geometrischen Operationen ausführen

2. Die Durchlaufreihenfolge stimmt möglicherweise nicht mit der tatsächlichen Reihenfolge überein array

3 .Die Verwendung von for in durchläuft alle aufzählbaren Eigenschaften des Arrays, einschließlich Prototypen. Zum Beispiel ist die Prototypmethode Methode und das Namensattribut von Shangli

, sodass for in besser zum Durchlaufen von Objekten geeignet ist. Verwenden Sie for in nicht zum Durchlaufen von Arrays.

Wie können wir also zusätzlich zur Verwendung einer for-Schleife das Array einfacher und korrekter durchlaufen, um unsere Erwartungen zu erfüllen (das heißt, ohne die Methode und den Namen zu durchlaufen)? Das for of in ES6 ist noch besser.

Array.prototype.method=function(){
  console.log(this.length);
}
var myArray=[1,2,4,5,6,7]
myArray.name="数组";
for (var value of myArray) {
  console.log(value);
}
Nach dem Login kopieren

Denken Sie daran, dass bei „for“ der Index (d. h. der Schlüsselname) des Arrays durchlaufen wird, während bei „for“ die Werte der Array-Elemente durchlaufen werden.

for durchläuft nur die Elemente im Array, enthält jedoch nicht die Prototypattributmethode und den Indexnamen des Arrays Schlüsselnamen von Objekten

Object.prototype.method=function(){
  console.log(this);
}
var myObject={
  a:1,
  b:2,
  c:3
}
for (var key in myObject) {
  console.log(key);
}
Nach dem Login kopieren

for in können zur Prototypmethode von myObject durchlaufen werden. Wenn Sie die Prototypmethode und -eigenschaften nicht durchlaufen möchten, können Sie sie innerhalb der Schleife beurteilen Eigenschaft ist eine Instanzeigenschaft des Objekts for..of eignet sich zum Durchlaufen von Zahlen/Array-Objekten/Zeichen. String/Map/Set usw. verfügen jedoch über eine Sammlung von Iteratorobjekten, da es im Gegensatz zu forEach() kein Iteratorobjekt gibt. , kann es korrekt auf Break-, Continue- und Return-Anweisungen reagieren

for-of-Schleife Gewöhnliche Objekte werden nicht unterstützt, aber wenn Sie die Eigenschaften eines Objekts durchlaufen möchten, können Sie eine for-in-Schleife verwenden (was auch seine Aufgabe) oder die eingebaute Object.keys()-Methode:

for (var key in myObject) {
  if(myObject.hasOwnProperty(key)){
    console.log(key);
  }
}
Nach dem Login kopieren

Iterieren über die Karte Destrukturierung eignet sich zum Beispiel für Objekte;

Object.prototype.method=function(){
  console.log(this);
}
var myObject={
  a:1,
  b:2,
  c:3
}
Nach dem Login kopieren
Nachdem Sie das myObject hinzugefügt haben. toString()-Methode zum Objekt hinzufügen, können Sie das Objekt in eine Zeichenfolge konvertieren. Wenn Sie myObjectSymbol.iterator zu einer beliebigen Objektmethode hinzufügen, können Sie dieses Objekt durchlaufen.

Angenommen, Sie verwenden jQuery, obwohl Sie die darin enthaltene .each()-Methode sehr mögen, möchten Sie dennoch, dass das jQuery-Objekt auch for-of-Schleifen unterstützt:
  • for (var key of Object.keys(someObject)) {
      console.log(key + ": " + someObject[key]);
    }
    Nach dem Login kopieren
  • Alle Objekte mit Symbol.iterator gelten als iterierbar. In den folgenden Artikeln werden Sie feststellen, dass das Konzept iterierbarer Objekte fast in der gesamten Sprache verwendet wird, nicht nur in der for-of-Schleife, sondern auch in den Map- und Set-Konstruktoren, der Destrukturierungszuweisung und dem neuen Spread-Operator. Die
  • for...of-Schritte
or-of-Schleife ruft zunächst die Symbol.iterator-Methode der Sammlung auf und gibt dann ein neues Iteratorobjekt zurück. Das Iteratorobjekt kann ein beliebiges Objekt mit einer .next()-Methode sein; die for-of-Schleife ruft diese Methode wiederholt auf, einmal für jede Schleife. Dieser Code ist zum Beispiel der einfachste Iterator, den ich finden kann:

  • for (var [key, value] of phoneBookMap) {
       console.log(key + "'s phone number is: " + value);
    }
    Nach dem Login kopieren

Extension


  • JS-Array-Traversal:

    1. Gewöhnliche for-Schleife
  • jQuery.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
    Nach dem Login kopieren


    2 . Optimierte Version der for-Schleife

Verwenden Sie Variablen zum Zwischenspeichern der Länge, um eine wiederholte Erfassung der Länge zu vermeiden. Der Optimierungseffekt ist offensichtlich, wenn das Array groß ist array Schleife, die Hauptfunktion besteht darin, das Array zu durchlaufen. Die tatsächliche Leistung ist schwächer als bei for

var zeroesForeverIterator = {
 [Symbol.iterator]: function () {
   return this;
  },
  next: function () {
  return {done: false, value: 0};
 }
};
Nach dem Login kopieren
forEach. Diese Methode weist auch einen kleinen Fehler auf: Sie können die Schleife weder mit der break-Anweisung noch mit der return-Anweisung unterbrechen um zur äußeren Funktion zurückzukehren.

4.map traversalmap bedeutet „Zuordnung“ und wird ähnlich wie forEach verwendet. Ebenso können Sie die Schleife nicht mit der Break-Anweisung unterbrechen und auch nicht mit der Return-Anweisung zum Äußeren zurückkehren Funktion.

var arr = [1,2,0,3,9];
 for ( var i = 0; i <arr.length; i++){
    console.log(arr[i]);
}
Nach dem Login kopieren

Map Traversal unterstützt die Verwendung von Rückgabeanweisungen und Rückgabewerten

var temp=arr.map(function(val,index){
  console.log(val);  
  return val*val           
})
console.log(temp);
Nach dem Login kopieren

forEach、map都是ECMA5新增数组的方法,所以ie9以下的浏览器还不支持

5.for-of遍历

ES6新增功能

for( let i of arr){
    console.log(i);
}
Nach dem Login kopieren
  • for-of这个方法避开了for-in循环的所有缺陷

  • 与forEach()不同的是,它可以正确响应break、continue和return语句

for-of循环不仅支持数组,还支持大多数类数组对象,例如DOM NodeList对象。for-of循环也支持字符串遍历

JS对象遍历:

1.for-in遍历

for-in是为遍历对象而设计的,不适用于遍历数组。(遍历数组的缺点:数组的下标index值是数字,for-in遍历的index值"0","1","2"等是字符串)

for-in循环存在缺陷:循环会遍历对象自身的和继承的可枚举属性(不含Symbol属性)

for (var index in arr){
    console.log(arr[index]);
    console.log(index);
}
Nach dem Login kopieren

2.使用Object.keys()遍历

返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性).

var obj = {&#39;0&#39;:&#39;a&#39;,&#39;1&#39;:&#39;b&#39;,&#39;2&#39;:&#39;c&#39;};
Object.keys(obj).forEach(function(key){
     console.log(key,obj[key]);
});
Nach dem Login kopieren

3.使用Object.getOwnPropertyNames(obj)遍历

返回一个数组,包含对象自身的所有属性(不含Symbol属性,但是包括不可枚举属性).

var obj = {&#39;0&#39;:&#39;a&#39;,&#39;1&#39;:&#39;b&#39;,&#39;2&#39;:&#39;c&#39;};
Object.getOwnPropertyNames(obj).forEach(function(key){
    console.log(key,obj[key]);
});
Nach dem Login kopieren

4.使用Reflect.ownKeys(obj)遍历

返回一个数组,包含对象自身的所有属性,不管属性名是Symbol或字符串,也不管是否可枚举.

var obj = {&#39;0&#39;:&#39;a&#39;,&#39;1&#39;:&#39;b&#39;,&#39;2&#39;:&#39;c&#39;};
Reflect.ownKeys(obj).forEach(function(key){
  console.log(key,obj[key]);
});
Nach dem Login kopieren

更多编程相关知识,请访问:编程入门!!

Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen for…in und for…of in JS?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:cnblogs.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage