Das Javascript (+) - Zeichen verkettet sich, anstatt die Summe der Variablen anzugeben

76

Warum, wenn ich das benutze: (vorausgesetzt i = 1)

divID = "question-" + i+1;

Ich bekomme Frage 11 und nicht Frage 2 ?

ilyo
quelle
Javascript addieren zuerst den Wert von i zum String und dann 1
jcubic

Antworten:

76

Verwenden Sie stattdessen Folgendes:

var divID = "question-" + (i+1)

Es ist ein ziemlich häufiges Problem und tritt nicht nur in JavaScript auf. Die Idee ist , dass +darstellen kann sowohl Verkettung und Addition.

Da der Operator + von links nach rechts behandelt wird, sehen die Entscheidungen in Ihrem Code folgendermaßen aus:

  • "question-" + i: Da "question-"es sich um eine Zeichenfolge handelt, führen wir eine Verkettung durch"question-1"
  • "question-1" + 1: Da "queston-1"es sich um eine Zeichenfolge handelt, führen wir eine Verkettung durch "question-11".

Mit ist "question-" + (i+1)es anders:

  • Da das (i+1)in Klammern steht, muss sein Wert berechnet werden, bevor der erste +angewendet werden kann:
    • iist numerisch, 1ist numerisch, also werden wir addieren, was dazu führt2
  • "question-" + 2: Da "question-"es sich um eine Zeichenfolge handelt, führen wir eine Verkettung durch "question-2".
Joachim Sauer
quelle
Arbeitete, danke! Aber kannst du mir sagen, was nicht der Unterschied ist?
Ilyo
1
@IlyaD - Operator Vorrang relevanter Operator ist Addition, die von links nach rechts behandelt wird. Also macht es so etwas wie:divID = ("question-" + i) + 1;
Shadow Wizard ist Ear For You
1
Dies funktioniert in meinem Fall nicht, z. B. "Frage" + (i + j). Es wurden beide Variablen als Zeichenfolge angenommen, besser mit der folgenden Lösung als "Frage-" + (i * 1 + j)
Lokesh
Ich war gerade überrascht, dass dies nicht funktionierte: console.log ('Add City Row:' + (i + 1)); Selbst wenn die Mathematik in Klammern steht, werden sie verkettet.
Rikaelus
Tolle Beschreibung, warum dies passiert.
Apex
33

Sie können dies auch verwenden

divID = "question-" + (i*1+1); 

um sicherzugehen, dass dies iin eine Ganzzahl konvertiert wird.

Serafeim
quelle
18

Nur benutzen:

divID = "question-" + parseInt(i) + 1;

Wenn "n" aus dem HTML-Eingabefeld stammt oder als Zeichenfolge deklariert ist, müssen Sie eine explizite Konvertierung verwenden.

var n = "1"; //type is string
var frstCol = 5;
lstCol = frstCol + parseInt(n);

Wenn "n" eine Ganzzahl ist, muss keine Konvertierung durchgeführt werden.

n = 1; //type is int
var frstCol = 5, lstCol = frstCol + n;
edercortes
quelle
6
Diese Antwort ist sehr falsch. Es bleibt das Problem , dass Verkettung und zusätzlich sind linksassoziativ . Das heißt : "question-" + parseInt(i) + 1 === ("question-" + parseInt(i)) + 1. Weitere Einzelheiten finden Sie in Joachims Antwort. Auch (+i)ist prägnanter alsparseInt(i)
Zaq
1
Die Syntax sollte gewesen sein:divID = "question-" + (parseInt(i) + 1)
Panini Luncher
3
Diese Antwort ist völlig falsch. Und parseIntsoll nicht mit einer Nummer angerufen werden.
Oriol
Wenn überhaupt, sollte die Syntax enthalten sein parseInt(i, 10). Ich verstehe nicht, wie diese Antwort, die bis heute völlig falsch ist , 21 positive Stimmen erhielt.
user4642212
Die einzige Lösung, die für mich funktionierte, war, dass diese Parens in meinem Fall nicht funktionierten.
Mimi
9

Da Sie Zahlen mit einer Zeichenfolge verknüpfen, wird das Ganze als Zeichenfolge behandelt. Wenn Sie Zahlen addieren möchten, müssen Sie dies entweder separat tun und einer Variablen zuweisen und diese Variable wie folgt verwenden:

i = i + 1;
divID = "question-" + i;

