Was sind die ähnlichen for-Schleifen in es6?

青灯夜游
Freigeben: 2022-10-17 17:32:37
Original
1144 Leute haben es durchsucht

Ähnlich wie bei for-Schleifen in es6 gibt es: 1. „for-in“-Schleife, die Objekte, die sie durchläuft, sind nicht auf Arrays beschränkt, sondern können auch Objekte durchqueren, die Syntax lautet „for (Schlüsselname im Objekt) {...“ }“; 2. ForEach-Schleife, führen Sie die Rückruffunktion einmal für jedes Element im Array aus, das einen gültigen Wert enthält. Die Syntax lautet „array.forEach(callback function, thisValue)“; 3. „for-of“-Schleife, die Die Syntax lautet „for(aktueller Wert des Arrays){...}“.

Was sind die ähnlichen for-Schleifen in es6?

Die Betriebsumgebung dieses Tutorials: Windows 7-System, ECMAScript Version 6, Dell G3-Computer.

ECMAScript6 (kurz ES6) unterstützt 4 Arten von for-Schleifen.

  • Einfache for-Schleife

  • for-in

  • forEach

  • for-of

Werfen wir einen Blick auf diese 4 Arten von for-Schleifen.

Einfache for-Schleife

Werfen wir einen Blick auf die gebräuchlichste Schreibmethode:

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

Was sind die ähnlichen for-Schleifen in es6?

Wenn sich die Länge des Arrays während der Schleife nicht ändert, sollten wir die Länge des Arrays in einer Variablen speichern . Dadurch wird eine bessere Effizienz erreicht:

Was sind die ähnlichen for-Schleifen in es6?

for-in

Normalerweise können wir for-in verwenden, um den Inhalt des Arrays zu durchlaufen :

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

Unter normalen Umständen sind die Laufergebnisse wie folgt:


Was sind die ähnlichen for-Schleifen in es6?

Aber dies führt oft zu Problemen. Die Wahrheit über die

for-in

for-in-Schleife durchläuft die Eigenschaften des Objekts, nicht den Index des Arrays. Daher sind die von for-in durchlaufenen Objekte nicht auf Arrays beschränkt, sondern können auch Objekte durchlaufen. Ein Beispiel lautet wie folgt:

const arr = [1, 2, 3];
let index;
for(index in arr) {
    console.log("arr[" + index + "] = " + arr[index]);
}
Nach dem Login kopieren

Das Ergebnis ist wie folgt:

2-Was sind die ähnlichen for-Schleifen in es6?

Es ist zu beachten, dass die Reihenfolge, in der for-in die Attribute durchläuft, nicht bestimmt ist, das heißt, die Reihenfolge der Ausgabeergebnisse hat nichts hat nichts mit der Reihenfolge der Attribute im Objekt zu tun, noch mit der alphabetischen Reihenfolge der Attribute. Nicht relevant, in keiner anderen Reihenfolge.

Die Wahrheit über Array

Array ist ein Objekt in Javascript und der Index von Array ist der Eigenschaftsname. Tatsächlich ist „Array“ in Javascript etwas irreführend. Erstens ist Array in Javascript im Speicher nicht kontinuierlich. Zweitens bezieht sich der Index von Array nicht auf den Offset. Tatsächlich ist der Index des Arrays nicht vom Typ „Zahl“, sondern vom Typ „String“. Der Grund, warum wir arr[0] korrekt verwenden können, liegt darin, dass die Sprache automatisch 0 vom Typ „Zahl“ in „0“ vom Typ „String“ konvertieren kann. Deshalb gibt es in Javascript nie Array-Indizes, sondern nur Eigenschaften wie „0“, „1“ usw. Interessanterweise verfügt jedes Array-Objekt über eine Längeneigenschaft, wodurch es sich eher wie Arrays in anderen Sprachen verhält. Aber warum wird das Längenattribut beim Durchlaufen des Array-Objekts nicht ausgegeben? Das liegt daran, dass for-in nur über „aufzählbare Eigenschaften“ iterieren kann, die Länge eine nicht aufzählbare Eigenschaft ist und Array-Objekte tatsächlich viele andere nicht aufzählbare Eigenschaften haben.

Lassen Sie uns nun zurückgehen und uns das Beispiel der Verwendung von for-in zur Schleife eines Arrays ansehen:

