Warum, wenn ich das benutze: (vorausgesetzt i = 1
)
divID = "question-" + i+1;
Ich bekomme Frage 11 und nicht Frage 2 ?
Antworten:
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:
(i+1)
in Klammern steht, muss sein Wert berechnet werden, bevor der erste +
angewendet werden kann:
i
ist numerisch, 1
ist 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"
.divID = ("question-" + i) + 1;
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;
"question-" + parseInt(i) + 1 === ("question-" + parseInt(i)) + 1
. Weitere Einzelheiten finden Sie in Joachims Antwort. Auch (+i)
ist prägnanter alsparseInt(i)
divID = "question-" + (parseInt(i) + 1)
parseInt
soll nicht mit einer Nummer angerufen werden.
parseInt(i, 10)
. Ich verstehe nicht, wie diese Antwort, die bis heute völlig falsch ist , 21 positive Stimmen erhielt.
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);
Number
ist nicht erforderlich, nur die Eltern.
Number
wenn die Variable anfänglich zugewiesen wird, und dann werden andere Dinge nicht in Zeichenfolgen umgewandelt.
divID = "question-" + parseInt(i+1,10);
Überprüfen Sie es hier , es ist eine JSFiddle
parseInt
, nur die Parens um die Nummer. jsfiddle.net/J8rvy
parseInt
mit einer Nummer an, sondern nur mit einer Zeichenfolge. parseInt(1e100) === 1
.
Fügen Sie Klammern hinzu
divID = "question-" + (i+1);
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 i
zuerst 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);
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);
string + number + number
wo number + number
das Hinzufügen erfolgen soll, bevor es mit dem verkettet wird string
. Es geht string + number
im Allgemeinen nicht darum , wo string
numerisch ist und +
sollte immer addiert werden.
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.
var divID = "question-" + (parseInt(i)+1);
Verwenden Sie diesen +
Operator so concat
, dass er 11 anzeigt.
Es muss darauf geachtet werden, dass i
es 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:
var num = 0;
var str = "";
Selbst wenn Ihre i
Variable eine Ganzzahl ist, +
kann der Operator eine Verkettung anstelle einer Addition durchführen.
Im Fall Ihres Problems haben Sie das angenommen, i = 1
um 2
zusätzlich mit 1
versuchen 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.
i - 1 + 2
; Verwenden Sie Number
stattdessen die Funktion, wenn i
es sich nicht um eine Zahl handelt.
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
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.
string + number + number
wo number + number
das Hinzufügen erfolgen soll, bevor es mit dem verkettet wird string
. Es geht string + number
im Allgemeinen nicht darum , wo string
numerisch ist und +
sollte immer addiert werden. <input type="number">
hat valueAsNumber
, also geht es hier nicht speziell um HTML. praseInt
sollte mit dem radix-Argument aufgerufen werden; Number
Ist bevorzugt. +
ist nicht der Additionsoperator, wenn er keine Addition ausführt.
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;
parseInt
mit einer Nummer an, sondern nur mit einer Zeichenfolge. parseInt(1e100) === 1
.