Hallo dedlfix
Soweit der eine Teil. Aber warum schafft es der Minus-Operator (oder auch parseInt()), den Wert \n8 in eine Zahl umzuwandeln, der Konstruktor von Number aber nicht?
Wie kommst du darauf, dass der Konstruktor von Number das nicht schaffen sollte? Ich meine, vorausgesetzt, man ruft ihn als Funktion und nicht als Konstruktor auf …
console.log(typeof Number('\n8')); // number
Bei der Auswertung eines Ausdrucks mit dem Minusoperator wird für die Werte links und rechts des Operators die abstrakte Operation ToNumber
performt, welche einen String in einen Wert vom Typ Number konvertiert und dabei Whitespace ignoriert. Die gleiche Operation wird auch von parseInt durchgeführt.
Bei einem Aufruf von Number wird ebenfalls ToNumber
auf den als Argument übergebenen Wert angewandt, wobei dann das Aufrufmuster darüber entscheidet, ob der von dieser Operation zurückgegebene Wert auch der Rückgabewert von Number ist, oder ob ein Objekt zurückgegeben werden soll, welches diesen primitiven Wert in einer internen Eigenschaft kapselt.
const value = '\n8';
console.log(value - 3); // 5
[parseInt, Number].forEach(fn =>
console.log(typeof fn(value)) // number, number
);
In allen drei Fällen wird also dieselbe Operation ausgeführt und dementsprechend findet auch in allen drei Fällen eine Typkonvertierung von String zu Number statt.
Viele Grüße,
Orlok