Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Functions mit optionalen Parametern

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.6k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.1k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    2.9k

Functions mit optionalen Parametern

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
38 Beiträge 6 Kommentatoren 2.4k Aufrufe 5 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • AlCalzoneA AlCalzone

    Der Editor hat schon "Recht". arguments stammt noch aus der JS-Steinzeit und kann z.B. für Verwirrung sorgen, wenn man auf Arrow-Funktionen umstellt.

    Heutzutage macht man das mit Rest-Parametern, die mittlerweile auch überall unterstützt sind:

    function mytest(...args) {
       // ...
    }
    
    mytest(1,2,3,4);
    

    ist vollkommen OK. So kann man z.B. auch einige Parameter fest vorgeben und den Rest flexibel lassen:

    function mytest(ist, immer, da, ...nurManchmal) {
       // ...
    }
    
    mytest(1,2,3); // OK
    mytest(1,2,3,4); // OK
    mytest(1,2); // Nicht OK
    

    Allgemein empfehle ich für Funktionen mit vielen Parametern, die auch gerne mal optional sind, stattdessen das Bag-of-Options pattern:

    function mytest(options) {
      if (options.abc === 1) {
        // ...
      }
      // etc...
    }
    
    mytest({
      abc: 1,
      def: 7,
      //...
    });
    

    Das hat den Vorteil, dass man nicht die Hälfte der Funktion benötigt, um Overloads auseinander zu dividieren. und außerdem sieht man bei der Aufrufstelle direkt, wofür welcher Wert steht.

    paul53P Offline
    paul53P Offline
    paul53
    schrieb am zuletzt editiert von
    #26

    @alcalzone sagte: So kann man z.B. auch einige Parameter fest vorgeben und den Rest flexibel lassen

    Man kann auch alle Parameter fest vorgeben, wenn man bei Nichtvorhandensein einen voreingestellten Wert zuweist.

    Bild_2021-04-20_191534.png

    Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
    Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

    AlCalzoneA 1 Antwort Letzte Antwort
    0
    • AlCalzoneA AlCalzone

      Der Editor hat schon "Recht". arguments stammt noch aus der JS-Steinzeit und kann z.B. für Verwirrung sorgen, wenn man auf Arrow-Funktionen umstellt.

      Heutzutage macht man das mit Rest-Parametern, die mittlerweile auch überall unterstützt sind:

      function mytest(...args) {
         // ...
      }
      
      mytest(1,2,3,4);
      

      ist vollkommen OK. So kann man z.B. auch einige Parameter fest vorgeben und den Rest flexibel lassen:

      function mytest(ist, immer, da, ...nurManchmal) {
         // ...
      }
      
      mytest(1,2,3); // OK
      mytest(1,2,3,4); // OK
      mytest(1,2); // Nicht OK
      

      Allgemein empfehle ich für Funktionen mit vielen Parametern, die auch gerne mal optional sind, stattdessen das Bag-of-Options pattern:

      function mytest(options) {
        if (options.abc === 1) {
          // ...
        }
        // etc...
      }
      
      mytest({
        abc: 1,
        def: 7,
        //...
      });
      

      Das hat den Vorteil, dass man nicht die Hälfte der Funktion benötigt, um Overloads auseinander zu dividieren. und außerdem sieht man bei der Aufrufstelle direkt, wofür welcher Wert steht.

      Ben1983B Offline
      Ben1983B Offline
      Ben1983
      schrieb am zuletzt editiert von
      #27

      @alcalzone und optional ist irgendwo als JSON deklariert, oder wie?
      Ist eigentlich JSON sowas wie eine Klasse in C#?

      OliverIOO 1 Antwort Letzte Antwort
      0
      • Ben1983B Ben1983

        @alcalzone und optional ist irgendwo als JSON deklariert, oder wie?
        Ist eigentlich JSON sowas wie eine Klasse in C#?

        OliverIOO Offline
        OliverIOO Offline
        OliverIO
        schrieb am zuletzt editiert von OliverIO
        #28

        @ben1983 sagte in Functions mit optionalen Parametern:

        @alcalzone und optional ist irgendwo als JSON deklariert, oder wie?
        Ist eigentlich JSON sowas wie eine Klasse in C#?

        Ist einfach nur eine Textdarstellung eines Objektes. Ein Objekt kann so etwas wie eine Klasse in C# sein. Dadurch lassen sich einfach und problemlos daten speichern, über Systemgrenzen hinweg transportieren und auch wieder einlesen und weiterverarbeitbar

        In C# findest du die Entsprechung unter dem Stichwort serialize und deserialize. Da gibt es dann diverse (bspw binary und auch JSON)
        https://de.wikipedia.org/wiki/JavaScript_Object_Notation

        Meine Adapter und Widgets
        TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
        Links im Profil

        Ben1983B 1 Antwort Letzte Antwort
        0
        • OliverIOO OliverIO

          @ben1983 sagte in Functions mit optionalen Parametern:

          @alcalzone und optional ist irgendwo als JSON deklariert, oder wie?
          Ist eigentlich JSON sowas wie eine Klasse in C#?

          Ist einfach nur eine Textdarstellung eines Objektes. Ein Objekt kann so etwas wie eine Klasse in C# sein. Dadurch lassen sich einfach und problemlos daten speichern, über Systemgrenzen hinweg transportieren und auch wieder einlesen und weiterverarbeitbar

          In C# findest du die Entsprechung unter dem Stichwort serialize und deserialize. Da gibt es dann diverse (bspw binary und auch JSON)
          https://de.wikipedia.org/wiki/JavaScript_Object_Notation

          Ben1983B Offline
          Ben1983B Offline
          Ben1983
          schrieb am zuletzt editiert von
          #29

          @oliverio OK, wie kann ich denn über createState einen STate mit JSON Inhalt deklarieren, oder eine lokale Variable?

          Ziel soll sein, dass ich quasi eine Struktur erzeugen möchte.
          Dies gerne durch ein JSON.

          Bsp.
          MyVar = {Name: MyName, Age: 37, Hair: Brown}

          OliverIOO 1 Antwort Letzte Antwort
          0
          • Ben1983B Ben1983

            @oliverio OK, wie kann ich denn über createState einen STate mit JSON Inhalt deklarieren, oder eine lokale Variable?

            Ziel soll sein, dass ich quasi eine Struktur erzeugen möchte.
            Dies gerne durch ein JSON.

            Bsp.
            MyVar = {Name: MyName, Age: 37, Hair: Brown}

            OliverIOO Offline
            OliverIOO Offline
            OliverIO
            schrieb am zuletzt editiert von
            #30

            @ben1983 sagte in Functions mit optionalen Parametern:

            @oliverio OK, wie kann ich denn über createState einen STate mit JSON Inhalt deklarieren, oder eine lokale Variable?

            Ziel soll sein, dass ich quasi eine Struktur erzeugen möchte.
            Dies gerne durch ein JSON.

            Bsp.
            MyVar = {Name: MyName, Age: 37, Hair: Brown}

            Dein JSON hat Fehler. die Anführungsstriche vor den Strings fehlen.
            Entweder du definierst es als richtigen String

            var myVar = '{Name: "MyName", Age: 37, Hair: "Brown"}';
            setState("javascript.0.test", MyVar, true);
            

            oder als Javascript-Objectliteral welches du dann in einen String umwandelst

            var myVar = {
                Name: "MyName",
                Age: 37,
                Hair: "Brown"
            }
            setState("javascript.0.test", JSON.stringify(myVar), true);
            

            in beiden Fällen muss man beim auslesen der Daten aus dem Datenpunkt den String wieder in ein Objekt zurückverwandeln

            var myVar = JSON.parse(getState("javascript.0.test"));
            

            Meine Adapter und Widgets
            TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
            Links im Profil

            Ben1983B 1 Antwort Letzte Antwort
            0
            • OliverIOO OliverIO

              @ben1983 sagte in Functions mit optionalen Parametern:

              @oliverio OK, wie kann ich denn über createState einen STate mit JSON Inhalt deklarieren, oder eine lokale Variable?

              Ziel soll sein, dass ich quasi eine Struktur erzeugen möchte.
              Dies gerne durch ein JSON.

              Bsp.
              MyVar = {Name: MyName, Age: 37, Hair: Brown}

              Dein JSON hat Fehler. die Anführungsstriche vor den Strings fehlen.
              Entweder du definierst es als richtigen String

              var myVar = '{Name: "MyName", Age: 37, Hair: "Brown"}';
              setState("javascript.0.test", MyVar, true);
              

              oder als Javascript-Objectliteral welches du dann in einen String umwandelst

              var myVar = {
                  Name: "MyName",
                  Age: 37,
                  Hair: "Brown"
              }
              setState("javascript.0.test", JSON.stringify(myVar), true);
              

              in beiden Fällen muss man beim auslesen der Daten aus dem Datenpunkt den String wieder in ein Objekt zurückverwandeln

              var myVar = JSON.parse(getState("javascript.0.test"));
              
              Ben1983B Offline
              Ben1983B Offline
              Ben1983
              schrieb am zuletzt editiert von
              #31

              @oliverio ok, aber was setzt Du da auf True?
              Wie verändert man bspw. den Wert „Age“?

              OliverIOO 1 Antwort Letzte Antwort
              0
              • Ben1983B Ben1983

                @oliverio ok, aber was setzt Du da auf True?
                Wie verändert man bspw. den Wert „Age“?

                OliverIOO Offline
                OliverIOO Offline
                OliverIO
                schrieb am zuletzt editiert von OliverIO
                #32

                @ben1983

                myVar.Age=11;

                Das sind Basics in JavaScript
                Ich empfehle dir mal ein Tutorial
                https://wiki.selfhtml.org/wiki/JavaScript/Tutorials

                Meine Adapter und Widgets
                TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                Links im Profil

                Ben1983B 1 Antwort Letzte Antwort
                0
                • paul53P paul53

                  @alcalzone sagte: So kann man z.B. auch einige Parameter fest vorgeben und den Rest flexibel lassen

                  Man kann auch alle Parameter fest vorgeben, wenn man bei Nichtvorhandensein einen voreingestellten Wert zuweist.

                  Bild_2021-04-20_191534.png

                  AlCalzoneA Offline
                  AlCalzoneA Offline
                  AlCalzone
                  Developer
                  schrieb am zuletzt editiert von
                  #33

                  @paul53 sagte in Functions mit optionalen Parametern:

                  Man kann auch alle Parameter fest vorgeben, wenn man bei Nichtvorhandensein einen voreingestellten Wert zuweist.

                  Ohne jetzt eine Glaubensdiskussion vom Zaun brechen zu wollen, aber das gehört mmn. zumindest in die Funktionssignatur. Entweder als default-Parameter

                  function mytest(immer, manchmal = 0) {
                   // ...
                  }
                  

                  oder als JSDoc, welches den Parameter als optional deklariert:

                  /**
                   * @param {number} [manchmal] Wird nur manchmal mit einer Zahl befüllt
                   */
                  function mytest(immer, manchmal) {
                    if (manchmal === undefined) manchmal = 0;
                    // ...
                  }
                  

                  In beiden Fällen kann man dort sehen, wo man die Funktion nutzt, welche Parameter nötig sind und muss nicht immer die Implementation nachschlagen und nachvollziehen.

                  Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                  1 Antwort Letzte Antwort
                  0
                  • OliverIOO OliverIO

                    @ben1983

                    myVar.Age=11;

                    Das sind Basics in JavaScript
                    Ich empfehle dir mal ein Tutorial
                    https://wiki.selfhtml.org/wiki/JavaScript/Tutorials

                    Ben1983B Offline
                    Ben1983B Offline
                    Ben1983
                    schrieb am zuletzt editiert von
                    #34

                    @oliverio ich hatte es genau so versucht.
                    Wieder Fehlermeldungen des Editors.
                    Wenn man natürlich immer Fehlermeldungen angezeigt bekommt, die keine sind, macht es die Sache nicht unbedingt einfacher.

                    OliverIOO 1 Antwort Letzte Antwort
                    0
                    • Ben1983B Ben1983

                      @oliverio ich hatte es genau so versucht.
                      Wieder Fehlermeldungen des Editors.
                      Wenn man natürlich immer Fehlermeldungen angezeigt bekommt, die keine sind, macht es die Sache nicht unbedingt einfacher.

                      OliverIOO Offline
                      OliverIOO Offline
                      OliverIO
                      schrieb am zuletzt editiert von OliverIO
                      #35

                      @ben1983 sagte in Functions mit optionalen Parametern:

                      @oliverio ich hatte es genau so versucht.
                      Wieder Fehlermeldungen des Editors.
                      Wenn man natürlich immer Fehlermeldungen angezeigt bekommt, die keine sind, macht es die Sache nicht unbedingt einfacher.

                      Bei welchen Code gibt es welche Fehlermeldung?
                      Der verwendete Editor ist eigentlich schon gut. Da es die "Steinzeit"-Befehle als Fehler anzeigt, ist wohl Absicht, obwohl sie keine Fehler im engeren sinne sind.

                      Einfach das Skript laufen lassen. ggfs. die Debug und Verbose-Option anschalten.
                      die echten Fehlermeldungen (Konsolenausgabe in roter Farbe) kommen dann im Protokollbereich, wobei die Ausgabe da auch nicht immer optimal ist. Aber in der neuen Version mit dem aktivierbaren debugger hat sich das ein wenig gebessert.

                      Poste hier am besten mit konkreten Code-Beispielen, die man am besten direkt ausprobieren kann. ich und auch die anderen verfolgen nicht nur diesen Post, sondern noch einige mehr und wissen nicht immer, was da vorher alles so besprochen worden ist.

                      Meine Adapter und Widgets
                      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                      Links im Profil

                      Ben1983B 1 Antwort Letzte Antwort
                      0
                      • OliverIOO OliverIO

                        @ben1983 sagte in Functions mit optionalen Parametern:

                        @oliverio ich hatte es genau so versucht.
                        Wieder Fehlermeldungen des Editors.
                        Wenn man natürlich immer Fehlermeldungen angezeigt bekommt, die keine sind, macht es die Sache nicht unbedingt einfacher.

                        Bei welchen Code gibt es welche Fehlermeldung?
                        Der verwendete Editor ist eigentlich schon gut. Da es die "Steinzeit"-Befehle als Fehler anzeigt, ist wohl Absicht, obwohl sie keine Fehler im engeren sinne sind.

                        Einfach das Skript laufen lassen. ggfs. die Debug und Verbose-Option anschalten.
                        die echten Fehlermeldungen (Konsolenausgabe in roter Farbe) kommen dann im Protokollbereich, wobei die Ausgabe da auch nicht immer optimal ist. Aber in der neuen Version mit dem aktivierbaren debugger hat sich das ein wenig gebessert.

                        Poste hier am besten mit konkreten Code-Beispielen, die man am besten direkt ausprobieren kann. ich und auch die anderen verfolgen nicht nur diesen Post, sondern noch einige mehr und wissen nicht immer, was da vorher alles so besprochen worden ist.

                        Ben1983B Offline
                        Ben1983B Offline
                        Ben1983
                        schrieb am zuletzt editiert von
                        #36

                        @oliverio ok.
                        Was genau macht denn die Debug Funktion?
                        Denn breakpoints kann man ja nicht setzen, oder? Oder einzelschritt.

                        GarganoG OliverIOO 2 Antworten Letzte Antwort
                        0
                        • Ben1983B Ben1983

                          @oliverio ok.
                          Was genau macht denn die Debug Funktion?
                          Denn breakpoints kann man ja nicht setzen, oder? Oder einzelschritt.

                          GarganoG Offline
                          GarganoG Offline
                          Gargano
                          schrieb am zuletzt editiert von
                          #37

                          @ben1983 Breakpoints und Einzelschritt geht inzwischen. Mal den Käferbutton drücken, im Expertenmodus

                          1 Antwort Letzte Antwort
                          0
                          • Ben1983B Ben1983

                            @oliverio ok.
                            Was genau macht denn die Debug Funktion?
                            Denn breakpoints kann man ja nicht setzen, oder? Oder einzelschritt.

                            OliverIOO Offline
                            OliverIOO Offline
                            OliverIO
                            schrieb am zuletzt editiert von
                            #38

                            @ben1983 said in Functions mit optionalen Parametern:

                            @oliverio ok.
                            Was genau macht denn die Debug Funktion?
                            Denn breakpoints kann man ja nicht setzen, oder? Oder einzelschritt.

                            Ab Version 5.1.3 des skript adapters geht das. das ist nagelneu. habe es selbst noch nicht so ausprobiert.

                            die debug und verbose funktion gibt dir im protokoll bereich mehr informationen aus und bestimmte funktionen werden nur simuliert. probier es einfach aus. ich verwende sie selbst nicht so oft.

                            Meine Adapter und Widgets
                            TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                            Links im Profil

                            1 Antwort Letzte Antwort
                            0
                            Antworten
                            • In einem neuen Thema antworten
                            Anmelden zum Antworten
                            • Älteste zuerst
                            • Neuste zuerst
                            • Meiste Stimmen


                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            793

                            Online

                            32.4k

                            Benutzer

                            81.5k

                            Themen

                            1.3m

                            Beiträge
                            Community
                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                            ioBroker Community 2014-2025
                            logo
                            • Anmelden

                            • Du hast noch kein Konto? Registrieren

                            • Anmelden oder registrieren, um zu suchen
                            • Erster Beitrag
                              Letzter Beitrag
                            0
                            • Home
                            • Aktuell
                            • Tags
                            • Ungelesen 0
                            • Kategorien
                            • Unreplied
                            • Beliebt
                            • GitHub
                            • Docu
                            • Hilfe