Hallo,
Prinzipiell gebe ich Dir recht, aber z.B. MDN schreibt:
The operands of all bitwise operators are converted to signed 32-bit integers in two's complement format.
logisch, dass Bit-Operationen auf String- oder float-Werten nicht sinnvoll sind.
Und da frage ich: Wie speichert JavaScript Zahlen? Ist es nicht so, dass JavaScript nur "Number" kennt und als Fließkommazahl speichert?
Das kommt wieder auf die konkrete JS-Engine an. Soweit ich weiß, konvertiert JS aber auch bei Number lustig zwischen int und float. Um die typischen Fallstricke bei der float-Arithmetik weitgehend zu vermeiden (z.B. die Rundungsfehler bei mehrfacher Addition), hält JS die Werte AFAIK bevorzugt als Integer vor, und wandelt sie intern erst dann in float, wenn der Wert das erforderlich macht. Ich meine, das hätte ich so in der Art mal in der ECMAScript-Spec gelesen.
D.h. bei Anwendung der Bitoperatoren erfolgt implizit eine int/float. Und vorher noch eine Abfrage, ob vielleicht doch ein String in der Variablen steht. Wenn ja, muss der erstmal numerifiziert werden. Und vielleicht bit-kombiniert man Eigenschaftswerte aus Objekten? Das Ausführen der eigentlichen Bit-Operation gelingt dann vielleicht in einer New Yorker Sekunde (wie bitte?), aber während der Zeit für die Vorarbeit kannst Du den Rasen im Central Park mähen.
Dieses ganze Gedöns, also das Holen der Operanden, das Überprüfen der Datentypen und bei Bedarf die Konvertierung, gilt aber für alle anderen Operationen entsprechend auch, deswegen habe ich den Aspekt gar nicht betrachtet. Und ja, ich mag es eigentlich nicht, wenn der Typ einer Variablen sich ohne mein Zutun ändern kann. Ich bevorzuge eigentlich eine feste Typisierung wie etwa in C.
Ein Beispiel: Vor 15 Jahren hatte ich die Aufgabe, in C# eine Bitmap umzurechnen. Ich habe sie als Array von Punkten betrachtet und darauf hantiert. Die Operation pro Pixel war eine primitive Bitmanipulation, aber die ganze Bitmap durchzuackern dauerte viele Sekunden. Dann habe ich sogenannten unsafe Code benutzt (ein spezieller Modus von .net) und statt Tabellenzugriffen mit Pointern gearbeitet - und die Funktion war in einem Wimpernschlag fertig. Die Bitoperationen waren schnell, der Zeitfresser war der Arrayzugriff, bei dem jedesmal die Koordinaten auf Grenzverletzung geprüft wurden und in Speicheroffsets umzurechnen waren.
Das überrascht mich überhaupt nicht.
Ciao,
Martin
Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
- Douglas Adams, The Hitchhiker's Guide To The Galaxy