KurtZ: was bewirkt {}

Beitrag lesen

Hi Ric

Kurtz beantwortet:

ok ich wollte dir ne kurze Antwort geben, aber ich muss etwas weiter ausholen.

ist aber gleichzeitig JS Form eines assoziativen Arrays!

Es ist eine "Form" assoziative Arrays zu realisieren, zumindest wirst du es sehr häufig in dieser Art sehen.

Das funtioniert auch sehr gut solange man auf bekannte hashkeys zugreift, leider herscht das Missverständnis (auch bei hiesigen "Kennern") das eine
for-in Schleife über die eigenen Schlüssel eines Hashes iterieren solle.

das ist leider falsch es iteriert über die eigenen und die geerbten Schlüssel, der in-Operator durchsucht den ganzen prototype-chain bis zum Top-Objekt. Es gibt  leider kein "for-own" Befehl in JS.

Wenn du dich nicht mit OOP befassen willst kann es dir reichen einfach folgendes zu beherzen:

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Object.prototype ist Tabu
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Es ist IMHO leider auch nicht möglich einen Konstruktor (das Analoge zu Klassen in JS) zu generieren der nicht von Object() erbt, deswegen würde jedes for-in also auf die Schnauze fallen.

In den meisten Fällen begnügt man sich also damit {key:value} für Hashes zu nutzen und genau zu kontrollieren was Object vererbt. (die builin Attribute von Object werden von for-in nämlich GENAU FÜR DIESEN ZWECK ignoriert). Und dadurch das man das Top-Object der Vererbungskette nimmt, ist man auch sicher das kein Object in der Vererbungskette was reinschmuggelt.

Solltest du aber unbedingt Object.prototype verändern wollen, wird ein nacktes for-in für dich Tabu, du musst also sowas schreiben

for (variable in object) if (object.hasOwnProperty(variable)) {
        statements;
    }

Wenn dir das zu umständlich ist bleibt dir nur noch der Weg eine Wrapper-Funktionen zu bauen, die dies kapseln

also sowas wie ownValue(key,Object) oder sogar ein Objekt Hash konstruieren das eine Methode definiert Hash.ownValue(key) definiert hat und implizit auf hasOwnProperty prüft.

eine "Klasse" Hash die das for-in "problem" nicht hat, kann es leider nicht geben. Was aber in kontrollierten Fällen totaler Overhead ist.

Das Problem ist also nicht Object als Hash zu benutzen, sondern falsch auf die Werte zuzugreifen, udn z.B. for-in mit einem foreach wie z.B. in Perl zu verwechseln.

Das ist ein Designfehler in JS. Aber in den meisten Fällen kannst du es ziemlich genau kontrollieren, deswegen verzichten viele Progger aus Bequemlichkeit da auf das Sicherheitsnetz  mit hasOwnProperty.

Hoffe du kannst nun deren Code besser verstehen.

Tschau
 Kurt

0 139

was bewirkt {}