const person = {
    fname: "san",
    lname: "zhang",
    age: 99
};
let info;
for(info in person) {
    console.log("person[" + info + "] = " + person[info]);
}
Nach dem Login kopieren

Das laufende Ergebnis ist:


Was sind die ähnlichen for-Schleifen in es6?

Wir sehen, dass das for-in-Schleife Auf unsere neue Eigenschaft „name“ wird zugegriffen, weil for-in alle Eigenschaften des Objekts durchläuft, nicht nur den „index“. Gleichzeitig ist zu beachten, dass die hier ausgegebenen Indexwerte, also „0“, „1“ und „2“, nicht vom Typ „Zahl“, sondern vom Typ „String“ sind, da sie als Attribute ausgegeben werden , keine Indizes. Bedeutet das, dass wir einfach den Inhalt des Arrays ausgeben können, ohne unserem Array-Objekt neue Eigenschaften hinzuzufügen? Die Antwort ist nein. Denn for-in durchläuft nicht nur die Eigenschaften des Arrays selbst, sondern auch alle aufzählbaren Eigenschaften in der Array-Prototypkette. Schauen wir uns unten ein Beispiel an:


const arr = [1, 2, 3];
arr.name = "Hello world";
let index;
for(index in arr) {
    console.log("arr[" + index + "] = " + arr[index]);
}
Nach dem Login kopieren

Das laufende Ergebnis lautet:


Array.prototype.fatherName = "Father";
const arr = [1, 2, 3];
arr.name = "Hello world";
let index;
for(index in arr) {
    console.log("arr[" + index + "] = " + arr[index]);
}
Nach dem Login kopieren

Wenn wir dies schreiben, können wir feststellen, dass for-in nicht zum Durchlaufen von Elementen im Array geeignet ist, sondern eher zum Durchlaufen von Attributen in Objekten ist auch die ursprüngliche Absicht, für die es geschaffen wurde. Es gibt eine Ausnahme, nämlich spärliche Arrays. Betrachten Sie das folgende Beispiel:


let key;
const arr = [];
arr[0] = "a";
arr[100] = "b";
arr[10000] = "c";
for(key in arr) {
    if(arr.hasOwnProperty(key)  &&   
        /^0$|^[1-9]\d*$/.test(key) &&   
        key <= 4294967294              
        ) {
        console.log(arr[key]);
    }
}
Nach dem Login kopieren

for-in 只会遍历存在的实体,上面的例子中, for-in 遍历了3次(遍历属性分别为”0″、 “100″、 “10000″的元素,普通 for 循环则会遍历 10001 次)。所以,只要处理得当, for-in 在遍历 Array 中元素也能发挥巨大作用。

为了避免重复劳动,我们可以包装一下上面的代码:

function arrayHasOwnIndex(array, prop) {
    return array.hasOwnProperty(prop) &&
        /^0$|^[1-9]\d*$/.test(prop) &&
        prop <= 4294967294; // 2^32 - 2
}
Nach dem Login kopieren

使用示例如下:

for (let key in arr) {
    if (arrayHasOwnIndex(arr, key)) {
        console.log(arr[key]);
    }
}
Nach dem Login kopieren

for-in 性能

正如上面所说,每次迭代操作会同时搜索实例或者原型属性, for-in 循环的每次迭代都会产生更多开销,因此要比其他循环类型慢,一般速度为其他类型循环的 1/7。因此,除非明确需要迭代一个属性数量未知的对象,否则应避免使用 for-in 循环。如果需要遍历一个数量有限的已知属性列表,使用其他循环会更快,比如下面的例子:

const obj = {
    "prop1": "value1",
    "prop2": "value2"
};
 
const props = ["prop1", "prop2"];
for(let i = 0; i < props.length; i++) {
    console.log(obj[props[i]]);
}
Nach dem Login kopieren

上面代码中,将对象的属性都存入一个数组中,相对于 for-in 查找每一个属性,该代码只关注给定的属性,节省了循环的开销和时间。

forEach

在 ES5 中,引入了新的循环,即 forEach 循环。

const arr = [1, 2, 3];
arr.forEach((data) => {
    console.log(data);
});
Nach dem Login kopieren

运行结果:

1
2
3
Nach dem Login kopieren

forEach 方法为数组中含有有效值的每一项执行一次 callback 函数,那些已删除(使用 delete 方法等情况)或者从未赋值的项将被跳过(不包括那些值为 undefined 或 null 的项)。 callback 函数会被依次传入三个参数:

  • 数组当前项的值;
  • 数组当前项的索引;
  • 数组对象本身;