Oder Sie müssen die Nummernaddition wie folgt angeben:

divID = "question-" + Number(i+1);

BEARBEITEN

Ich hätte das schon vor langer Zeit hinzufügen sollen, aber basierend auf den Kommentaren funktioniert dies auch:

divID = "question-" + (i+1);
Tim Hobbs
quelle
4
Das Numberist nicht erforderlich, nur die Eltern.
Jamiec
Ja, als ich die anderen Antworten hier sah, wurde mir das klar. Ich bin sicher kein Guru. Ich dachte, Sie müssten den Zusatz mit Number umsetzen, aber ich hätte es wissen müssen. JS scheint einfach in der Lage zu sein, "es herauszufinden", was einer der wirklich coolen Aspekte der Sprache ist. Danke für den Kommentar.
Tim Hobbs
Das ist perfekt für meine Bedürfnisse. Anstelle eines String-Literal hatte ich eine Variable, die ich aus einer Texteingabe zugewiesen hatte. Ich verwende, Numberwenn die Variable anfänglich zugewiesen wird, und dann werden andere Dinge nicht in Zeichenfolgen umgewandelt.
DCShannon
4
divID = "question-" + parseInt(i+1,10);

Überprüfen Sie es hier , es ist eine JSFiddle

rsplak
quelle
6
Sie brauchen das nicht parseInt, nur die Parens um die Nummer. jsfiddle.net/J8rvy
Jamiec
2
+1, hatte gerade große Probleme mit ganzen Zahlen in meinem eigenen Projekt, also benutze ich parseInt jetzt zu viel, hehe
rsplak
2
Rufen Sie niemals parseIntmit einer Nummer an, sondern nur mit einer Zeichenfolge. parseInt(1e100) === 1.
Oriol
0

Fügen Sie Klammern hinzu

divID = "question-" + (i+1);
Billy Moon
quelle
0

Die Verwendung von Klammern, die die Zahlen umgeben, wird als Addition anstelle von Concat behandelt.

divID = "question-" + (i+1)
niksvp
quelle
0

Der Grund dafür ist die Rangfolge der Operatoren und die Tatsache, dass +sowohl Zeichenfolgen verkettet als auch numerische Additionen durchgeführt werden.

In Ihrem Fall erfolgt die Verkettung von "question-" und izuerst mit der Zeichenfolge "question = 1". Dann eine weitere Zeichenfolgenverkettung mit "1", was "Frage-11" ergibt.

Sie müssen dem Dolmetscher lediglich einen Hinweis geben, welche Rangfolge Sie wünschen.

divID = "question-" + (i+1);
Jamiec
quelle
0

Die Antwort von Joachim Sauer wird in solchen Szenarien funktionieren. Es gibt jedoch einige Fälle, in denen das Hinzufügen von Klammern nicht hilft.

Beispiel: Sie übergeben einer Funktion die Summe des Werts eines Eingabeelements und einer Ganzzahl als Argument.

arg1 = $("#elemId").val();   // value is treated as string
arg2 = 1;
someFuntion(arg1 + arg2);    // and so the values are merged here
someFuntion((arg1 + arg2));  // and here

Sie können es mit verwenden Number()

arg1 = Number($("#elemId").val());
arg2 = 1;
someFuntion(arg1 + arg2);

oder

arg1 = $("#elemId").val();
arg2 = 1;
someFuntion(Number(arg1) + arg2);
musafar006
quelle
1
Diese Antwort geht nicht auf die Frage ein. Die Frage ist, string + number + numberwo number + numberdas Hinzufügen erfolgen soll, bevor es mit dem verkettet wird string. Es geht string + numberim Allgemeinen nicht darum , wo stringnumerisch ist und +sollte immer addiert werden.
user4642212
0

Eine andere Alternative könnte sein:

divID = "question-" + (i - -1);

Das Subtrahieren eines Negativs entspricht dem Addieren, und ein Minus kann nicht für die Verkettung verwendet werden

Bearbeiten: Ich habe vergessen, dass Klammern noch erforderlich sind, da der Code von links nach rechts gelesen wird.

Zinger
quelle
Ich habe vergessen, Klammern hinzuzufügen. Funktioniert in einigen Fällen ohne Klammern, aber nicht in allen.
Zinger
-1
var divID = "question-" + (parseInt(i)+1);

Verwenden Sie diesen +Operator so concat, dass er 11 anzeigt.

