WTFJS? EnterJS 2014. Matthias Reuter / @gweax



Ähnliche Dokumente
Noch für heute: primitive Datentypen in JAVA. Primitive Datentypen. Pseudocode. Dezimal-, Binär- und Hexadezimalsystem. der logische Typ boolean

Binärdarstellung von Fliesskommazahlen

miditech 4merge 4-fach MIDI Merger mit :

Grundlagen der Technischen Informatik Wintersemester 12/13 J. Kaiser, IVS-EOS

Computerarithmetik ( )

in vielen technischen und wissenschaftlichen Anwendungen erforderlich: hohe Präzision große Dynamik möglich durch Verwendung von Gleitkommazahlen

Numerische Datentypen. Simon Weidmann

Javakurs 2013 Objektorientierung

Kapitel MK:IV. IV. Modellieren mit Constraints

SWE1 / Übung 2 ( )

Algorithms & Datastructures Midterm Test 1

Das neue Volume-Flag S (Scannen erforderlich)

Binäre Gleitkommazahlen

Abfrage-Befehle in MySQL -diverse Funktionen -

USB Treiber updaten unter Windows 7/Vista

Sin-Funktion vgl. Cos-Funktion

Übung RA, Kapitel 1.2

Kurzanleitung um Transponder mit einem scemtec TT Reader und der Software UniDemo zu lesen

Modul 122 VBA Scribt.docx

IT-Basics 2. DI Gerhard Fließ

Java Script für die Nutzung unseres Online-Bestellsystems

Einführung in die Java- Programmierung

Binäre Division. Binäre Division (Forts.)

WAS IST DER KOMPARATIV: = The comparative

Musterlösung 2. Mikroprozessor & Eingebettete Systeme 1

Musterlösung 2. Mikroprozessor & Eingebettete Systeme 1

A Classification of Partial Boolean Clones

Informationssysteme Gleitkommazahlen nach dem IEEE-Standard 754. Berechnung von Gleitkommazahlen aus Dezimalzahlen. HSLU T&A Informatik HS10

Java Kurs für Anfänger Einheit 5 Methoden

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Excel Funktionen durch eigene Funktionen erweitern.

Behandeln Sie»undefined«als»nicht vorhanden«thema 54

ORM & OLAP. Object-oriented Enterprise Application Programming Model for In-Memory Databases. Sebastian Oergel

Risiko Datensicherheit End-to-End-Verschlüsselung von Anwendungsdaten. Peter Kirchner Microsoft Deutschland GmbH

Programmierkurs Java

Objektorientierte Programmierung

Problem: Keine Integers in JavaCard. ToDo: Rechnen mit Bytes und Shorts

2 Darstellung von Zahlen und Zeichen

php Hier soll ein Überblick über das Erstellen von php Programmen gegeben werden. Inhaltsverzeichnis 1.Überblick Parameterübergabe...

E-PRIME TUTORIUM Die Programmiersprache BASIC

KURZANLEITUNG. Firmware-Upgrade: Wie geht das eigentlich?

Multimedia im Netz Wintersemester 2011/12

Constraint-Algorithmen in Kürze - Mit der Lösung zur Path-Consistency-Aufgabe 9

Dynamisches SQL. Folien zum Datenbankpraktikum Wintersemester 2009/10 LMU München

Visual Basic Basisbefehle Hinweis: Der Text in eckigen Klammern [ ] ist variabel, z.b. [var] => 5.3. Eckige Klammern sind stets wegzulassen!

Werbemittel-Spezifikationen

Contents. Interaction Flow / Process Flow. Structure Maps. Reference Zone. Wireframes / Mock-Up

NoSQL mit Postgres 15. Juni 2015

Online-Hilfe KREAMAN (DE)

Einführung in die Programmierung für Wirtschaftsinformatik

Installation mit Lizenz-Server verbinden

Listening Comprehension: Talking about language learning

Selbststudium OOP4 Auftrag

AJAX Implementierung mit Joomla!

Objektorientierte Programmierung

Klausurteilnehmer. Wichtige Hinweise. Note: Klausur Informatik Programmierung, Seite 1 von 8 HS OWL, FB 7, Malte Wattenberg.

SCRIBUS WORKSHOP Handout Gimp

Der Adapter Z250I / Z270I lässt sich auf folgenden Betriebssystemen installieren:

arlanis Software AG SOA Architektonische und technische Grundlagen Andreas Holubek

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Übungen Programmieren 1 Felix Rohrer. Übungen

Objektorientierte Programmierung

Kapitel 1. Zahlendarstellung. Prof. Dr. Dirk W. Hoffmann. Hochschule Karlsruhe w University of Applied Sciences w Fakultät für Informatik

Java Einführung Operatoren Kapitel 2 und 3

Einführung in die Programmierung