需要注意的是,forEach 遍历的范围在第一次调用 callback 前就会确定。调用forEach 后添加到数组中的项不会被 callback 访问到。如果已经存在的值被改变,则传递给 callback 的值是 forEach 遍历到他们那一刻的值。已删除的项不会被遍历到。

const arr = [];
arr[0] = "a";
arr[3] = "b";
arr[10] = "c";
arr.name = "Hello world";
arr.forEach((data, index, array) => {
    console.log(data, index, array);
});
Nach dem Login kopieren

运行结果:

a 0 ["a", 3: "b", 10: "c", name: "Hello world"]
b 3 ["a", 3: "b", 10: "c", name: "Hello world"]
c 10 ["a", 3: "b", 10: "c", name: "Hello world"]
Nach dem Login kopieren

这里的 index 是 Number 类型,并且也不会像 for-in 一样遍历原型链上的属性。

所以,使用 forEach 时,我们不需要专门地声明 index 和遍历的元素,因为这些都作为回调函数的参数。

另外,forEach 将会遍历数组中的所有元素,但是 ES5 定义了一些其他有用的方法,下面是一部分:

  • every: 循环在第一次 return false 后返回
  • some: 循环在第一次 return true 后返回
  • filter: 返回一个新的数组,该数组内的元素满足回调函数
  • map: 将原数组中的元素处理后再返回
  • reduce: 对数组中的元素依次处理,将上次处理结果作为下次处理的输入,最后得到最终结果。

forEach 性能

大家可以看 jsPerf ,在不同浏览器下测试的结果都是 forEach 的速度不如 for。如果大家把测试代码放在控制台的话,可能会得到不一样的结果,主要原因是控制台的执行环境与真实的代码执行环境有所区别。

for-of

先来看个例子:

const arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;];
for(let data of arr) {
    console.log(data);
}
Nach dem Login kopieren

运行结果是:

a
b
c
Nach dem Login kopieren

为什么要引进 for-of?

要回答这个问题,我们先来看看ES6之前的 3 种 for 循环有什么缺陷:

  • forEach 不能 break 和 return;
  • for-in 缺点更加明显,它不仅遍历数组中的元素,还会遍历自定义的属性,甚至原型链上的属性都被访问到。而且,遍历数组元素的顺序可能是随机的。

所以,鉴于以上种种缺陷,我们需要改进原先的 for 循环。但 ES6 不会破坏你已经写好的 JS 代码。目前,成千上万的 Web 网站依赖 for-in 循环,其中一些网站甚至将其用于数组遍历。如果想通过修正 for-in 循环增加数组遍历支持会让这一切变得更加混乱,因此,标准委员会在 ES6 中增加了一种新的循环语法来解决目前的问题,即 for-of 。

那 for-of 到底可以干什么呢?

  • 跟 forEach 相比,可以正确响应 break, continue, return。
  • for-of 循环不仅支持数组,还支持大多数类数组对象,例如 DOM nodelist 对象。
  • for-of 循环也支持字符串遍历,它将字符串视为一系列 Unicode 字符来进行遍历。
  • for-of 也支持 Map 和 Set (两者均为 ES6 中新增的类型)对象遍历。

总结一下,for-of 循环有以下几个特征:

  • 这是最简洁、最直接的遍历数组元素的语法。
  • 这个方法避开了 for-in 循环的所有缺陷。
  • 与 forEach 不同的是,它可以正确响应 break、continue 和 return 语句。
  • 其不仅可以遍历数组,还可以遍历类数组对象和其他可迭代对象。

但需要注意的是,for-of循环不支持普通对象,但如果你想迭代一个对象的属性,你可以用
for-in 循环(这也是它的本职工作)。

最后要说的是,ES6 引进的另一个方式也能实现遍历数组的值,那就是 Iterator。上个例子:

const arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;];
const iter = arr[Symbol.iterator]();
 
iter.next() // { value: &#39;a&#39;, done: false }
iter.next() // { value: &#39;b&#39;, done: false }
iter.next() // { value: &#39;c&#39;, done: false }
iter.next() // { value: undefined, done: true }
Nach dem Login kopieren

前面的不多说,重点描述for-of

for-of循环不仅支持数组,还支持大多数类数组对象,例如DOM NodeList对象