Avanish Kumar
quelle
-1

Es muss darauf geachtet werden, dass ies sich um eine ganzzahlige Variable handelt. In JavaScript geben wir den Datentyp während der Deklaration von Variablen nicht an, aber unsere Initialisierung kann garantieren, dass unsere Variable von einem bestimmten Datentyp ist.

Es wird empfohlen, Deklarationsvariablen zu initialisieren:

  • Bei ganzen Zahlen var num = 0;
  • Im Falle von Zeichenfolgen, var str = "";

Selbst wenn Ihre iVariable eine Ganzzahl ist, +kann der Operator eine Verkettung anstelle einer Addition durchführen.

Im Fall Ihres Problems haben Sie das angenommen, i = 1um 2zusätzlich mit 1versuchen zu können (i-1+2). Die Verwendung einer ()Klammer ist nicht erforderlich.

- (Minus-Operator) kann nicht missverstanden werden und Sie erhalten keine unerwarteten Ergebnisse.

Dawood Ibrahim Bhat
quelle
Wie Variablen initialisiert werden, spielt hier keine Rolle. Klammern werden weiterhin benötigt; Es ist der Gruppierungsoperator, der eine bestimmte Vorrangstellung erzwingt. Tu es nicht i - 1 + 2; Verwenden Sie Numberstattdessen die Funktion, wenn ies sich nicht um eine Zahl handelt.
user4642212
-2

Eine Stelle, an der der Vorschlag in Klammern fehlschlägt, ist, wenn beide Zahlen HTML-Eingabevariablen sind. Angenommen, a und b sind Variablen und man erhält ihre Werte wie folgt (ich bin kein HTML-Experte, aber mein Sohn ist darauf gestoßen und es gab keine Klammerlösung, dh

  • HTML-Eingaben waren beabsichtigte numerische Werte für die Variablen a und b, also waren die Eingaben 2 und 3.
  • Das Folgende ergab Ausgaben für die Verkettung von Zeichenfolgen: a + b zeigte 23 an; + a + b angezeigt 23; (a) + (b) angezeigt 23;
  • Aus den obigen Vorschlägen haben wir erfolgreich versucht: Nummer (a) + Nummer (b) angezeigt 5; parseInt (a) + parseInt (b) angezeigt 5.

Vielen Dank für die Hilfe, nur zu Ihrer Information - war sehr verwirrend und ich, sein Vater, wurde angeschrien, "das war Blogger.coms Schuld" - nein, es ist eine Funktion der Standardeinstellung für HTML-Eingabe in Kombination mit dem Operator "Addition", wenn sie zusammen auftreten Die standardmäßige linksbündige Interpretation aller und aller Eingabevariablen ist die eines Strings, und daher fungiert der Additionsoperator in seiner dualen / parallelen Rolle jetzt natürlich als Verkettungsoperator, da es sich, wie Sie oben erläutert haben, um ein Interpretationsprotokoll vom Typ linksbündig handelt in Java und Java-Skript danach. Sehr interessante Tatsache. Ihr Leute habt die Lösung angeboten, ich füge die Details für andere hinzu, die darauf stoßen.

Heiligschlag
quelle
Diese Antwort geht nicht auf die Frage ein. Die Frage ist, string + number + numberwo number + numberdas Hinzufügen erfolgen soll, bevor es mit dem verkettet wird string. Es geht string + numberim Allgemeinen nicht darum , wo stringnumerisch ist und +sollte immer addiert werden. <input type="number">hat valueAsNumber, also geht es hier nicht speziell um HTML. praseIntsollte mit dem radix-Argument aufgerufen werden; NumberIst bevorzugt. +ist nicht der Additionsoperator, wenn er keine Addition ausführt.
user4642212
-2

Einfach so einfach ... Jeder Eingabetyp, der nicht in HTML definiert ist, wird als Zeichenfolge betrachtet. Aus diesem Grund verkettet der Plus-Operator "+".

Verwenden Sie parseInt (i), als der Wert von "i" in Integer umgewandelt wird.

Dann funktioniert der Operator "+" wie eine Addition.

In Ihrem Fall tun Sie Folgendes: -

divID = "question-" + parseInt(i)+1;
makemelive
quelle
1
Rufen Sie niemals parseIntmit einer Nummer an, sondern nur mit einer Zeichenfolge. parseInt(1e100) === 1.
Oriol