Computeria Solothurn


Client-Server-Beziehungen

Typumwandlungen bei Referenztypen

Objects First With Java A Practical Introduction Using BlueJ. Mehr über Vererbung. Exploring polymorphism 1.0

Formale Spezialisierungstechniken. am Beispiel des binären Baums. Hybride Programmiersprachen Daniel Krompass Berlin, 2009

TinyMCE. Frederik Leidloff

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Erwin Grüner

Remote Control - LeCroy Oszilloskop WaveSurfer 3000 mit LabVIEW via VICP LAN-Schnittstelle

Dokumentation für Popup (lightbox)

.NET Code schützen. Projekt.NET. Version 1.0

D-BAUG Informatik I. Exercise session: week 1 HS 2018

Auktion name adresse pseudonym adresse /bewertungszahl. Gebot. höhe zeitpunkt bieter. initiiert

1 Polymorphie (Vielgestaltigkeit)

Softwareupdate-Anleitung // AC Porty L Netzteileinschub

Serviceinformation Nr. 02/11

Tutorium Rechnerorganisation

Vertiefungsstoff zum Thema Darstellung von Zahlen

1. Stellenwerte im Dualsystem

Client-Systemanforderungen für Brainloop Secure Dataroom ab Version 8.30

Leichte-Sprache-Bilder

Codes und Informationsgehalt

Arrays von Objekten. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Konzept zur Push Notification/GCM für das LP System (vormals BDS System)

Extending tl_member. Andreas Fieger

Einführung in PHP. (mit Aufgaben)

