librarian: Objekt-Literal als Param übergeben -Problem bei Abfrage d. props

Hallo!
Für meine library habe ich eine fade-Funktion geschrieben, der man als
Parameter ein Objekt-Literal übergibt:
Z.B.:

  
{  
  repeat: 3,  
  sec: {  
    in: 1,  
    out: 3,  
  },  
  to: 50,  
  off: true  
}  

Nun möchte ich in der Funktion die übermittelten Werte der Objekt-Eigenschaften
überprüfen und ggf. default-Werte einsetzen:

  
fade : function( spec ) {  
  if ( !spec ) {  
    spec = { sec: {} };  
  } else {  
	if ( !spec.sec ) {  
	  spec.sec = {};  
	}  
  }  
  var to = spec.to || 0  
  ,	off = spec.off ? 2 : 1  
  ,	rep = spec.repeat  
  ,	dur = spec.duration  
  ,	_on = spec.sec.on * 1000 || 2000  
  ,	_off = spec.sec.off * 1000 || 0  
  ,	_in = spec.sec.in * 1000 || 2000  
  ,	_out = spec.sec.out * 1000 || 2000;  
  
  // do stuff  
}  

Mein Hauptproblem bei einer solchen Wert-Zuweisung einer Variablen
( also var bla = spec.bla || blo ) ist, dass der logische Operator || eine
0 anscheinend als false wertet und wenn als Wert 0 übergeben wird
(z.B. { sec: { in: 0 } }), dann wird automatisch der default-Wert - in obigem Bsp. 2000 - gewählt.
Kann man das geschickt vermeiden, ohne viel mehr Zeilen durch Fallunterscheidungen mit isNaN oder typeof oder so hinzunehmen zu müssen?

2. Frage: Gibt es eine "bessere" Alternative für meine if-else-Abfrage ganz oben?
Damit ich nämlich so etwas wie var _on = spec.sec.on || 2 machen kann, muss
ja erstens spec und zweitens spec.sec existieren.

Hoffe, meine Problemdarstellungen sind verständlich,
vielen lieben Dank im Voraus für jede Antwort :)

