 So. Jetzt haben wir auch Bild. Das ist ganz praktisch, wenn ich euch ein bisschen Code zeigen will. Und zwar JavaScript. Den Vortrag habe ich so schon zweimal gehalten auf Chars-Veinstaltungen. Jetzt auf der MAMC das erste Mal und dann auf der Hackover letztes Jahr. Er verinnert sich immer ein bisschen, weil dadurch, dass ich täglich mit JavaScript arbeite und verschiedensten Code sehe in Open Source Projekten und auf der Arbeit leider auch. Und manchmal, uff, uff, was man da, also da kann man halt, man kann schon echt geilen Scheiß machen mit JavaScript. Also man kann auch echt guten Code mit guter Codebasis und gut lesbar. Das geht alles inzwischen. Ist aber nicht der lustige Teil. The talk heißt The Good, The Bad, the Jagdli. Ich habe aber schon beim ersten Mal festgestellt, dass Jagdli viel lustiger ist. Außer ist das viel länger. Also fangen wir damit an. Also ich vermute, dass wir zu so gut gar nicht kommen, sondern noch so bad haben und dann ist es auch die Zeit rum. Es ist aber eigentlich auch egal. Dann nehmt ihr zumindest mit, was damit eklig ist, geht und bitte schreibt das so nicht. Es geht auch anders. Ja, fangen wir mal an mit. The Jagdli. Da kommen jetzt, also es wird jetzt eigentlich nur ein paar Folien mit Codebeispielen. Ich erkläre euch mal, was dazu vor allem, warum das so ist. Manchmal, warum das sinnvoll ist. Oft, warum machen die das so? Es ist halt alles. Also JavaScript ist halt eine Sprache. Die hat sich mal so im Branden Eich ausgedacht, relativ kurzfristig, so zwei Tage. Bei dem Ergebnis sieht man das auch. Na ja, das ist, ist es halt die Sprache im Web. Wir können da so nix ändern, was schon mal so Standard war, weil dann geht das Internet kaputt. Und das Internet wollen wir ja alle nicht kaputt haben. Deswegen kommen da neue Sachen hinzu. Die sind meistens auch besser. Manchmal ist das einfach nur fragwürdig, was sie da getan haben. Aber na ja, es ist jetzt halt so Standard geworden. Inzwischen ist es hier ein Living-Standard, genau so wie HTML. Also da erinnert sich eigentlich durchgehend irgendwas, aber es kommen halt nur Sachen hinzu. Sachen, die einmal Standard waren, bleiben so. Deswegen dauert es relativ lange, bis Sachen im Standard sind, weil inzwischen versuchen sie sich da echt Gedanken zuzumachen. Und die neuen Sachen, die so kommen, sind eigentlich auch relativ klar gut, jetzt aus meiner Sicht. Aber was wir da so früher hatten und manchmal frage ich mich auch, warum wir da jetzt nicht für bestimmte Probleme nicht mal was Besseres machen, da wird uns bestimmt was Besseres einfallen. Weil, na ja, da wird uns was Besseres einfallen, Punkt. Ja, also erst mal fangen wir mit so Sachen an wie, na javascript versucht natürlich keine Fehler zu werfen. Nie, weil Fehler werfen heißt, er interpretert heute auf und dann ist vorbei. Es ist schlecht. Also versuchen wir erst mal, das jedem irgendwie was zu bauen. Man sieht man hier halt so ein bisschen arithmetische Operation mit plus. Warum? Also es ist halt, wenn es in Areas, dann versucht er halt den Arean halt immer zu nehmen und scheinmäßig nimmt er mal einen String. Deswegen kriegen wir ein leeres Arey, was wir mit einem arithmetischen plus vermindern, ein leerer String. Und zwei leere Strings sind immer noch ein leerer String. Haben ja nichts. Ja, wenn wir leeren String haben und ein Objekt da drauf packen, dann wird halt 2 String auf dem Objekt gemacht, was halt standardmäßig Objekt, Objekt ist. Nicht hilfreich, aber immerhin kein Fehler. Warum, wenn wir das andersrum machen, plötzlich null rauskriegen, das steht halt so in der Spec. Aber ich habe auch noch nicht rausgefunden, warum das jetzt so sinnvoll ist. Also es ist halt so. Aber ja, müssen wir jetzt mit leben. Damit kann man auch lustige Dinge tun, aber bitte nicht produktiv benutzen. Da kommen wir, wie gesagt, gleich zu. Das ist wieder schon ein schönes Beispiel. Wir haben ja so ein bisschen erlort. Also erlort die Funktionen, die wir hier kennen, gibt so ein nerviges Pop-up-Window gedohnt zum Browser. Denutzt man eigentlich nicht mehr, weil, wenn man die öfter triggert, sagt der Browser auch irgendwann so ein nettes Häkchen, dass man die jetzt unterdrückt, weil die nerven, weil dann ist auch die Seite dahinter angehalten. Das macht überhaupt keinen Sinn, dass man die benutzt. Aber das war halt mal Standard. Also es war mal im Standard, deswegen bleibt es im Standard. Und deswegen geht es auch weiterhin. Aber Punkt Call führt die Funktion einfach nur auf mit einem anderen Kontext und Apply auch nur, dass dann die Parameter anders gepasst werden. Nämlich einmal bei Call muss man jeden Parameter einzeln angeben und das ist so, als würde man den der Funktion übergeben. Bei Apply gibt man einen Area-Parametern über und dann ist das erste Parameter im zweiten Parameter und so weiter. Das Ergebnis von diesem Ding wird wahrscheinlich keiner wissen, der das nicht schon weiß. Es ist zwei. Es ist übrigens völlig irrelevant, was in dieser Funktion und in den Parametern steht. Das ist immer zwei. Sofern man mindestens einen Call hat da drin, vor dem Apply, das ist wiederum wichtig, hat man zwei. Ist halt so. Wie frei war der Dialog dann noch erscheinend? Nein. Ja, jetzt kommen wir zu so Dingen. Also es gibt zwei Dachern, es gibt gleich gleich gleich und gleich gleich. Das ist relevant in dem Sinne, dass bitte benutzt keinen gleich gleich. Das macht nämlich... Wir gucken, ob Werte gleich sind, wir ignorieren aber den Typen von dem Ding. Ja, JavaScript hat keine Typen, aber eigentlich hat es Typen. Aber es tut so, als hat es keine. Führt dazu, dass wenn man gleich gleich benutzt, er einfach guckt, kriege ich die beiden Sachen so irgendwie mit meinen Parsing-Regeln gepasst, dass es der gleiche Wert ist. Was halt meistens dann drauf nur läuft, ob etwas eins oder zwei ist. Das ist echt nervig, weil du weißt dann nicht, ob du wirklich eine Zahl hast zum Beispiel oder ob du gerade die Eingabe von einem String hast, da hat da halt jemand 20 eingegeben und du willst gucken, ob sie zahl 20 ist, um dann später damit was zu tun. Du willst eigentlich immer gucken, ob der Typ auch gleich ist. Weil sonst kommen komische Fehler und die sind echt kackt zu liebern. Es gibt tatsächlich eine Ausnahme, Null und undefined. Da gibt es manchmal im Test, ob man gleich gleich Null macht, weil das ist dann auch undefined und nur auch undefined. Aber das muss man halt auch wissen, um das zu tun. Ansonsten einfach gleich gleich gleich benutzen. Aber wir haben halt auch den gleich gleiche Operator, der ist halt da. Sind halt mehr Zeichen. Ist halt auch der Vorteil, wenn man Dinge irgendwie minified, macht er das dritte gleich auch weg. Weil es ist halt egal. Ja, es ist nicht egal, aber wenn du es durchgängig mit gleich gleichgemacht machst, wird es irgendwann egal. Es ist ein Unsafe Optimization. Du kannst damit komische Effekte kriegen, in der Regel ist die aber per Default an. Ja, es ist wieder komisch. Ja, das ist aber jedenfalls falls, weil True ist nicht gleich, gibt es halt eins. Da sind wir uns alle einig, da ist sogar der, was gibt uns einig. Jetzt haben wir das da. Wenn True nicht eins ist, dann kann ja nicht True und True gleich zwei sein, weil dann müsste es ja quasi eins sein. Ja, doch. Ist ganz einfach. Ein Plus ist kein gleich gleich gleich, das ignoriert die Typen und es versucht, das jetzt passend zu machen. Na ja, also, dass True halt irgendwie eins ist, das können wir uns, glaube ich, auch alle drauf einigen. Das kann man schon als eins sehen. Aber JavaScript findet auch. Ja, das ist nur eins, das ist ganz klar zwei. So, das ist ein Exercise für dich. Viel Spaß, das wird einige Stunden. Zumindest, wenn du nicht genau weißt, wo. Machst du die Frage, ob ich direkt aufkläre, warum das Alert Call Call Apply 2 ist. Nee, das dürft ihr selber machen. Ein bisschen müsst ihr auch als Hausaufgabe kriegen. Glaub mal, danach verstehst du, JavaScript gibt viel mehr. So, jetzt haben wir das hier. Das ist ganz klar False. Egal, was X ist, das muss False sein. Sehen wir uns, glaube ich, alle einig. Na ja, es gibt Werte, wo das True ist. Nee, Frau Hofstra, haben die Feindes? Nein. Wenn X das ist, ist es True. Jeder der... Jeder der Gleitkörperzahl kennt, der weiß. Irgendwann wird das ungenau. Das sind wir halt bei dem, weil das ist effektiv das. Und JavaScript merkt sich halt schon so ein bisschen, was du da eingegeben hast. Deswegen addiert er auf die ursprüngliche Zahl die eins und nicht auf das Ergebnis davon. Weil, wenn er auf das 1.0.0. das Ganze machen würde, dann würde er da das Ganze plus eins auch hinkriegen. Also, hier auf plus eins wäre wieder eine Zahl größer und eine andere und nicht die gleiche. Es ist halt Gleitkummerzahlen. Hier hingegen gibt es... Nee, aber es ist eine große Zahl. Und alle Zahlen sind Gleitkummerzahlen in JavaScript. Es gibt den Typ Number. Fertig. Ja. Jetzt wiederum, das wiederum ist der klassische Fall. Das ist falsch. Genau, das ist tatsächlich richtig, dass das falsch ist, weil die machen halt die Gleitkummer-Spezifikation und die sagt, das ist falsch. Ist also alles korrekt. Sieht natürlich trotzdem scheiße aus. Und wenn man jetzt nicht gerade genau weiß, die Gleitkummer. Und ja, JavaScript ist halt eine Sprache. Die benutzen auch viele, die gar nicht so viel vom Programmieren wissen. Das ist halt erst mal irritierend. Also, die Kurzantwort, weil es in der Speck steht. Okay. Nein? Ja. Also, die Antwort, die Burg.gedee hat gesagt, die 0,1 ist nicht als Gleitkummerzahl binär darstellbar, sondern da ist ein Rest. Also, es ist halt nicht genau das. Es ist ziemlich genau das, aber nicht genau das. Und ich habe ja gefragt, ob es genau 0,3 ist. Und das ist es nicht. Nee, auch dann wäre es falsch, weil es ist eine andere Zahl einfach tatsächlich. Das Gleich gleich und das Gleich gleich ignoriert nur Typen, aber nicht Werte. Da kriegt es halt nicht hin. Du wirst halt nicht hinkriegen, dass 0,1 plus 0,2 ist halt niemals 0,3, genau. Aber fast. Aber danach habe ich halt nicht gefragt. Ja. Jetzt sind wir wieder bei Sachen mit Strings. Da kommen wir wieder auf. Naja, das geht halt prinzipiell erst mal nicht. Jetzt ist die Frage, was macht er? Versucht er die zwei als Number zu pasen oder die eins als String? Der, der valide ist so ein Ding, muss man wissen, ist 21. String vorne heißt, wir machen String aus allem, was dahinter kommt. Minus wiederum. Naja, ich kann keine eins vom String abziehen. Jetzt sind wir bei 1. Okay, ist halt so. Ja, dann noch solche Dinge. Also, 0 und minus 0 sind zwar, das ist nicht das Gleiche. Aber wenn wir so fragen, ist es das Gleiche. Es gibt ein paar Stellen, wo das nicht das Gleiche ist. Dann haben wir noch solche Sachen. Wenn wir 0 und minus 0 das Gleiche ist, dann ist es ja egal, ob ich 1 durch 0 oder 1 durch minus 0 mache. Nein. Das ist eines Infiniti des Anderes, minus Infiniti und das ist nun mal nicht gleich. Wenn man das so darstellt, der mich vorher guckt, ob die beiden Sachen gleich sind, das sind sie. Normal ist das schon wieder so ein Ding in der Speck stehen. Die sind halt wichtiger als Werte. Steht halt in der Speck. In der Speck steht 1 durch 0 ist Infiniti und 1 durch minus 0 ist minus Infiniti. Punkt. Das ist halt so. Wie gesagt, einmal Infiniti, einmal minus Infiniti. Steht so in der Speck. Das ist so ein Ding. Das ist ein schwieriges Ding. Der Typ von Not a Number ist Number. Klingt doof, ist aber so. Kann man noch irgendwie fragmentieren. Es ist halt ein Sonderwert für Fehler in der Regel. Wenn ich halt versuche, irgendwas zu pasen, was keine Zahl ist, dann ist das Not a Number. So. Not a Number ist aber besonders nicht Not a Number. Es ist halt immer unik. Ja, genau. Das wird doch an den meisten Sprachen zu sein. Es ist halt, wenn du rein logisch drauf guckst, komisch. Jetzt ohne das genauere Wissen von Zahlen und Gedüns dazu. Wenn man das so einfach sieht, sieht das komisch aus. Ist halt so. Nee, ist false. Das wäre es echt noch. So, jetzt haben wir das Problem, wie können wir testen, ob etwas Not a Number ist, wenn wir nicht gucken können, ob es Not a Number ist. Ja, aber dann könnte es ja auch eine Zahl sein. So. Ja. Oder wir nutzen die Funktionen, ist Not a Number. Das ist halt hilfreich. So, ist auch korrekt. Jetzt haben wir das Ding das. Also wir sind uns alle einig, dass dieser String keine Zahl ist. Aber ist es auch ein Not a Number? Antwort? Ja. Okay, können wir nicht benutzen, weil wir wissen wollen, ob etwas wirklich als Ergebnis Not a Number, also die variablen Not a Number hat. Können wir schon mal nicht die Funktionen ist Non benutzen. Warum nicht? So, ja, mehr Alkohol. Schöne Antwort. So, genau, vergleich mit sich selber bei eine Sache. Aber das ist halt auch wieder, sieht halt scheiße im Code aus. Es muss du halt dann genau wissen, dass es nicht so stimmt. Es ist ja schön, wenn Code an sich lesbar wäre und man einfach sieht, ja, es ist logisch, dass es so ist. Es wird so sein und man nicht wissen muss, nein, das ist ein Spezialfall, der ist einfach so. Hat man sich auch gedacht, man hat nämlich auch irgendwann mal die Überlegung gemacht, ist, dann ist halt eine globale Funktion. Globalen sind prinzipiell schlecht. Lass uns mal Dinge prefixen, so in Number. Deswegen gibt es das. Bei sonst, man ist halt einfach da für Übergang, hat die globale Funktionen, die gibt es natürlich immer noch. Die soll man halt nur nicht benutzen. Also Linting-Regeln verbieten einem das in der Regel. Zumindest ist es so ein Standard, wenn du die Standard-Extensions von, also die Standard-Regeln von sowas wie S-Lint benutzt, dann sagt es dir, benutzt bitte keine globale, benutzt bitte die prefix-Variante. Das Problem ist, wenn sie die Funktion ändern. Das ist noch klar. Jetzt haben wir aber auch hier den Fall. Möb, false. Das ist ein echter Check, ob es ist, dann ist. Haben sie geändert? Ist halt so. Da haben sie halt den Spezialfall eingebaut. Also jetzt ist es nicht mehr so, dass wenn er jetzt Dinge nicht pausen kann, dann ist es auch not in Number, sondern jetzt guckt, ob es der Typ, also nicht der Typ, sondern die Variable not in Number ist. So, na ja. Und genau wie ihr mal angesprochen, man kann halt auch einfach das machen. Das ist es. Aber wir haben auch die geprefixten Numbers. Numbers Funktion, da geht das auch. Man muss halt gucken und wissen, die Legacy Methode macht was anderes. So. Jetzt haben wir das hier. Not in Number darf ja keine Zahl sein. Ist ja not in Number. Die Frage war, was pass int macht, pass int macht, guckt, kann ich aus den Dingen eine Zahl machen? Der zweite Parameter ist jetzt der relevante. Ich lüße mal erst auf. Not in Number ist 13.511, falls ihr irgendwann gefragt werdet. Zumindest in der Basis 24. Das ist nämlich der zweite Parameter, der zweite Parameter ist die Basis. Die ist standardmäßig 10, wenn man es weglässt, sollte man nicht. Kann man ruhig mal immer explizit hinschreiben, ist hilfreich. Und in dem Fall ist es halt, ab Basis 24 ist auch n eine Zahl. Also wenn wir den String, na n benutzen, dann ist das eine Zahl. Warum pass du daraus jetzt eine Zahl? Ja, das ist kein String. Aber er macht daraus ein String und stellt halt fest, ja, den String, na n kann ich passen. Warum? Warum? Ja. Jetzt kommen wir zu einem weiteren Problem. Hier ist der Slash übrigens keine Division, sondern es ist egal, was man benutzt. Nur um klarzustellen, dass wir die Variante des Gleiche machen. Das ist keine Zahl, die wir da reingeben. Da sind wir uns einig. Da ist aber auch eine Zahl drin. Wenn da auch eine Zahl drin ist, dann passen wir das soweit, wie geht. Was ist aber, wenn wir Dinge haben, wo der Nutzer Dinge eingibt? Hab gehört, das macht man manchmal im Web. Jetzt wollen wir wissen, ob das eine valide Zahl ist, die derjenige eingibt. Der könnte ja auch 20, 40 eingeben, weil er aus Versehen mal im falschen Feld war. Und er wollte eigentlich 2004 eingeben. Das können wir schon mal nicht benutzen, sonst kriegen wir als Antwort 20. Das ist nicht hilfreich, JavaScript. Danke. So. Immer noch nicht hilfreich. Weil das ist halt der Test, den man dann macht, um zu gucken, ja, ist das denn auch wirklich eine Zahl, die dann am Ende rauskommt? Weil Numberpassint gibt's halt 20 raus, wäre aber beides 20, würde er das gleichsetzen, weil er dann wieder versucht rumzupasen, weil ich benutze ja nur zwei gleich. Genau, lange Zahlen sind immer ein Problem. Aber da gibt es tatsächlich eine Lösung. Es gibt inzwischen einen Draft für ein Spec für Big Integer. Man hat das Problem entdeckt und genau, man arbeitet dran. Es dauert halt alles ein bisschen. Ich glaube, wir sind inzwischen Stage 1, je nachdem, wie schnell die sind. Mal so, mal so. Jetzt kommt, eigentlich würde ich sagen, mach das bitte nie so. Es ist aber einfach der einfach, einstige und einfachste Weg, um das zu machen. Wenn man das nämlich genauso paarse will und nicht diesen gleich gleich vergleich da drin hat, macht man das. Man würde jetzt herverboten, ja, intern benutzt er bestimmt auch Numberpassint, um daraus jetzt irgendwie ein Integer zu machen, weil das ist halt implizit 0 plus zahl daraus zu machen aus dem String. Das kann er aber nicht. Wieso kannst du das jetzt nicht, aber wenn ich dich explizit frage, ob du ein String passst, kannst du das? Wieso machst du das anders? Und es sieht echt scheiße aus, wenn man das benutzt, um Dinge zu pasen. Nein, es gibt keinen, es ist ein Weg. Ja, man muss in beiden Fällen immer, es ist alles. Es sagt dich schon, das soll nur sein, du kannst beides benutzen. Ist es in dem Fall ein Oder? Ich hätte aber ein programmatisches Oder benutzen sollen, tatsächlich. Uff, alles nicht hilfreich. Bisher so. Infinity. Number. Sagt dich ja schon, Number. Minvalue ist das kleine 0. Klingt erst mal danach, also Minvalue kennt man ja auch aus anderen Problemen, dass man die kleinste Zahl bekommt, die man irgendwie darstellen kann. Ja, genau. Number Minvalue ist nicht kleiner 0. Number Minvalue ist 5e hoch minus 324. Es ist die größte Zahl über 0, also die kleinste Zahl über 0. So. Denn haben wir es echt nicht passend gewählt. Find ich. Ja, es ist im Brief, die Frage, ob es epsilon ist. Ja, es ist effektiv epsilon. Warum machst du nicht number.epsilon oder so? Gibt es übrigens auch? Weiß ich tatsächlich, ich weiß gerade tatsächlich nicht, ob epsilon Minvalue ist. Könnte man mal, ich werde das mal mitnehmen und für die nächste Version mit reinschreiben, ob das das so ist. So. Jetzt haben wir Max Min. Könnte man jetzt sagen, ja, Max ist wahrscheinlich größer Min. Ja, genau. Die Frage war, Max von was? Max von was ist die richtige Frage in dem Fall, weil das ist schon mal false. Aber Minvalue ist was anderes als Min als Funktion? Ja, genau. Deswegen ist es auch so. Das Maßpunkt ist nämlich minus infinity. Min wiederum ist infinity. Infinity ist offensichtlich größer als minus infinity. Und genau kam es schon richtig aus dem Publikum. Die Sache ist so, diese Funktionen geben einem das Max bzw. Min einer Liste und das Maximum von nichts ist in dem Fall minus infinity. Weil minus infinity ist größer als alles, was wir ihm gegeben haben. Es ist halt trotzdem das kleinste Möglichste, aber es ist trotzdem das größte von dem, was wir ihm gegeben haben. Genauso andersrum. Infinity ist definitiv kleiner als Andifeind. Ich habe tatsächlich zu viel geredet, aber es ist schon mal gut. Es wird echt nicht besser. So. Null und minus null ist ja gleich, haben wir ja festgestellt. Aber nicht dann. Steht da tatsächlich so explizit in der Spekt drin, dass minus null bevorzugt ist dann. Also es ist nicht irgendwie aus der zahlenreiten Folge allgemein klar und ersichtlich, dass minus null kleiner ist, sondern es steht explizit in der Speziferation für Maßpunkt minderen. Genauso andersrum. Immerhin ist er da konsequent. So, sortieren wir mal Dinge. Einfache Aufgabe würde ich jetzt mal behaupten. Einfache Aufgabe. Also die meisten höheren Programmiersprachen kriegen das hin. Ihr könnt euch alle denken, was er gemacht hat. Aber warum macht er das nur implizit und gibt mir am Ende wieder Zahlen raus? Weil jetzt ist das Ergebnis nicht sortiert. Hätte er daraus, er hat sie ja als String sortiert. Wenn er mir danach ein String rausgibt wäre zumindest das Ergebnis sortiert, was er mir gibt. Es wäre nicht der Typ, den ich wollte, auch komisch. Aber es wäre sortiert. Uff. Man kann sich jetzt vorstellen, wie das intern alles funktioniert. Es ist nicht hilfreich. So überhaupt nicht. Man muss halt wissen, Sort kann ich nur auf Strings benutzen. Für alles andere muss ich ihm sagen, wie er Dinge sortiert. Weil offensichtlich benutzt er auch nicht den Standardoperator, weil dann hätte er das ja funktioniert. Oder er benutzt den Standardoperator nicht auf dem, was ich ihm gegeben habe. Er macht es ja auf Strings. Auf Strings, er hat mir das richtige Ergebnis gegeben für die falschen Eingabe. Das ist halt nicht hilfreich. In keinster Weise. Muss man wissen. Ist valide JavaScript, was ich da gemacht hab? Als Fiese ist, in dieser Syntax kann man alles machen. Du kannst jedes beliebige Programm nur damit darstellen. Ist nicht hilfreich. Zum Lesen. Ist auch nicht besonders klein. Das ist das zweite Ding. Das wäre vielleicht hilfreich, wenn es denn besonders klein wäre, weil dann könnte man das quasi als Minifile noch benutzen. Aber das ist natürlich viel größer, als jeden Code, den man ihm sonst geben könnte. Die Zeichen ist es halt. Aber es ist gut, wenn das Ziel Obstication ist, das ist gut. Nachteil ist, das kann man da reinpacken, aber was im Publikum kam schon ist Fail. Dies ist halt ersichtlich, wenn man sich überlegt, ich kann mit eckigen Klammern auf den Index von Strings zugreifen. Und wie wir oben festgestellt haben, ich bekomme Strings raus, wenn ich Dinge mache, mit plus. Undefined, null, false, sind alles Dinge mit Zeichen. Da kriege ich genug zusammen. Tatsächlich. Echt nicht. Also, nett, dass es geht, aber irgendwie auch. Hätte auch nicht sein, hätte auch nicht gehen können. Wäre echt okay gewesen. Hast genug komische Dinge, brauchst du nicht noch mehr komische Dinge, JavaScript? Andefined. Das i kommt von Andefined. So. Das, dass man Dinge leer machen kann, gibt es in öfter mal den Sprachen so. Ich würde jetzt sagen, 4. Oder 5. Dies 3. Ist schön, ich habe die Komma-Tage zählt. Aber irgendwie nicht das, was ich jetzt erwartet hätte, intuitiv. Liegt daran, man darf in JavaScript Listen mit einem Trailing-Comma beenden. Das letzte Komma wird nicht genommen für Liste, sondern es ist tatsächlich, wenn man Code schreibt für den Code-Review, tolle, wenn am Ende das Komma ist, weil dann sieht man nicht diesen Edit das letzte Element, weil man das Komma-Tage zufügt und am Ende von dem Element fehlt es wieder bei dem Letzt, was man zufügt hat. Macht Code-Reviews einfacher? Das aber nicht. Also macht solche Sachen nicht. Ich weiß auch nicht, warum man das so schreiben sollte. Da gibt es auch schönere Wege. Aber wenn man das so schreibt, dann war das nicht hilfreich. Das ist tatsächlich auch ein Ding, das wäre Breaking gewesen. Wenn man das benutzt hat, produktiv, ist das irgendwann kaputt gegangen, die sind irgendwann dazugekommen. Aber man war sich bei dem Komitee einig, naja, das macht keiner. Und wenn doch, haben die es verdient, kaputt zu gehen. Eine Frage? Die Frage war es vorher bei Komma, was passiert ist? Komma war es ein weiteres leeres Element. Oder ich bin mir tatsächlich nicht ganz sicher, ich glaube, ganz früher ging das gar nicht. Dann war es ein Sintagsfehler. Früher wäre das halt 4 gewesen noch. Ist einer der wenigen Dinge, die mal Breaking waren? Wenn man das mal hinmal, ist auch wesentlich schöner mit Trailing. Komma würde ich nicht mehr weg wollen von. Sieht so trotz, dann hätte man aber auch das wieder verbieten können eigentlich. Da ist es echt nicht hilfreich. Ja, es ist. So, machen wir mal so was. Das Ding ist quasi, gibt mir die Zahl von dem, was ich da reingebe, so. Ungefähr. Das ist null. Weil es null ist. Jetzt ist es aber so. Nichts reingeben ist immer implizit und defined. Weil alles was wir nicht definieren, ist nun mal und defined. Und und defined ist halt auch wieder so, nein, nicht defined, sondern und defined ist halt auch so, das ist später. Es gibt das Feature von Default-Parametern bei Funktionen. Da ist es halt auch wieder wichtig. In dem Sinne, dass der nur gilt, wenn es und defined reinkommt. Was ja auch effektiv nicht. So ist aber ein definiertes Nichts. Dann benutzt wer den Default-Parameter nicht. Deswegen ist und defined noch mal speziell. Also das hier ist sonst, wenn man zum Beispiel Default-Parameter angeht, ist das equivalent. Also jetzt würde er in beiden Fällen den Default-Parameter benutzen. Wenn man einen an diese Funktion setzt. Aber ist hier ein String. Also ich kann und defined den String machen. Zumindest. Und das hat er auch gemacht. Dann ist es auch korrekt. Dann ist er mit einer Zahl vor, alles richtig. Nicht hilfreich. Das gilt, ob ich zu einem Variabel pack. Ja, und defined ist auch eine Variable. Ja, ist egal. Und defined ist auch so schon eine Variable. Und defined ist eine Variable auf dem Global Space. Die gibt es immer. Ist genau das gleiche. Ist auch spekstechnisch genau das gleiche. Jetzt würdest du direkt und defined eingeben, weil und defined ist nun mal eine Variable mit einem definierten Wert. Und du setzt dann ja auch nur eine Variable und die Frage war, ob es nur Variable ist, ob ich es ändern kann. Nein, das geht einfach nicht. Im Strict Mode gibt es einen Fehler. Wenn man nicht Strict Mode macht, gibt es keinen Fehler, es passiert einfach nichts. Außer, ich bin in einem Scope. Weil dann setzt ich und war benutze. Dann setzt ich Dinge auch an. Also das Schlimmes war als Keyword. Setzt Variablen dann überall. Die sind danach verfügbar, auch wenn ich den Scope verlasse. Wenn ich z.B. in einer Funktion war, A gleich einzelt. Dann kann ich nach der Funktion fragen, was A ist, sondern dann kommt 1 raus. Inzwischen gibt es dafür Let. Dann geht das nicht mehr. Deswegen sollte man wahr nicht mehr benutzen. Das macht einfach, das macht nur Fehler danach. Weil... Ähm... Doch, genau so funktioniert es. Anonymicalback funktioniert noch mal ein bisschen anders. Komm ich aber später noch mal zu. Ja. Ich darf aber und defined ist aber kein reserved word. Ich darf also variabel in und defined nennen. Innerhalb von der Funktion ist es dann auch ein anderer Wert. Das macht das echt kaputt. Weil dann ist und defined innerhalb dieser Funktion nicht mehr und defined. Nicht hilfreich. Geht aber, weil es kein reserved word. Im strict mode wiederum geht das nicht, weil da haben sie es einfach verboten. Aber im non strict mode, der aber eigentlich nie benutzt würde. Also wenn man einmal use strict, als Direktive in den Code packt, ist es überall aktiv dann quasi. Sobald das einmal geparsert ist, der aktiv geht nicht mehr weg. Nee, use strict ist überall nicht nur ein scope. Kann auch sein, dass es interpretabasiert ist. Das ist nur so ein Ding. JavaScript war ja mal dafür gedacht, dass man so ein... Nein, man hat so eine HTML-Seite und so vielleicht so ein bisschen JavaScript. Deswegen darf man auch HTML-Kommentare benutzen. Und die sind tags davon. Sieht irgendwie weird aus. Wenn man das in reinen JavaScript-Dateien plötzlich so kommentiert, sieht das einfach nur weird aus. Also wenn man seine Kollegen ärgern will, kann man das mal in so ein Pull-Request packen. Die denken sich dann vielleicht, ich bin doch gar nicht mehr HTML. Warum machst du hier HTML-Kommentare? Ja, geht halt auch. Wenn es mal anders aussehen soll oder so. Warum soll das mal anders aussehen? Ich weiß es nicht, aber es geht. Naja, jetzt ist die Zeile ein Kommentar. Das ist ein Single-Line. Ja, es ist ein Single-Line-Komment. Dann gibt es tatsächlich nur Single-Line-Komments. Das ist kein Multiline-Komment. Vergleichen wir mal Dinge. Eins, kleiner, zwei, kleiner, drei. Ja, sieht ja aus, gibt es auch so. Drei größer, zwei größer, eins. Ne. Weil wir können immer nur zwei Sachen vergleichen. Er macht also erst den Vergleich. Eins ist kleiner, zwei, true. True ist größer, kleiner, drei, true. Deswegen kommt true raus. Jetzt ist aber drei größer, zwei, also true. True ist aber nicht größer, eins. Weil wenn man die Typen weglässt, ist ja true gleich eins. Also geht nicht. Das, der das überhaupt zulässt da oben, ist halt schon, auf, wirft doch bitte den Sintagserror. Wer wäre echt lieber? Ja, deswegen, das ist dann wieder. So, jetzt haben wir noch ein bisschen mehr Spaß mit Typen, weil es gibt so Primitive Types. Stringen. Jetzt gibt es den Stringen. Fragen wir, ob es die Instanz von String ist. Ne. Große und Kleinschreibung ist halt doch wichtig. Machen wir das. Das ist übrigens auch true, weil ich habe den Typenvergleich da weggelassen. Wir haben zwei verschiedene Typen verglichen. Die sind aber vom Wert her gleich. Der Typ von dem String ist dann nämlich Object. Es gibt übrigens keinen Typ String, großes S. Das ist dann ein Objekt. Es gibt den Typen mit dem kleinen S. Das ist der Stringtype. Und es gibt Objekte, die auch Strings darstellen. Ist halt so. Das ist jetzt noch ein bisschen neues Feature so, wenn man Sachen in Einzahlen schreibt. Das. 10. Das. Ist aber nicht das leere Objekt, sondern an die Feind. Weil wir haben da einen neuen Block aufgemacht. Mit diesen echigen Klammern. Ist halt auch der Body von der Funktion. Dann ist es halt eine leere Funktion. Wenn ich das jetzt aber in Klammern setzen würde, diese geschweiften Klammern, dann wäre es ein Objekt. Ja. Okay. Nehmen wir mal hin. Ja, das sind noch so Dinge. Wieso ist das jetzt null? Ich habe ja eben oben drüber gezeigt, dass das nicht null ist. Da sind wir wieder bei Dinge überschreiben. Ich habe da also, bevor das funktioniert, muss man diesen Code ausführen. Ich habe mir jetzt den Prototypen geholt von einem Array und definiere da Properties um. Nämlich die Property to String, die da implizit aufgerufen wurde. Fragt mir nicht, warum man das tun sollte. Es geht aber, weil es gibt ja dieses Configurable, wenn das False wäre, direkt von Anfang an, dann könnte ich das nicht mehr überschreiben. Das wäre echt hilfreich bei solchen Dingen. Bildendinge, die man echt hilfreich. Kann man aber. Zumindest, es ist, jetzt sind wir tatsächlich bei Dingen, die nicht mehr spezifisch sind, sondern interpreterspezifisch. Das ist das, was aktuell in V8 funktioniert. Das kann man auch machen. Aktueller Chrome heißt übrigens bei mir den Dev Version, das geht auch noch in 2 Chrome Version auf jeden Fall. Wenn ihr das in die Library einbaut, freuen sich bestimmt alle. Wenn ihr das auch noch so baut, dass es den Code der Open Source für eure Library nicht drin steht, sondern ihr das nur in die gepublishede Version schreibt, dann könnt ihr bestimmt Leute ärgern. Das geht ja sogar noch, weil so oft macht man das halt nicht mit dem Stringvergleich auf Arrays. Das habe ich ja ein bisschen gefällt beim Dingen machen. Jetzt haben wir aber das. Ich habe jetzt die zwölf gepasst. Das ist nint. Warum gibt es da noch die Number? Und wenn ich jetzt, dann kommt man hin und denkt sich, ok, ich gucke mal nach und frag die Funktion. Also wenn ich nur Number pass, dann macht da halt ein ToStringer auf die Funktion. Hätte ich die überschrieben, stünde da jetzt der Body von der Funktion. Da steht aber Native Code. Ich habe aber tatsächlich die Terms dafür. Ich habe das gemacht. Genauso wie oben. Die Property pass in auf Number ist halt leider nicht non-configurable. Also jetzt schon. Danach kann man es nicht mehr zurückändern. Danach ist es halt kaputt für die Ausführung. Und writable ist das auch nicht mehr. So writable wäre, dass ich den Wert direkt zuweise. Ok. Ist danach halt kaputt für alle, die deinen Code ausgeführt haben. Und oft benutzt wird. Und am besten noch irgendwann Low Level ist. So dass Projekte das gar nicht selber benutzen. Sondern sie eine Dependency haben. Die eine Dependency hat, die dann irgendwann euch als Dependency hat. Da macht ihr so viele Projekte kaputt. Also da kann man echt gut das Internet mit kaputt machen. Wenn wir das jetzt in irgendeiner Library machen, wie früher mal Left Pad war oder so. Halt irgendwas, was ganz viele Leute benutzen. Oh ja, jacrary, das ist ein schönes Beispiel. Also wenn jacrary sagt, das ist doch nicht mehr, dann machen sie jetzt eine Version und bauen das ein. Danach benutzt sie keiner mehr. Also erst mal ist das Internet kaputt für eine Weile. Und dann benutzt sie keiner mehr. Sobald rausgefunden wurde, warum das so ist. Ja. Ja, und das habe ich übrigens gemacht mit dem Two-String. Weil Two-String ist nicht configurable, aber writable. Ich habe halt gesagt, das ist jetzt eine Funktion, die Returned Pass in. Das F kommt nämlich tatsächlich nicht von uns. Das ist halt immer dabei. Das ist halt F und dann der Function Body. Oder in dem Fall, was auch immer Two-String macht. Und Two-String gibt in dem Fall Native Code aus. Also, falls ihr Leute ärgert wollt, das ist eine gute Vorlage. Pass in, kaputt machen und Leute dann mal rausgeben, ist echt gut. Ja. Also, das ist dann übrigens auch nochmal da, da habe ich ja nur gefällt, mit dem Folienmachen, natürlich. Also, dass ich die gerade eben noch geweitert habe. Ja, gibt es zu dem Teil noch Fragen? Ich glaube nicht, die wurden ja schon gestellt. Ja, das ist so der Teil, macht das nicht. Außer ihr wollt Leute ärgern, dann macht das. Aber im Produktiv Code sollte das nicht sein. Also, dieses Two-String und Configurers gibt noch ein paar mehr Dinge, die configurable sind. Gibt ein paar mehr Dinge writable sind. Es gab mal JavaScript-Versionen, da hat man es auch geschafft, so was wie undefined. Also, auch das global undefined ist, um zu definieren. Es geht inzwischen gar nicht mehr. Sie haben gelernt. Aber tuppt euch aus, wenn ihr was findet, ist das bestimmt super, um Leute zu ärgern. D.D.? Ja? Die Frage war, ob sich use strict, also der strict-Mode, auch auf script aus für die nachträglich. Ja. Doch, wenn du use strict ist, inzwischen, kann sein, dass es früher nicht ist. Und in v8, das ist das, wo ich genau weiß, in v8 ist es danach für alles aktiv. Nur für den Function-Kontext aktiv eigentlich? Und für Module? Ja, tatsächlich, ja, es kommt drauf an, wann du das use strict halt macht. Jetzt ging es ja allgemein um ein use strict, wenn das use strict, aber global ist es für alles. Stimmt, wenn man use strict irgendwo nur für Functions macht, dann kann man auch einzelne Functions strict machen und der Rest bleibt non strict. Aber in der Regel will man einfach alles use strict haben, weil du willst halt nicht anderes machen. Strict-Mode bringt nur Vorteile und weniger Schmerzen. Ja. So, jetzt haben wir nicht mehr viel Zeit, aber zumindest noch für the bad, das ist nämlich relativ kurz, weil das sind Sachen, die haben wir immer noch, die muss man einmal wissen. Die sind auch echt nicht schön gelöst, finde ich. Aber die sind halt da. Das ist der Kontext von deiner Funktion. Der ist nämlich nicht immer ganz klar und den kann man halt auch setzen. Das ist, das ist halt, wir haben halt Prototypen und hier haben wir das Konzept von Kontext für Funktionen und hier ist es jetzt zum Beispiel so, dass diese beiden Funktionsaufrufe was anderes rausgeben wieder. Das ist nicht der gleiche, der Return-Wert von jeder, von dem Ding ist immer was anderes. Bei dem ersten ist es nämlich x und beim zweiten ist es unterschiedlich, je nachdem wo. Da kann ich mal, das ist undefined, das ist interpreterabhängig. Das ist auch super undefined Behavior in seinem Programm zu haben. Da gibt es halt Call, aber ja schon erwähnt, damit kann man den Kontext setzen. Das erste gibt halt als Return-Wert-Console, das zweite undefined und das dritte FU und wenn man, wenn der Variable setzt diese Funktion und FU.bind auf FU macht, dann ist es halt immer FU, wenn man diese Funktion aufruft. Ich bin mir da tatsächlich nicht ganz sicher, es gab interpreter Versionen, wo sie jetzt überschreiben lassen und es gibt welche, wo du es nicht überschreiben konntest. Ist halt auch gut, wenn es halt abhängig ist, wo dein Code ausgeführt wird, dann bist du sich mal anders verhält. 10 Leute kennen das bestimmt. Ja. Und das ist halt eigentlich nochmal genau das Gleiche, nur dargestellt, es ist halt effektiv, das Ding vor dem Punkt kann man sich berken, außer wenn man den Kontext geändert hat. Man sollte sich über diesen Kontext, wenn man JavaScript macht, einfach sehr gut im Klaren sein, was man da macht. Gerade wenn man solche Objekte macht oder Klassen macht und in denen Sys benutzt, muss man sich im Klaren sein, wenn jemand eine Variable auf deine Funktion setzt, was halt immer geht, seine Funktion kaputt danach. Kann gewünscht sein, kann auch voll nervig sein. Muss man halt wissen. Ja. Und wie gesagt, den Gutteil, da gibt es einen Teil, den lasse ich jetzt aber einfach weg. Der ist halt auch echt nicht so lustig. Der ist halt gut. Sonst wäre er nicht im Gutteil. Ja. Dann wäre ich soweit fertig für, kommen wir jetzt noch mal so ein paar letzte Fragen machen. Ja. So funktioniert, wie ich mir das wünsche. Dann möchte ich halt diese ganzen Fallstrecke umgehen. Und gibt es irgendeine Bibliotheke oder sowas, die du empfehlen kannst, die sozusagen diese ganzen komischen Verhalten normalisiert, sodass ich, sodass, wenn man den Code anguckt, man weiß, was wirklich passiert. Use strict. Damit geht fast nix mehr, was da eben, also ein paar der komischen Dinge ging noch, aber vieles geht schon mal nicht mehr, sondern wirft Fehler. Allgemein use strict ist immer gut, weil use strict wirft Fehler. Fehler sind schöner als komisches Verhalten. Ansonsten waren das halt gerade Beispiele. Das kannst du schon so machen, dann ist das halt kacke. So. Das schreibt man halt einfach so nicht. Nehmen wir mal als Beispiel dieses is not a number, was ja durchaus, was man vielleicht mal prüfen möchte. Das ist ja eine Funktion, die man da aufruft. Das use strict ja nicht verändern, oder? Ja, use strict. Du hast ja mit number.is not a number den check, ob etwas wirklich die Variablen der number ist. Und das wird es im use strict halt immer sein. Weil in use strict kannst du number.is not nicht überschreiben. Im Vergleich zu normalen. Die Überschrift heißt javascript. Ich setze es mal in Abführungsstrichen. Deinem Vortrag hab ich jetzt genommen, du sprichst hauptsächlich von javascript.va. Meine Frage ist, für welche Versionen vom eqmascript gilt das denn? In dem Fall latest. Also, es gibt halt die Spezifikationen, es gibt das, was die Hersteller daraus machen. Das schönes Beispiel ist daraus, eqmascript 5 war halt sehr lange der Standard. Es gibt halt niemanden, der 100% der Speck erfüllt. Es gab nie jemanden, der alles erfüllt. Sie haben immer 99% gemacht. Es ist halt effektiv, ob die Browser-Stelle das wirklich so tun. 2, 3, 4, Browser-Hersteller ist wirklich so tun. Tun sie aber inzwischen, weil inzwischen sind es halt einfach die Browser-Hersteller, die im Komitee sitzen. Und ein bisschen Facebook. Aber das war es eigentlich auch. Sind die Browser-Hersteller und Facebook, die im Komitee sitzen? Ja. Wenn ja keine weiteren Fragen sind, sonst, wenn es um komische javascript geht, kann man mich einfach nochmal fragen. Ich kann auch in vernünftig antworten und nicht mit, hier guck mal dieser komische Snippet.