Inhaltsverzeichnis
Instanzattribute und Prototypattribute beziehen
js-Aufzählung
Attributdeskriptor
Wert
beschreibbar
常用的遍历方法
for...in...遍历
for...of遍历
Object.keys遍历
Object.getOwnPropertyNames()遍历
结语
Heim Web-Frontend js-Tutorial Detaillierte Erklärung des Durchquerungsproblems in js

Detaillierte Erklärung des Durchquerungsproblems in js

Apr 10, 2018 pm 04:55 PM
javascript 遍历 问题

Der Inhalt, der in diesem Artikel mit Ihnen geteilt wird, befasst sich mit der detaillierten Erläuterung von Durchlaufproblemen in js. Er hat einen gewissen Referenzwert. Freunde in Not können sich auf

Instanzattribute und Prototypattribute beziehen

  • Es gibt zwei Arten von Eigenschaften von Objekten in JavaScript: Dateneigenschaften und Accessor-Eigenschaften .

  • Je nach spezifischem Kontext können Attribute unterteilt werden in: Prototypattribute und Instanzattribute .

  • Prototypattribute sind Attribute, die im Prototyp des Objekts definiert sind prototype,

  • Instanzattribute Einerseits stammen sie aus der konstruierten Funktion, und dann werden nach der Instanziierung des Konstruktors neue Attribute hinzugefügt.

js-Aufzählung

Das Durchlaufen der Eigenschaften eines Objekts in JavaScript ist nicht sehr einfach, hauptsächlich aus zwei Gründen:

  • Objekte in JavaScript befinden sich normalerweise in einer Prototypenkette und erben einige Eigenschaften von einem oder mehreren oberen Prototypen

  • Attribute in JavaScript haben nicht nur Werte, sondern neben dem Wert auch einige andere Funktionen. Eine der Funktionen, die sich auf die Attributdurchquerung auswirken, ist Enumerable (ein Attributdeskriptor) Wenn der Wert true ist, ist das Attribut aufzählbar, andernfalls

Attributdeskriptor
  • 属性描述符 hat zwei Hauptformen: 数据描述符 und 存取描述符.

  • Verwenden Sie die Methoden Object.getOwnPropertyDescriptor und Object.getOwnPropertyDescriptors, um das 属性描述符 des Objekts abzurufen.