Gruß

  1. [latex]Mae  govannen![/latex]

    Mein Hauptproblem bei einer solchen Wert-Zuweisung einer Variablen
    ( also var bla = spec.bla || blo ) ist, dass der logische Operator || eine
    0 anscheinend als false wertet und wenn als Wert 0 übergeben wird
    (z.B. { sec: { in: 0 } }), dann wird automatisch der default-Wert - in obigem Bsp. 2000 - gewählt.
    Kann man das geschickt vermeiden, ohne viel mehr Zeilen durch Fallunterscheidungen mit isNaN oder typeof oder so hinzunehmen zu müssen?

    Um die reine Existenz einer Eigenschaft abzufragen, kannst du hasOwnProperty() benutzen.

    Stur lächeln und winken, Männer!
    Kai

    --
    Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken
    in Richtung "Mess up the Web".(suit)
    SelfHTML-Forum-Stylesheet
    1. Hallo Kai!

      Um die reine Existenz einer Eigenschaft abzufragen, kannst du hasOwnProperty() benutzen.

      Also für jede prop eine if-else-Zeile?

        
      var _in;  
      if ( spec.sec.hasOwnProperty( 'in' ) { _in = spec.sec.in; } else { _in = 2; }  
      
      

      OK, wenn das nicht kürzer geht, dann isses halb so :D
      Vielen Dank Dir!

      1. [latex]Mae  govannen![/latex]

        Also für jede prop eine if-else-Zeile?

        var _in;
        if ( spec.sec.hasOwnProperty( 'in' ) { _in = spec.sec.in; } else { _in = 2; }

        [code lang=javascript]_in = (spec.sec.hasOwnProperty( 'in' )) ? spec.sec.in : 2;

          
        [[1](https://developer.mozilla.org/en/JavaScript/Reference/Operators/Conditional_Operator)][[2](http://de.selfhtml.org/javascript/sprache/bedingt.htm#entweder_oder)]  
          
          
        Stur lächeln und winken, Männer!  
        Kai
        
        -- 
        Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken  
        in Richtung "Mess up the Web".([suit](https://forum.selfhtml.org/?t=197497&m=1324775))  
        [SelfHTML-Forum-Stylesheet](http://selfhtml.knrs.de/#h_stylesheet)
        
    2. Hallo,

      Um die reine Existenz einer Eigenschaft abzufragen, kannst du hasOwnProperty() benutzen.

      Das prüft zusätzlich, ob die Eigenschaft am Objekt selbst anstatt über die Prototypenkette gefunden wurde. Manchmal braucht man diese Einschränkung, aber in der Regel sollte man nicht darauf bestehen – schließlich ist prototypische Delegation eines der besten Features von JavaScript.

      Mathias

      1. [latex]Mae  govannen![/latex]

        Um die reine Existenz einer Eigenschaft abzufragen, kannst du hasOwnProperty() benutzen.

        Das prüft zusätzlich, ob die Eigenschaft am Objekt selbst anstatt über die Prototypenkette gefunden wurde. Manchmal braucht man diese Einschränkung, aber in der Regel sollte man nicht darauf bestehen – schließlich ist prototypische Delegation eines der besten Features von JavaScript.

        Ja. Bei einem reinen Konfigurations-Objekt für eine Funktion bin ich allerdings nicht von vererbten Werten ausgegangen. Alternativen hast du ja bereits genannt.

        Stur lächeln und winken, Männer!
        Kai

        --
        Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken
        in Richtung "Mess up the Web".(suit)
        SelfHTML-Forum-Stylesheet
  2. Mein Hauptproblem bei einer solchen Wert-Zuweisung einer Variablen
    ( also var bla = spec.bla || blo ) ist, dass der logische Operator || eine
    0 anscheinend als false wertet und wenn als Wert 0 übergeben wird

    Der ||-Operator wandelt in Boolean um und testet auf true.
    0 ist ein falsy value, er wird bei der Umwandlung in Boolean zu false.

    Siehe http://aktuell.de.selfhtml.org/artikel/javascript/objektabfragen/

    Kann man das geschickt vermeiden, ohne viel mehr Zeilen durch Fallunterscheidungen mit isNaN oder typeof oder so hinzunehmen zu müssen?

    typeof wäre eine Möglichkeit.

    in ginge auch noch.

    Oder == null, was auf undefined und null zutrifft.

    if (!opts) opts = {};
    if (!('foo' in opts)) opts.foo = …;
    if (!('bar' in opts)) opts.bar = …;
    usw.

    Das alles von Hand zu schreiben ist tatsächlich Quatsch. So einen Code will man nicht schreiben und nicht lesen. Dafür sollte man eine gute Bibliothek verwenden, z.B. Underscore mit der defaults-Methode. YUI und Prototype bieten m.W. etwas ähnliches.

    Und allgemein kann man solche Ausdrücke viel einfacher in der Meta-Sprache CoffeeScript schreiben. Dort gibt es Default-Werte für Parameter und den Existential Operator.

    Mathias

  3. Vielen Dank an Kai und molily!
    Habt mir weiter geholfen. Und die Links guck ich mir gleich mal an :)
    Mal sehen, vielleicht kann ich das etwas Nettes abschauen für meine lib -
    auf andere Libs zurückgreifen will ich speziell in diesem Projekt nicht, weil
    ich ja eben meine eigene schreibe. Um der Warum-Frage vorwegzugreifen:
    Macht Spaß und man lernt dabei am besten;)
    Lieben Gruß

    1. [latex]Mae  govannen![/latex]

      Vielen Dank an Kai und molily!
      Habt mir weiter geholfen. Und die Links guck ich mir gleich mal an :)

      Aber molily's Hinweis an mich beachten, das hatte ich nicht bedacht.

      var cfg1 = {  
          foo: 2,  
          bar: 'hallo',  
          answer: 42  
      };  
        
      var cfg2 = Object.create(cfg1);  
      cfg2. foo = 3;  
        
      function func (o) {  
          alert(o.hasOwnProperty('bar'));  
          alert('bar' in o);  
      }  
        
        
      func(cfg1); // true true  
      func(cfg2); // false true  
      
      

      Stur lächeln und winken, Männer!
      Kai

      --
      Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken
      in Richtung "Mess up the Web".(suit)
      SelfHTML-Forum-Stylesheet