Source Code Konverter Online: (VB.net <-> C#) Kommerzielle Produkte (VB, C#, C++, Java) Code Nachbearbeitung in der Praxis...

Klausur BWL V Investition und Finanzierung (70172)

VBA-Programmierung: Zusammenfassung

Erstellen eines Office-COM-Add-In mit Visual Basic 2005 Express Edition

ecall sms & fax-portal

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

Leitfaden E-Books Apple. CORA E-Books im ibook Store kaufen. Liebe Leserinnen und Leser, vielen Dank für Ihr Interesse an unseren CORA E-Books.

Transkript:

WTFJS? EnterJS 2014 Matthias Reuter / @gweax

Grafik: Angus Croll @angustweets

0.1 + 0.2» 0.30000000000000004 CC-BY-SA https://www.flickr.com/photos/keith_and_kasia/7902026314/

Computer! Binärsystem! Endliche Präzision!

0.1 0.1 = 0.000110011001100 dec bin IEEE 754 double keine Integerzahlen in JavaScript!

e ± 2 m IEEE 754 DOUBLE 64 bit: 1 bit Vorzeichen, 11 bit Exponent, 53 (52) bit Mantisse 0 01111111011 1001 10011001 10011001 10011001 10011001 10011001 10011010 0.100000000 000000005 551115123 125782702 118158340 4541015625 dec http://www.binaryconvert.com/convert_double.html

LÖSUNG function equals(a, b) { var epsilon = Math.pow(2, -53); return Math.abs(a - b) < epsilon; } Geeignetes Epsilon wählen Tipp: Bei Geldbeträgen immer in Cent, nicht in Euro rechnen

typeof NaN» "number" CC-BY-NC-ND http://darkdoomer.deviantart.com/art/wtf-7508738

NAN IEEE 754 Software- und Hardware-Implementierungen Alles muss eine Zahl sein NaN signalisiert eine ungültige Operation

UNGÜLTIGE OPERATIONEN Infinity - Infinity Math.sqrt(-1) 0/0 Number("wtf")

DARSTELLUNG 0 11111111111 xxxxx (Mantisse 0)

NaN === NaN» false isnan(nan)» true isnan(43)» false isnan("wft")» true

Number.isNaN() LÖSUNG (ES6) LÖSUNG (NACHBAU) function betterisnan(a) { return typeof a === "number" && isnan(a); } LÖSUNG (SCHLAU) function cleverisnan(a) { return a!== a; }

"0" == false» true 0 == false» true "" == false» true [] == false» true CC-BY-NC-SA http://dobotibi.deviantart.com/art/omg-wtf-t-shirt-design-110818957

== BEDEUTET NICHT GLEICH, EHER BEDEUTET ES ÄHNLICH Für Mathematiker: == ist keine Äquivalenzrelation "0" == falseund false == [], aber nicht "0" == []

ÄHNLICH? CC-PD http://pixabay.com/

PPK on Javascript: An empty string becomes false. All other values become true. Matthias: Echt? Auch "0"? Matthias: Wie erzwinge ich denn die Umwandlung von "0" in ein Boolean? Matthias (dumme Idee): "0" == true; Browser: false

ABSTRACT EQUALITY COMPARISON ALGORITHM 11.9.3 THE ABSTRACT EQUALITY COMPARISON ALGORITHM The comparison x == y, where x and y are values, produces true or false. Such a comparison is performed as follows: 1. If Type(x) is different from Type(y), go to step 14. (22 Schritte insgesamt, in ES 262-5 umformuliert, 10 Schritte)

"0" == false "0" == 0 0 == 0 true

"" == false "" == 0 0 == 0 true 9.3.1 TONUMBER APPLIED TO THE STRING TYPE A StringNumericLiteral that is empty or contains only white space is converted to +0.

[] == false [] == 0 "" == 0 0 == 0 true

Matthias an PPK: Dein Buch hat einen Fehler! PPK an Matthias: Nein! Verwende explizite Typkonvertierung

LÖSUNG Algorithmus auswendig lernen LÖSUNG (TYP ERZWINGEN) Boolean("0") === true LÖSUNG (VERGLEICHEN) "0" === false Ist === eine Äquivalenzrelation?

[5, 10, 1].sort()» [1, 10, 5] https://twitter.com/iamdevloper/status/421279034124013568

15.4.4.11 ARRAY.PROTOTYPE.SORT (COMPAREFN) When the SortCompare abstract operation is called with two arguments j and k, the following steps are taken: 1. Let jstring be ToString(j). 2. Let kstring be ToString(k). Äpfel, Birnen..., diesmal Strings

LÖSUNG [5, 10, 1].sort(function (a, b) { return a - b; });

null == undefined» true CC-BY-SA https://www.flickr.com/photos/sanfranannie/3178105727/

4.3.9 UNDEFINED VALUE primitive value used when a variable has not been assigned a value 4.3.11 Null Value primitive value that represents the intentional absence of any object value

UNDEFINED var a; arr[2014] NULL "enterjs".match(/\d/); new Date("foo").toJSON();

GEMEINSAMKEITEN Sind ähnlich (==) Sind falsy UNTERSCHIEDE Konvertierung in Number/String JSON kennt nur null

undefined = 3» 3 typeof null» "object"

3.toString(2)» SyntaxError 3..toString(2)» "11" CC-BY http://commons.wikimedia.org/wiki/file:what_the...gif

7 LEXICAL CONVENTIONS The source text is scanned from left to right, repeatedly taking the longest possible sequence of characters as the next input element.

7.8.3 NUMERIC LITERALS DecimalLiteral :: DecimalIntegerLiteral. DecimalDigits opt ExponentPart. DecimalDigits ExponentPart opt DecimalIntegerLiteral ExponentPart opt opt

3. tostring (2) 3..toString (2)

var a = 10, b = 20; a+b» 30 a++b» SyntaxError a+++b» 30 CC-PD http://pixabay.com/de/comics-verh%c3%b6r-frage-sprechblase-151341/

a + b a++ b a++ + b

ALLES GUT MIT ===? Nein, es gibt ja noch < und Verwandte

"536.26" > 536.20» true

11.8.5 THE ABSTRACT RELATIONAL COMPARISON ALGORITHM 3. If it is not the case that both Type(px) is String and Type(py) is String, then a. Let nx be the result of calling ToNumber(px). [...] b. Let ny be the result of calling ToNumber(py). Äpfel, Birnen..., diesmal Zahlen

Bug in Safari, ab Webkit-Version 536.20 Version aus dem User-Agent (böse, ich weiß) Vergleich mit Zahl

klappt wunderbar, bis... "Mozilla/5.0 (Macintosh; Intel Mac OS X 1084) AppleWebKit/536.30.1 (KHTML like Gecko) Version/6.0.5 Safari/536.30.1" "536.30.1" > 536.20» false

Number("536.30.1")» NaN parsefloat("536.30.1")» 536.3

console.log(11111111111111111);» 11111111111111112 parseint(1000000000000000000000.1)» 1 CC-BY http://commons.wikimedia.org/wiki/file:what_the_duck%3f.jpg

11111111111111111 > 2 53 IEEE 754: Runden zur nächstgelegenen Zahl

15.1.2.2 PARSEINT (STRING, RADIX) 1. Let inputstring be ToString(string).

String(1000000000000000000000.1)» "1e+21" parseint("1e+21")» 1

IEEE 754 Dyn. Typ. Syntax 0.1 + 0.2 "0" == false 3..toString(2) NaN [5, 10, 1].sort() a+++b 11111111111111111 null == undefined parseint("1e+21") "536.30.1" > 536.20

JAVASCRIPT HAT GENAU ZWEI WTFS: 1. IEEE 754 2. Dynamische Typisierung

LEKTÜRE Weitere WTFs: wtfjs.com ECMAScript 262-5 online: www.ecma262-5.com gedruckte Version kostenlos bestellen: ecma-international.org/publications/getit.php