for-of循环也支持字符串遍历,它将字符串视为一系列的Unicode字符来进行遍历:

window.onload=function(){ 
   const arr = [55,00, 11, 22];
   arr.name = "hello";
  // Array.prototype.FatherName = &#39;FatherName&#39;;
   /*for(let key in arr){
    console.log(&#39;key=&#39;+key+&#39;,key.value=&#39;+arr[key]);
   }*/
   /* arr.forEach((data) => {console.log(data);});*/
  /* arr.forEach((data,index,arr) => {console.log(data+&#39;,&#39;+index+&#39;,&#39;+arr);});*/
  /*for(let key of arr){
    console.log(key);
  }*/
  var string1 = &#39;abcdefghijklmn&#39;;
  var string2 = &#39;opqrstuvwxyc&#39;;
  const stringArr = [string1,string2];
  for(let key of stringArr){
    console.log(key);
  }
  for(let key of string1){
    console.log(key);
  }
}
Nach dem Login kopieren

结果:

Was sind die ähnlichen for-Schleifen in es6?

现在,只需记住:

  • 这是最简洁、最直接的遍历数组元素的语法
  • 这个方法避开了for-in循环的所有缺陷
  • 与forEach()不同的是,它可以正确响应break、continue和return语句

for-in循环用来遍历对象属性。

for-of循环用来遍历数据—例如数组中的值。

它同样支持Map和Set对象遍历。

Map和Set对象是ES6中新增的类型。ES6中的Map和Set和java中并无太大出入。

SetMap类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在Set中,没有重复的key。

要创建一个Set,需要提供一个Array作为输入,或者直接创建一个空Set

var s1 = new Set(); // 空Set
var s2 = new Set([1, 2, 3]); // 含1, 2, 3
Nach dem Login kopieren

Was sind die ähnlichen for-Schleifen in es6?

重复元素在Set中自动被过滤:

var s = new Set([1, 2, 3, 3, &#39;3&#39;]);
console.log(s); // Set {1, 2, 3, "3"}
Nach dem Login kopieren

Was sind die ähnlichen for-Schleifen in es6?

通过add(key)方法可以添加元素到Set中,可以重复添加,但不会有效果:

var s = new Set([1, 2, 3]);
s.add(4);
s; // Set {1, 2, 3, 4}
s.add(4);
s; // Set {1, 2, 3, 4}
Nach dem Login kopieren

通过delete(key)方法可以删除元素:

var s = new Set([1, 2, 3]);
s; // Set {1, 2, 3}
s.delete(3);
s; // Set {1, 2}
Nach dem Login kopieren

Set对象可以自动排除重复项

var string1 = &#39;abcdefghijklmn&#39;;
  var string2 = &#39;opqrstuvwxyc&#39;;
  var string3 = &#39;opqrstuvwxyc&#39;;
  var string4 = &#39;opqrstuvwxyz&#39;;
 
  const stringArr = [string1,string2,string3,string4];
 
 
 var newSet = new Set(stringArr);
  for(let key of newSet){
    console.log(key);
  }
Nach dem Login kopieren

结果:

Was sind die ähnlichen for-Schleifen in es6?

Map对象稍有不同:内含的数据由键值对组成,所以你需要使用解构(destructuring)来将键值对拆解为两个独立的变量:

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

示例

var m = new Map([[1, &#39;Michael&#39;], [2, &#39;Bob&#39;], [3, &#39;Tracy&#39;]]);
  var map = new Map([[&#39;1&#39;,&#39;Jckey&#39;],[&#39;2&#39;,&#39;Mike&#39;],[&#39;3&#39;,&#39;zhengxin&#39;]]);
  map.set(&#39;4&#39;,&#39;Adam&#39;);//添加key-value
  map.set(&#39;5&#39;,&#39;Tom&#39;);
  map.set(&#39;6&#39;,&#39;Jerry&#39;);
  console.log(map.get(&#39;6&#39;));
  map.delete(&#39;6&#39;);
   console.log(map.get(&#39;6&#39;));
  for(var [key,value] of map) {
    console.log(&#39;key=&#39;+key+&#39; , value=&#39;+value);
  }
Nach dem Login kopieren

结果:

Was sind die ähnlichen for-Schleifen in es6?

【相关推荐:javascript视频教程编程视频

Das obige ist der detaillierte Inhalt vonWas sind die ähnlichen for-Schleifen in es6?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
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