tag:forum.selfhtml.org,2005:/self String.concat funktioniert im Firefox 68 nicht mehr – SELFHTML-Forum 2019-07-12T12:03:01Z https://forum.selfhtml.org/self/2019/jul/12/stringconcat-funktioniert-im-firefox-68-nicht-mehr/1752792#m1752792 Felix Riesterer https://felix-riesterer.de 2019-07-12T07:44:46Z 2019-07-12T07:44:46Z String.concat funktioniert im Firefox 68 nicht mehr <p>Liebe Mitlesende,</p> <p>hatte ein Uralt-Script von mir heute in den Händen, welches Strings nicht "addiert", sondern tatsächlich <code class="language-js">String<span class="token punctuation">.</span><span class="token function">concat</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span> b<span class="token punctuation">,</span> c<span class="token punctuation">)</span></code> stattdessen verwendet. Das gibt es in FF68 nicht mehr. Wenn man das unbedingt wollte, müsste man jetzt <code class="language-js"><span class="token class-name">String</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function">concat</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span> b<span class="token punctuation">,</span> c<span class="token punctuation">)</span></code> verwenden - also lieber doch "addieren".</p> <p>Liebe Grüße</p> <p>Felix Riesterer</p> https://forum.selfhtml.org/self/2019/jul/12/stringconcat-funktioniert-im-firefox-68-nicht-mehr/1752795#m1752795 Christian Kruse https://wwwtech.de/about 2019-07-12T07:51:39Z 2019-07-12T07:51:39Z String.concat funktioniert im Firefox 68 nicht mehr <p>Hallo Felix,</p> <blockquote> <p>hatte ein Uralt-Script von mir heute in den Händen, welches Strings nicht "addiert", sondern tatsächlich <code class="language-js">String<span class="token punctuation">.</span><span class="token function">concat</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span> b<span class="token punctuation">,</span> c<span class="token punctuation">)</span></code> stattdessen verwendet. Das gibt es in FF68 nicht mehr. Wenn man das unbedingt wollte, müsste man jetzt <code class="language-js"><span class="token class-name">String</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function">concat</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span> b<span class="token punctuation">,</span> c<span class="token punctuation">)</span></code> verwenden - also lieber doch "addieren".</p> </blockquote> <p><code>String.prototype.concat</code> solltest du nicht so wie oben beschrieben verwenden, sondern so, wie es gedacht ist:</p> <pre><code class="block language-js"><span class="token keyword">const</span> a <span class="token operator">=</span> <span class="token string">'Hallo'</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>a<span class="token punctuation">.</span><span class="token function">concat</span><span class="token punctuation">(</span><span class="token string">' Felix'</span><span class="token punctuation">,</span> <span class="token string">', wie geht es dir?'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> </code></pre> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> https://forum.selfhtml.org/self/2019/jul/12/stringconcat-funktioniert-im-firefox-68-nicht-mehr/1752803#m1752803 Rolf B 2019-07-12T08:21:18Z 2019-07-12T08:21:18Z String.concat funktioniert im Firefox 68 nicht mehr <p>Hallo Felix,</p> <p>ja. Die waren eine Erweiterung des Fuchses (bzw. des Spinnenaffen), die es nicht nach ECMA geschafft hat.</p> <p>Sie wurden im FF53 <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/53#JavaScript" rel="nofollow noopener noreferrer">missbilligt</a>, aber die Füchse haben es im FF68 nicht für nötig befunden, den Übergang von deprecated zu removed <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/68#JavaScript" rel="nofollow noopener noreferrer">aufzuschreiben</a>. Man findet es indirekt <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1222552" rel="nofollow noopener noreferrer">hier</a>, und <a href="https://www.fxsitecompat.dev/en-CA/docs/2019/non-standard-string-generics-have-been-removed/" rel="nofollow noopener noreferrer">hier</a>.</p> <p>Niemand hindert Dich, einen retro-Polyfill zu bauen, falls das für deine Zwecke einfacher ist </p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2019/jul/12/stringconcat-funktioniert-im-firefox-68-nicht-mehr/1752799#m1752799 Felix Riesterer https://felix-riesterer.de 2019-07-12T07:56:16Z 2019-07-12T07:56:16Z String.concat funktioniert im Firefox 68 nicht mehr <p>Lieber Christian,</p> <blockquote> <p>sondern so, wie es gedacht ist:</p> <pre><code class="block language-js"><span class="token keyword">const</span> a <span class="token operator">=</span> <span class="token string">'Hallo'</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>a<span class="token punctuation">.</span><span class="token function">concat</span><span class="token punctuation">(</span><span class="token string">' Felix'</span><span class="token punctuation">,</span> <span class="token string">', wie geht es dir?'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> </code></pre> </blockquote> <p>aha, "wie es gedacht ist"? Nun, warum nannten sie die Methode dann nicht <code>append</code> oder <code>extend</code>? <a href="https://dict.leo.org/englisch-deutsch/concatenate" rel="nofollow noopener noreferrer">Das Verb concatenate bedeutet "verketten".</a> Damit wäre auch meine ursprüngliche Verwendung "gedacht".</p> <p>Man kann nur dazu raten, dass man Stringverkettungen in JS besser mit den <code>+</code>-Operator anstatt dieser Methode vornimmt.</p> <p>Liebe Grüße</p> <p>Felix Riesterer</p> https://forum.selfhtml.org/self/2019/jul/12/stringconcat-funktioniert-im-firefox-68-nicht-mehr/1752801#m1752801 Christian Kruse https://wwwtech.de/about 2019-07-12T07:59:11Z 2019-07-12T07:59:11Z String.concat funktioniert im Firefox 68 nicht mehr <p>Hallo Felix,</p> <blockquote> <blockquote> <p>sondern so, wie es gedacht ist:</p> <pre><code class="block language-js"><span class="token keyword">const</span> a <span class="token operator">=</span> <span class="token string">'Hallo'</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>a<span class="token punctuation">.</span><span class="token function">concat</span><span class="token punctuation">(</span><span class="token string">' Felix'</span><span class="token punctuation">,</span> <span class="token string">', wie geht es dir?'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> </code></pre> </blockquote> <p>aha, "wie es gedacht ist"?</p> </blockquote> <p>Alle Methoden in <code>String.prototype</code> sind dafür gedacht, direkt auf einem String-Objekt angewendet zu werden.</p> <blockquote> <p>Nun, warum nannten sie die Methode dann nicht <code>append</code> oder <code>extend</code>?</p> </blockquote> <p>Extend ist ein Schlüsselwort, das wäre eine schlechte Wahl. Ansonsten: das frag am besten das standards comitee. </p> <blockquote> <p><a href="https://dict.leo.org/englisch-deutsch/concatenate" rel="nofollow noopener noreferrer">Das Verb concatenate bedeutet "verketten".</a> Damit wäre auch meine ursprüngliche Verwendung "gedacht".</p> </blockquote> <p>Als Methode im <code>String</code>-Objekt ja, als Methode in <code>String.prototype</code> nein.</p> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> https://forum.selfhtml.org/self/2019/jul/12/stringconcat-funktioniert-im-firefox-68-nicht-mehr/1752805#m1752805 Rolf B 2019-07-12T08:35:43Z 2019-07-12T08:35:43Z String.concat funktioniert im Firefox 68 nicht mehr <p>Hallo Felix,</p> <blockquote> <p>extend oder append vs concat</p> </blockquote> <p>Nein, die Namen sind schlecht. a.extend("b") oder a.append(y) suggeriert, dass a modifziert wird. Methoden dieses Namens und mit dieser Semantik gibt es an etlichen Stellen (DOM, jQuery). Strings sind in JS aber unveränderlich (immutable).</p> <blockquote> <p>Man kann nur dazu raten, dass man Stringverkettungen in JS besser mit den +-Operator anstatt dieser Methode vornimmt.</p> </blockquote> <p>Als universeller Rat ist das nicht zu empfehlen, beides hat seinen Sinn. Und die concat-Methode auf dem Prototypen ist im ECMA Standard und dürfte daher zukunftssicher sein.</p> <p>Ein binärer Operator verknüpft zwei Objekte und liefert ein neues. Wenn ich eine Folge von Verkettungen habe: "Hallo " + name + ", du bist " + alter + " Jahre alt", werden auf diese Weise 3 Zwischenobjekte erzeugt, d.h. auf dem Heap übereinander gestapelt und wieder verworfen. Nur das letzte bleibt übrig und darunter ein Loch, das der Garbage Collector flicken muss.</p> <p>Die concat-Methode kann die Längen aller Segmente vorab bestimmen, einen neuen Stringbuffer der benötigten Länge allocieren und die Segmentinhalte dort zusammenfügen. Das ist schneller und belastet den Heap weniger.</p> <p>Ob es performanter ist, für mein Beispiel oben einen Template String zu verwenden, müsste man messen. Ist aber Mikrooptimierung und im Normalfall wurscht.</p> <p>Ob die JS Engines der heutigen Browser im Stande sind, eine Folge von + Operationen auf Strings beim JIT Compile zu erkennen und in ein concat umzuwandeln, müsste man ebenfalls eruieren. Diese Optimierung gibt's beispielsweise in C#.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2019/jul/12/stringconcat-funktioniert-im-firefox-68-nicht-mehr/1752833#m1752833 JürgenB https://www.j-berkemeier.de 2019-07-12T11:27:00Z 2019-07-12T11:27:00Z String.concat funktioniert im Firefox 68 nicht mehr <p>Hallo Christian,</p> <blockquote> <p>Alle Methoden in <code>String.prototype</code> sind dafür gedacht, direkt auf einem String-Objekt angewendet zu werden.</p> </blockquote> <p>leider nicht alle. Replace wirkt nur auf den Rückgabewert.</p> <p>Gruß<br> Jürgen</p> https://forum.selfhtml.org/self/2019/jul/12/stringconcat-funktioniert-im-firefox-68-nicht-mehr/1752807#m1752807 Christian Kruse https://wwwtech.de/about 2019-07-12T08:49:27Z 2019-07-12T08:49:27Z String.concat funktioniert im Firefox 68 nicht mehr <p>Hallo Rolf,</p> <blockquote> <p>Ob die JS Engines der heutigen Browser im Stande sind, eine Folge von + Operationen auf Strings beim JIT Compile zu erkennen und in ein concat umzuwandeln, müsste man ebenfalls eruieren. Diese Optimierung gibt's beispielsweise in C#.</p> </blockquote> <p>Hättest du diesen Teilsatz nicht angefügt, hätte ich dir heftigst widersprechen müssen denn Benchmarks zeigen, dass <code>+</code> und <code>+=</code> schneller sind als <code>concat</code> – und auch als <code>[].join()</code>, und das in allen JS-Engines bis runter auf IE. Da ist eine <em>Menge</em> Optimierungsaufwand betrieben worden.</p> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> https://forum.selfhtml.org/self/2019/jul/12/stringconcat-funktioniert-im-firefox-68-nicht-mehr/1752824#m1752824 Gunnar Bittersmann selfhtml@bittersmann.de https://bittersmann.de 2019-07-12T09:27:55Z 2019-07-12T09:27:55Z String.concat funktioniert im Firefox 68 nicht mehr <p>@@Rolf B</p> <blockquote> <p>Ein binärer Operator verknüpft zwei Objekte und liefert ein neues. Wenn ich eine Folge von Verkettungen habe: "Hallo " + name + ", du bist " + alter + " Jahre alt", werden auf diese Weise 3 Zwischenobjekte erzeugt, d.h. auf dem Heap übereinander gestapelt und wieder verworfen. Nur das letzte bleibt übrig und darunter ein Loch, das der Garbage Collector flicken muss.</p> </blockquote> <pre><code class="block language-js"><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">Hallo </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>name<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">, du bist </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>alter<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"> Jahre alt</span><span class="token template-punctuation string">`</span></span> </code></pre> <p>dürfte diesbezüglich besser sein, oder?</p> <p>Außerdem ist es besser lesbar, IMHO.</p> <p>(Wenn’s auch in Uralt-Browsern laufen soll, muss man das freilich durch einen Transpiler laufen lassen.)</p> <p>LLAP </p> <div class="signature">-- <br> <em>„Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“</em> —Kurt Weidemann </div> https://forum.selfhtml.org/self/2019/jul/12/stringconcat-funktioniert-im-firefox-68-nicht-mehr/1752834#m1752834 Christian Kruse https://wwwtech.de/about 2019-07-12T11:32:26Z 2019-07-12T11:32:26Z String.concat funktioniert im Firefox 68 nicht mehr <p>Hallo JürgenB,</p> <blockquote> <blockquote> <p>Alle Methoden in <code>String.prototype</code> sind dafür gedacht, direkt auf einem String-Objekt angewendet zu werden.</p> </blockquote> <p>leider nicht alle. Replace wirkt nur auf den Rückgabewert.</p> </blockquote> <p>Bitte?</p> <pre><code class="block language-js"><span class="token string">"abc"</span><span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">a</span><span class="token regex-delimiter">/</span></span><span class="token punctuation">,</span> <span class="token string">'b'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> https://forum.selfhtml.org/self/2019/jul/12/stringconcat-funktioniert-im-firefox-68-nicht-mehr/1752837#m1752837 JürgenB https://www.j-berkemeier.de 2019-07-12T11:50:35Z 2019-07-12T11:57:23Z String.concat funktioniert im Firefox 68 nicht mehr <p>Hallo Christian,</p> <blockquote> <p>Hallo JürgenB,</p> <blockquote> <blockquote> <p>Alle Methoden in <code>String.prototype</code> sind dafür gedacht, direkt auf einem String-Objekt angewendet zu werden.</p> </blockquote> <p>leider nicht alle. Replace wirkt nur auf den Rückgabewert.</p> </blockquote> <p>Bitte?</p> <pre><code class="block language-js"><span class="token string">"abc"</span><span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">a</span><span class="token regex-delimiter">/</span></span><span class="token punctuation">,</span> <span class="token string">'b'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>wenn du das in der Console eintippst, wird dir der Rückgabewert angezeigt.</p> <p>Versuch mal</p> <pre><code class="block language-js">text <span class="token operator">=</span> <span class="token string">"abc"</span><span class="token punctuation">;</span> <span class="token comment">// -> "abc"</span> text<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token string">"a"</span><span class="token punctuation">,</span><span class="token string">"b"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// -> "bbc"</span> text <span class="token comment">// -> "abc"</span> </code></pre> <p>Getestet im FF 68.</p> <p>Gruß<br> Jürgen</p> https://forum.selfhtml.org/self/2019/jul/12/stringconcat-funktioniert-im-firefox-68-nicht-mehr/1752840#m1752840 Christian Kruse https://wwwtech.de/about 2019-07-12T11:54:39Z 2019-07-12T11:54:39Z String.concat funktioniert im Firefox 68 nicht mehr <p>Hallo JürgenB,</p> <blockquote> <p>wenn du das in der Console eintippst, wird dir der Rückgabewert angezeigt.</p> <p>Versuch mal</p> <pre><code class="block language-js">text <span class="token operator">=</span> <span class="token string">"abc"</span><span class="token punctuation">;</span> <span class="token comment">// -> "abc"</span> text<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token string">"a"</span><span class="token punctuation">,</span><span class="token string">"b"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// -> "bbc"</span> text <span class="token comment">// -> "abc"</span> </code></pre> </blockquote> <p>Ich glaube, du hast mich missverstanden. Ich sagte, die <code>String.prototype</code>-Methoden sind dazu gedacht auf String-Objekte angewandt zu werden, also <code>'abc'.replace('a', 'b')</code> statt <code>String.replace('abc', 'a', 'b')</code> – ich sagte nicht, dass <code>String.prototype</code>-Methoden destruktiv sind.</p> <p>String-Objekte in JS sind immutable, keine der <code>String.prototype</code>-Methoden ist destruktiv, sie geben alle einen neuen String zurück.</p> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> https://forum.selfhtml.org/self/2019/jul/12/stringconcat-funktioniert-im-firefox-68-nicht-mehr/1752843#m1752843 JürgenB https://www.j-berkemeier.de 2019-07-12T12:03:01Z 2019-07-12T12:03:01Z String.concat funktioniert im Firefox 68 nicht mehr <p>Hallo Christian,</p> <blockquote> <p>Ich glaube, du hast mich missverstanden. …</p> </blockquote> <p>so isses.</p> <blockquote> <p>String-Objekte in JS sind immutable, keine der <code>String.prototype</code>-Methoden ist destruktiv, sie geben alle einen neuen String zurück.</p> </blockquote> <p>leider. Ich habe daher heute morgen im Bus ein replace gebastelt, das direkt im String durchgeführt wird. Da bei mir die Anzahl der Ersetzungen proportional zur Stringlänge ist, musste ich einen String mit 150*n Bytes n-mal umkopieren, also Ordnung n². Jetzt habe ich Ordnung n.</p> <p>Gruß<br> Jürgen</p>