var obj = {
  name: '10',
  _age: 25,
  get age(){
    return this._age;
  },
  set age(age){
    if(age<1){
      throw new Error(&#39;Age must be more than 0&#39;);
    }else{
      this._age = age;
    }
  }
};

var des = Object.getOwnPropertyDescriptors(obj);
console.log(des);
/**
 * des: {
 *  name: {
 *    configurable: true,
 *    enumerable: true,
 *    value: "10",
 *    writable: true,
 *    __proto__: Object
 *  },
 *  _age: {
 *    configurable: true,
 *    enumerable: true,
 *    value: 25,
 *    writable: true,
 *    __proto__: Object
 *  },
 *  age: {
 *    configurable: true,
 *    enumerable: true,
 *    get: f age(),
 *    set: f age(age),
 *    __proto__: Object
 *  },
 *  __proto__: Object
 * }
*/
Nach dem Login kopieren
Wert

Der Wert dieses Attributs (nur gültig für Datenattributdeskriptoren)

beschreibbar

Wann< Wenn die 🎜>-Eigenschaft auf writable gesetzt ist, gilt die Eigenschaft als „nicht beschreibbar“. Es kann nicht neu zugewiesen werden. false

get
Ruft die Zugriffsfunktion (

) dieser Eigenschaft ab. Wenn kein Accessor vorhanden ist, ist der Wert getter. (Nur gültig für Eigenschaftsbeschreibungen, die Accessoren oder Setter enthalten) undefined

set
Ruft die Setter-Funktion (

) dieser Eigenschaft ab. Wenn kein Setter vorhanden ist, ist der Wert setter. (Nur gültig für Eigenschaftsbeschreibungen, die Accessoren oder Setter enthalten) Das Attribut undefined

konfigurierbar

gibt an, ob die Attribute des Objekts gelöscht werden können, und andere Attribute außer dem Attribut configurable, ob dies möglich ist geändert. writable

enumerable

definiert, ob die Eigenschaften des Objekts in enumerable-Schleifen und for...in aufgezählt werden können. Object.keys()

  • name und _age haben vier Attributdeskriptoren

    , &#39;configurable&#39;, &#39;enumerable&#39;, &#39;value&#39;, zusammen &#39;writable&#39;数据描述符

  • < genannt 🎜>Alter hat vier Attributdeskriptoren
  • ,

    , &#39;configurable&#39; und &#39;enumerable&#39;, die zusammen als &#39;get&#39;&#39;set&#39;存取描述符

  • bezeichnet werden

    对象的属性描述符,可以通过Object.definePropertyObject.defineProperties来修改(configurabletrue的条件下)

    常用的遍历方法

    for...in...遍历

    • 遍历自身及原型链上所有可枚举的属性

    • 使用 for...in 循环遍历对象属性时返回的属性会因为各个 浏览器不同 导致对象属性遍历的顺序有可能不是当初构建时的顺序。

    Chrome Opera 的 JavaScript 解析引擎遵循的是新版 ECMA-262 第五版规范。因此,使用 for-in 语句遍历对象属性时遍历书序并非属性构建顺序。而 IE6 IE7 IE8 Firefox Safari 的 JavaScript 解析引擎遵循的是较老的 ECMA-262 第三版规范,属性遍历顺序由属性构建的顺序决定。
    for-in 语句无法保证遍历顺序,应尽量避免编写依赖对象属性顺序的代码。如果想顺序遍历一组数据,请使用数组并使用 for 语句遍历。
    var Animal = function({name=&#39;none&#39;, age=3, weight=80}={}){
      this.name = name;
      this.age = age;
      this.weight = weight;
    }
    
    Animal.prototype = {
      color: &#39;red&#39;
    }
    
    var dog = new Animal()
    
    // 将weight属性设置为 不可枚举
    Object.defineProperty(dog, &#39;weight&#39;, {
      enumerable: false
    })
    
    for(let i in dog){
      console.log(n);
    }
    
    //原型链上的color同样被遍历出来了,并且由于weight属性被设置成了enumerable:false,所以不可被遍历
    //name 
    //age 
    //color
    Nach dem Login kopieren

    for...of遍历

    一个数据结构只要部署了Symbol.iterator属性,就被视为具有 iterator 接口,就可以用for...of循环遍历它的成员。也就是说,for...of循环内部调用的是数据结构的Symbol.iterator方法。

    for...of循环可以使用的范围包括数组、SetMap 结构、某些类似数组的对象(比如arguments对象、DOM NodeList 对象)、Generator 对象,以及字符串。

    如果不太清楚iterator,请去看看阮一峰大神的这篇文章,里面关于for...of以及iterator都讲的非常详细!

    其实for...offor...in都是迭代一些东西,它们之间的主要区别在于它们的迭代方式。

    • for...in语句以原始插入顺序迭代对象的可枚举属性。

    • for...of 语句遍历可迭代对象定义要迭代的数据。

    请仔细看以下实例,理解其中的区别

    Object.prototype.objCustom = function() {}; 
    Array.prototype.arrCustom = function() {};
    
    let iterable = [3, 5, 7];
    iterable.foo = &#39;hello&#39;;
    
    for (let i in iterable) {
      console.log(i); //  0, 1, 2, "foo", "arrCustom", "objCustom"
    }
    
    for (let i in iterable) {
      if (iterable.hasOwnProperty(i)) {
        console.log(i); //  0, 1, 2, "foo"
      }
    }
    
    for (let i of iterable) {
      console.log(i); //  3, 5, 7
    }
    Nach dem Login kopieren
    Object.prototype.objCustom = function() {};
    Array.prototype.arrCustom = function() {}; 
    
    let iterable = [3, 5, 7]; 
    iterable.foo = &#39;hello&#39;;
    Nach dem Login kopieren

    在这段代码里面,由于继承和原型链,对象iterable继承属性objCustomarrCustom

    for (let i in iterable) {
      console.log(i); // 0, 1, 2, "foo", "arrCustom", "objCustom" 
    }
    Nach dem Login kopieren

    在这段代码里面,此循环仅以原始插入顺序记录iterable 对象的可枚举属性。它不记录数组元素3, 5, 7hello,因为这些不是枚举属性。但是它记录了数组索引以及arrCustomobjCustom(为何记录arrCustomobjCustom在本文for...in里面有讲过)。

    for (let i in iterable) {
      if (iterable.hasOwnProperty(i)) {
        console.log(i); //  0, 1, 2, "foo"
      }
    }
    Nach dem Login kopieren

    hasOwnProperty()用来检查找到的枚举属性是不是对象自己的(即是不是继承的)

    for (let i of iterable) {
      console.log(i); //  3, 5, 7 
    }
    Nach dem Login kopieren

    该循环迭代并记录iterable作为可迭代对象定义的迭代值,这些是数组元素 3, 5, 7,而不是任何对象的属性。

    Object.keys遍历

    Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 (两者的主要区别是 一个 for-in 循环还会枚举其原型链上的属性)。

    Object.getOwnPropertyNames()遍历

    Object.getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组,此方法不会获取原型链上的属性。

    var Animal = function({name=&#39;&#39;, age=1, weight=70}={}){
      this.name = name;
      this.age = age;
      this.weight = weight;
    }
    
    Animal.prototype = {
      type: &#39;Animal&#39;
    }
    
    var dog = new Animal()
    
    // 将height属性设置为 不可枚举
    Object.defineProperty(dog, &#39;weight&#39;, {
      enumerable: false
    })
    
    var keys = Object.getOwnPropertyNames(dog);
    console.log(keys)
    // [&#39;name&#39;, &#39;age&#39;, &#39;weight&#39;]
    Nach dem Login kopieren

    结语

    这篇文章希望能让大家更加理解js中的遍历,写的不好多多见谅并指出!

    相关推荐:

    实例详解AngularJS遍历获取数组元素

    JS遍历对象属性的方法示例

    JS遍历页面所有对象属性及实现方法

    Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung des Durchquerungsproblems in js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Java, wie man einen Ordner durchläuft und alle Dateinamen abruft Java, wie man einen Ordner durchläuft und alle Dateinamen abruft Mar 29, 2024 pm 01:24 PM

Java ist eine beliebte Programmiersprache mit leistungsstarken Funktionen zur Dateiverarbeitung. In Java ist das Durchsuchen eines Ordners und das Abrufen aller Dateinamen ein üblicher Vorgang, der uns dabei helfen kann, Dateien in einem bestimmten Verzeichnis schnell zu finden und zu verarbeiten. In diesem Artikel wird erläutert, wie eine Methode zum Durchlaufen eines Ordners und zum Abrufen aller Dateinamen in Java implementiert wird, und es werden spezifische Codebeispiele bereitgestellt. 1. Verwenden Sie die rekursive Methode, um den Ordner zu durchlaufen. Die rekursive Methode ist eine Möglichkeit, sich selbst aufzurufen und den Ordner effektiv zu durchlaufen.

Einfaches JavaScript-Tutorial: So erhalten Sie den HTTP-Statuscode Einfaches JavaScript-Tutorial: So erhalten Sie den HTTP-Statuscode Jan 05, 2024 pm 06:08 PM

JavaScript-Tutorial: So erhalten Sie HTTP-Statuscode. Es sind spezifische Codebeispiele erforderlich. Vorwort: Bei der Webentwicklung ist häufig die Dateninteraktion mit dem Server erforderlich. Bei der Kommunikation mit dem Server müssen wir häufig den zurückgegebenen HTTP-Statuscode abrufen, um festzustellen, ob der Vorgang erfolgreich ist, und die entsprechende Verarbeitung basierend auf verschiedenen Statuscodes durchführen. In diesem Artikel erfahren Sie, wie Sie mit JavaScript HTTP-Statuscodes abrufen und einige praktische Codebeispiele bereitstellen. Verwenden von XMLHttpRequest

So lösen Sie das Problem, dass jQuery den Formularelementwert nicht abrufen kann So lösen Sie das Problem, dass jQuery den Formularelementwert nicht abrufen kann Feb 19, 2024 pm 02:01 PM

Um das Problem zu lösen, dass jQuery.val() nicht verwendet werden kann, sind spezifische Codebeispiele erforderlich. Für Front-End-Entwickler ist die Verwendung von jQuery eine der häufigsten Operationen. Unter diesen ist die Verwendung der .val()-Methode zum Abrufen oder Festlegen des Werts eines Formularelements eine sehr häufige Operation. In bestimmten Fällen kann jedoch das Problem auftreten, dass die Methode .val() nicht verwendet werden kann. In diesem Artikel werden einige gängige Situationen und Lösungen vorgestellt und spezifische Codebeispiele bereitgestellt. Problembeschreibung: Wenn Sie jQuery zum Entwickeln von Front-End-Seiten verwenden, treten manchmal Probleme auf

So lösen Sie das Problem, dass das Startmenü nach der Win11-Installation nicht verwendet werden kann So lösen Sie das Problem, dass das Startmenü nach der Win11-Installation nicht verwendet werden kann Jan 06, 2024 pm 05:14 PM

Viele Benutzer haben versucht, das Win11-System zu aktualisieren, haben jedoch festgestellt, dass das Startmenü nach dem Update nicht verwendet werden kann. Dies kann daran liegen, dass ein Problem mit dem neuesten Update vorliegt. Wir können warten, bis Microsoft diese Updates repariert oder deinstalliert Problem. Schauen wir es uns gemeinsam an. Was tun, wenn das Startmenü nach der Installation von Win11 nicht verwendet werden kann? Methode 1: 1. Öffnen Sie zunächst die Systemsteuerung in Win11. 2. Klicken Sie dann unterhalb des Programms auf die Schaltfläche „Programm deinstallieren“. 3. Rufen Sie die Deinstallationsoberfläche auf und suchen Sie in der oberen linken Ecke nach „Installierte Updates anzeigen“. 4. Nach der Eingabe können Sie die Update-Zeit in den Update-Informationen anzeigen und alle aktuellen Updates deinstallieren. Methode 2: 1. Darüber hinaus können wir das Win11-System auch direkt ohne Updates herunterladen. 2. Dies ist ein Produkt ohne das meiste

Welche Fragen gibt es in der Rulong 8 Wine Master-Prüfung? Welche Fragen gibt es in der Rulong 8 Wine Master-Prüfung? Feb 02, 2024 am 10:18 AM

Welche Fragen beinhaltet die Yulong 8 Wine Master-Prüfung? Wie lautet die entsprechende Antwort? Wie kann man die Prüfung schnell bestehen? Es gibt viele Fragen, die in den Prüfungsaktivitäten zum Master of Wine beantwortet werden müssen, und wir können auf die Antworten zurückgreifen, um sie zu lösen. Bei all diesen Fragen geht es um Weinkenntnisse. Wenn Sie eine Referenz benötigen, schauen wir uns die detaillierte Analyse der Antworten auf die Prüfungsfragen zum Yakuza 8 Wine Master an! Ausführliche Erklärung der Antworten auf Fragen in der Rulong 8 Wine Master-Prüfung 1. Fragen zum Thema „Wein“. Dies ist ein destillierter Likör, der von einer von der königlichen Familie gegründeten Brennerei hergestellt wird. Er wird aus dem Zucker von Zuckerrohr gebraut, das in großen Mengen auf Hawaii angebaut wird. Wie heißt dieser Wein? Antwort: Rum 2. Frage zu „Wein“. Das Bild zeigt ein Getränk aus trockenem Ginseng und trockenem Wermut. Es zeichnet sich durch die Zugabe von Oliven aus und ist als „Cockney“ bekannt.

So erhalten Sie auf einfache Weise HTTP-Statuscode in JavaScript So erhalten Sie auf einfache Weise HTTP-Statuscode in JavaScript Jan 05, 2024 pm 01:37 PM

Einführung in die Methode zum Abrufen des HTTP-Statuscodes in JavaScript: Bei der Front-End-Entwicklung müssen wir uns häufig mit der Interaktion mit der Back-End-Schnittstelle befassen, und der HTTP-Statuscode ist ein sehr wichtiger Teil davon. Das Verstehen und Abrufen von HTTP-Statuscodes hilft uns, die von der Schnittstelle zurückgegebenen Daten besser zu verarbeiten. In diesem Artikel wird erläutert, wie Sie mithilfe von JavaScript HTTP-Statuscodes erhalten, und es werden spezifische Codebeispiele bereitgestellt. 1. Was ist ein HTTP-Statuscode? HTTP-Statuscode bedeutet, dass der Dienst den Dienst anfordert, wenn er eine Anfrage an den Server initiiert

Häufig gestellte Fragen zum neuen Durchbruchstest von Wuhuami: 28. Februar, wir freuen uns auf Ihre Ankunft! Häufig gestellte Fragen zum neuen Durchbruchstest von Wuhuami: 28. Februar, wir freuen uns auf Ihre Ankunft! Feb 26, 2024 pm 05:22 PM

Wuhua Mixin hat bestätigt, dass es am 28. Februar einen Breaking-Test durchführen wird. Dieses Mal werden wir hauptsächlich die allgemeinen Probleme des Breaking-Tests lösen, einschließlich der Frage, ob Sie an früheren Tests teilgenommen haben, ob Sie dieses Mal berechtigt sind, den Beginn und das Ende des Tests Schauen wir uns an, welche Geräteplattformen und welche anderen Inhalte unterstützt werden. Häufig gestellte Fragen zum neuen Durchbruchstest von Wuhuami: 28. Februar, wir freuen uns auf Ihre Ankunft! 1. Was ist der „Breaking Test“? Bei diesem Test handelt es sich um einen eingeschränkten Abrechnungs- und Dateilöschtest. Nach dem Test werden die Spieldaten dieses Tests gelöscht. 2. Haben Sie schon einmal am „Eröffnungstest“ oder „Eintrittstest“ teilgenommen? Haben Sie die Voraussetzungen, dieses Mal am „Eröffnungstest“ oder „Eintrittstest“ teilzunehmen? Bitte scannen Sie den QR-Code unten, um zu „An Spieler, die an der Closed Beta teilgenommen haben“ zu gelangen

Eingehender Vergleich von Java Iterator und Iterable: Vor- und Nachteile-Analyse Eingehender Vergleich von Java Iterator und Iterable: Vor- und Nachteile-Analyse Feb 19, 2024 pm 04:20 PM

Konzeptionelle Unterschiede: Iterator: Iterator ist eine Schnittstelle, die einen Iterator darstellt, der Werte aus einer Sammlung erhält. Es bietet Methoden wie MoveNext(), Current() und Reset(), mit denen Sie die Elemente in der Sammlung durchlaufen und das aktuelle Element bearbeiten können. Iterable: Iterable ist ebenfalls eine Schnittstelle, die ein iterierbares Objekt darstellt. Es stellt die Methode Iterator() bereit, die ein Iterator-Objekt zurückgibt, um das Durchlaufen der Elemente in der Sammlung zu erleichtern. Verwendung: Iterator: Um Iterator zu verwenden, müssen Sie zuerst ein Iterator-Objekt abrufen und dann die Methode MoveNext() aufrufen, um zum nächsten zu wechseln

See all articles