Ric
  • javascript
  1. 0
    Don P
  2. 0
    KurtZ
    1. 0
      Don P
      1. 0
        KurtZ
        1. 0
          Don P
          1. 0
            KurtZ
            1. 0
              Don P
              1. 0
                KurtZ
                1. 0
                  Cheatah
                  1. 0
                    KurtZ
                    1. 0
                      Don P
                      1. 0
                        KurtZ
                        1. 0
                          Siechfred
                    2. 0
                      Cheatah
        2. 0
          Don P
          1. 0
            KurtZ
            1. 0
              Don P
              1. 0
                KurtZ
    2. 0
      Cheatah
      1. 0
        KurtZ
        1. 0
          Siechfred
          1. 0
            KurtZ
            1. 0
              Cheatah
              1. 0
                KurtZ
                1. 1
                  Siechfred
                  1. 0
                    KurtZ
                    1. 0
                      Siechfred
                      1. 0
                        KurtZ
                        1. 0
                          Don P
                      2. 0
                        Siechfred
                      3. 2
                        Daniel Thoma
                        1. 0
                          KurtZ
                        2. 0
                          Siechfred
                          1. 0
                            Daniel Thoma
                            1. 0
                              Struppi
      2. 0

        "Herrje" Cheatah

        KurtZ
        1. 0
          Don P
          1. 0
            KurtZ
            1. 1
              Don P
              1. 0
                KurtZ
                1. 0
                  Don P
                  1. 0
                    KurtZ
        2. 0
          Siechfred
          1. 0
            KurtZ
            1. 0
              KurtZ
              1. 0
                Christoph
                1. 0
                  KurtZ
                  1. 0
                    Christoph
                    1. 0
                      LanX
                      1. 0
                        LanX
                        1. 0
                          Don P
                          1. 0
                            KurtZ
                            1. 0
                              Don P
                      2. 0
                        molily
                        1. 0
                          Christoph
                          1. 0
                            KurtZ
                            1. 0
                              Struppi
                            2. 0
                              Struppi
                            3. 0
                              Christoph
                              1. 0
                                Don P
                              2. 0
                                molily
                                1. 0
                                  molily
                              3. 0

                                "Herrje" Christoph

                                KurtZ
                                1. 0
                                  KurtZ
                                  1. 0
                                    Christoph
                                    1. 0
                                      KurtZ
                                      1. 0
                                        molily
                          2. 0
                            LanX²
                        2. 0
                          LanX²
                          1. 0
                            molily
                            1. 0
                              LanX²
                              1. 0
                                molily
                                1. 0
                                  KurtZ
                                  1. 0
                                    molily
                                    1. 0
                                      KurtZ
                              2. 0
                                KurtZ
                                1. 0
                                  LanX²
                    2. 0
                      molily
                      1. 0
                        LanX
                        1. 0
                          molily
                      2. 0
                        Christoph
            2. 0
              Siechfred
              1. 1

                Lieber SIechfred!

                KurtZ
                1. 0
                  Struppi
                  1. 0
                    Don P
                  2. 0
                    KurtZ
                    1. 0
                      Struppi
                      1. 0
                        KurtZ
                        1. 0
                          Struppi
                          1. 0

                            Lieber Struppi!

                            KurtZ
                          2. 1
                            Christoph
                            1. 0
                              Struppi
                            2. 0

                              Lieber Christof ;)

                              KurtZ
                              1. 0
                                KurtZ
                              2. 1
                                Christoph
                              3. 0

                                Lieber Christo__ph__ ;)

                                Christoph
                                1. 0
                                  KurtZ
                2. 0
                  Siechfred
                  1. 0

                    Lieber Siechfred!

                    KurtZ
                    1. 0
                      molily
                      1. 0
                        KurtZ
                3. 0
                  KurtZ
          2. 0

            Der Hash in Prototype

            Tim Tepaße
        3. 0
          Cheatah
          1. 0
            KurtZ
            1. 0
              Cheatah
      3. 0

        Übrigens, JS hat auch keine Arrays!

        KurtZ
        1. 0
          Don P
        2. 0
          Struppi
          1. 0
            KurtZ
            1. 0
              Struppi
              1. 0
                KurtZ
                1. 0
                  KurtZ
                2. 0
                  Struppi
                  1. 0
                    KurtZ
                    1. 0
                      Struppi
                      1. 0
                        KurtZ
                        1. 0
                          molily
                    2. 1
                      Don P
                      1. 0
                        KurtZ
                      2. 0
                        molily
                  2. 1
                    molily
        3. 2
          molily
        4. 0
          Harlequin
    3. 3
      KurtZ
    4. 0
      Struppi
      1. 0
        KurtZ
        1. 0
          molily
          1. 0
            KurtZ
            1. 0
              Christoph
              1. 0
                KurtZ
                1. 0
                  KurtZ
  3. 0

    Assoziative Arrays - es gibt sie doch!

    Christoph
    1. 0

      leicht modifiziert

      Christoph
      1. 0

        Iteratoren zur Realisierung von »reinen« Hashes nutzen

        Tim Tepaße
        1. 0
          Christoph
          1. 0
            Tim Tepaße
    2. 0
      Struppi