Wert auf Existenz prüfen im Object und Array mit dem IN-Operator

N

Netzwerkidi

Hallo in die Runde,

mal eine Frage an die Cracks: mit dem IN-Operator kann man offenbar in Objekten die Existenz von Werten checken. D. h. man muss nicht im Loop dadurch, sondern lässt das den IN-Operator machen. Warum geht das mit dem Array nicht auch, bzw. wie mache ich es?

Danke + Grüße
Idi

HTML:
<html>
  <head>
    <title></title>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <meta http-equiv='Content-Language' content='de-DE' />

  <script type="text/javascript">
  
    var div = document.createElement('div');
    for (prop in div.style) {
      if (div.style[prop]!="") 
        alert(prop+"="+div.style[prop]);
    }
    
    var arr1 = {a:'1',b:'2'};
    alert('a' in arr1);
    
    var arr2 = ['a','b'];
    alert('a' in arr2);
    
  </script>  
  </head>
  <body>
  </body>
</html>
 
Es geht auch mit Array, aber der in-Operator prüft, ob ein Schlüssel vorhanden ist, nicht aber ein Wert. In einem Array sind die Schlüssel Zahlen!

Javascript:
var arr2 = ['a','b'];
alert(0 in arr2);
alert(1 in arr2);
alert(2 in arr2);

Übrigens gibt es neben dem in-Operator auch die "hasOwnProperty" Methode.

Javascript:
var arr1 = {a:'1',b:'2'};
alert(arr1.hasOwnProperty('a'));

var arr2 = ['a','b'];
alert(arr2.hasOwnProperty(0));
alert(arr2.hasOwnProperty(1));
alert(arr2.hasOwnProperty(2));


Beides ist nicht exakt identisch. Wenn man weiß, was man tut, kann man beide richtig einsetzen.

Javascript:
var arr = {};
alert('toString' in arr);
alert(arr.hasOwnProperty('toString'));
 
Hai CPoly,
beim ersten Beispiel hau ich mir getz mit die Hand vor den Detz: na klar, stimmt ja!!
Aber property hätte ich jetzt eher mit Eigenschaften im Sinne von Methoden in Verbindung gebracht.
Obwohl, na ja, beim Objekt auch irgendwie. Das letzte Beispiel verdeutlicht meinen Konflikt wohl am besten: als "property"-Wert nicht existent, aber als Methode.
Wieder was gelernt!
Merrßi+Grüße
Idi

Nachtrag: hasOwnProperty scheint auch sicherer zu sein, denn:
invalid 'in' operand stringValue
http://www.bennadel.com/blog/1918-Javascript-s-IN-Operator-Does-Not-Work-With-Strings.htm
 
Zuletzt bearbeitet von einem Moderator:
Der Blog Eintrag ist einfach nur falsch. Er behauptet, es würde mit Zahlen funktionieren, erstellt aber explizit eine Instanz von der Klasse "Number". Das ist aber etwas anderes, als eine Zahl hin zuschreiben. Hätte er das mit String genauso gemacht, würde auch der in-Operator funktionieren.

Javascript:
var stringValue = new String("");

Der in Operator funktioniert mit allen Objekten.

Javascript:
alert(typeof "");
alert(typeof new String(""));

Edit: Das steht auch so in den Kommentaren zu dem Blogeintrag!


Das letzte Beispiel verdeutlicht meinen Konflikt wohl am besten: als "property"-Wert nicht existent, aber als Methode.

Nein, du musst genau aufpassen. Es heißt hasOwnProperty und nicht hasProperty! Das liefert true, wenn die Klasse diese Eigenschaft hat. Aber nicht, wenn eine der Eltern diese hat! "toString" ist eine Basis Eigenschaft von Objekten. Zwar hat jedes andere Objekt (z.B. eine Klasse Namens "Katze") auch eine toString Methode, aber hasOwnProperty ist false. Es sei denn, du überschreibst toString für deine Katze-Klasse.
 
Zuletzt bearbeitet:
Lass mich raten, das Weizenbier ist ohne Allehohl?

Interessant, dass offenbar ein Deutscher ("Martin Mädler") "die Nadel" auf seinen Fehler hinweist ;-)
Apropos: "Die Nadel" - GUTER FILM!

Merrßi
 
Zuletzt bearbeitet von einem Moderator:
Zurück