Hallo Rolf
ich bin im Javascript-Teil gerade darüber gestolpert, dass nicht zwischen primitiven Typen und Wrappertypen unterschieden wird. Im Artikel zu Boolean wurde munter mit new Boolean() hantiert, obwohl das nun überhaupt keinen primitiven Boolean-Typ erzeugt, sondern einen Wrapper dazu. Das kann zu bösen Fehlern führen, ein Beispiel dafür habe ich dort nun angeführt.
Bevor ich als "Neuling" hier eine Baustelle aufmache und umbaue (würde ich gern übernehmen), hätte ich gern die Meinung der "altgedienten" dazu - ist das dort so Absicht gewesen oder war dieser Unterschied einfach nicht so ganz klar?
Der Artikel von dem du hier offenbar sprichst ist unter Standardobjekte einsortiert, das heißt, der Gegenstand dieses Artikels ist grundsätzlich zunächst einmal der eingebaute Konstruktor Boolean
.
Bei einem Aufruf von Boolean
wird als erstes die interne Operation ToBoolean mit dem Wert des Funktionsparameters durchgeführt, die abhängig davon, ob es sich um einen truthy value oder um einen falsy value handelt, den primitiven Wert true
oder false
zurückgibt. Bei einem normalen Aufruf ist dieser Wert auch der Rückgabewert von Boolean
.
In diesem Fall wird also eine Typumwandlung durchgeführt:
const log = console.log.bind(console);
const foo = Boolean({ });
log(typeof foo); // boolean
log(foo); // true
const bar = Boolean(null);
log(typeof bar); // boolean
log(bar); // false
Wurde Boolean
hingegen mittels des Operators new
als Konstruktor aufgerufen, dann wird ein Objekt erzeugt, in dessen interner Eigenschaft [[BooleanData]]
der zuvor von ToBoolean
zurückgegebene primitive Wert hinterlegt wird.
Es wird also wie du sagst ein Wrapper Object erzeugt:
const log = console.log.bind(console);
const object = new Boolean([ ]);
log(typeof object); // object
const value = object.valueOf( );
log(typeof value); // boolean
log(value); // true
const string = object.toString( );
log(typeof string); // string
log(string); // true
Wird ein Objekt vom Typ Boolean erzeugt, dann erbt es von Boolean.prototype
die Methoden valueOf
und toString
, welche die gleichnamigen Methoden von Object.prototype
innerhalb der Prototypenkette verschatten.
Die Methode valueOf
kann verwendet werden um den Wert der internen Eigenschaft [[BooleanData]]
des Instanzobjektes zu examinieren und toString
erzeugt eine Stringrepräsentation dieses Wertes.
Also, lange Rede kurzer Sinn, ich denke das sollte in etwa der rote Faden der Story sein. Davon abgesehen stimme ich dir voll und ganz zu, dass der Unterschied von primitiven Datentyp Boolean und dem Objekttyp Boolean möglichst klar kommuniziert werden sollte …
… und ich würde mich sehr darüber freuen, wenn du diesen Artikel übernehmen würdest! :-)
Vielen Dank und viele Grüße,
Orlok