为什么当我使用这个时:(假设i = 1
)
divID = "question-" + i+1;
我得到的是问题 11 而不是问题 2?
请改用这个:
var divID = "question-" + (i+1)
这是一个相当普遍的问题,不仅仅发生在JavaScript中。这个想法是+
可以表示串联和加法。
由于 + 运算符将从左到右处理,因此代码中的决策如下所示:
-
"question-" + i
:由于"question-"
是一个字符串,我们将进行串联,从而产生"question-1"
-
"question-1" + 1
:由于"queston-1"
是一个字符串,我们将进行连接,从而产生"question-11"
。
有了"question-" + (i+1)
,情况就不同了:
- 由于
(i+1)
在括号中,因此必须先计算其值,然后才能应用第一个+
:-
i
是数字,1
是数字,所以我们要做加法,结果是2
-
-
"question-" + 2
:由于"question-"
是一个字符串,我们将进行连接,从而产生"question-2"
。
你也可以使用这个
divID = "question-" + (i*1+1);
以确保i
转换为整数。
仅使用:
divID = "question-" + parseInt(i) + 1;
当"n"来自 html 输入字段或声明为字符串时,需要使用显式转换。
var n = "1"; //type is string
var frstCol = 5;
lstCol = frstCol + parseInt(n);
如果"n"是整数,则不需要转换。
n = 1; //type is int
var frstCol = 5, lstCol = frstCol + n;
由于您将数字连接到字符串上,因此整个事情被视为字符串。当你想把数字加在一起时,你需要单独做,把它分配给一个var,然后使用该var,就像这样:
i = i + 1;
divID = "question-" + i;
或者您需要像这样指定数字加法:
divID = "question-" + Number(i+1);
编辑
我早就应该添加这个,但根据评论,这也有效:
divID = "question-" + (i+1);
divID = "question-" + parseInt(i+1,10);
在这里检查一下,它是一个JSFiddle
另一种选择可能是使用:
divID = "question-" + (i - -1);
减负数与加法相同,减号不能用于串联
编辑:忘记了括号仍然是必需的,因为代码是从左到右读取的。
添加括号
divID = "question-" + (i+1);
大括号将数字括起来,将被视为加法而不是连接。
divID = "question-" + (i+1)
你得到它的原因是运算符的优先级顺序,以及+
用于连接字符串和执行数字加法的事实。
在您的情况下,"question-"和i
的串联首先发生,给出字符串"question=1"。然后另一个字符串与"1"连接,给出"问题-11"。
你只需要给解释器一个提示,说明你想要什么优先顺序。
divID = "question-" + (i+1);
Joachim Sauer的答案将适用于这样的场景。但在某些情况下,添加括号无济于事。
例如:您正在将"输入元素和整数的值之和"作为参数传递给函数。
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
您可以使用Number()
使其工作
arg1 = Number($("#elemId").val());
arg2 = 1;
someFuntion(arg1 + arg2);
或
arg1 = $("#elemId").val();
arg2 = 1;
someFuntion(Number(arg1) + arg2);
var divID = "question-" + (parseInt(i)+1);
使用此+
运算符的行为就像concat
这就是它显示 11 的原因。
必须注意i
是整数类型的变量。在 javaScript 中,我们不会在声明变量时指定数据类型,但是我们的初始化可以保证我们的变量是特定的数据类型。
初始化声明变量是一种很好的做法:
- 如果是整数,则
var num = 0;
- 如果是字符串,
var str = "";
即使i
变量是整数,+
运算符也可以执行串联而不是加法。
在您的问题的情况下,您已经假设i = 1
,为了获得2
,此外1
尝试使用(i-1+2)
。无需使用()
括号。
-
(减号运算符)不会被误解,您不会得到意想不到的结果。
括号建议失败的一个地方是,如果说两个数字都是 HTML 输入变量。假设 a 和 b 是变量,其中一个接收它们的值如下(我不是 HTML 专家,但我的儿子遇到了这个问题,没有括号解决方案,即
- HTML 输入是变量 a 和 b 的预期数值,因此假设输入为 2 和 3。
- 下面给出了字符串连接输出:a+b 显示 23; +a+b 显示 23;(a)+(b) 显示 23;
- 根据上面的建议,我们尝试成功了:数字(a)+数字(b)显示5;parseInt(a)+parseInt(b)显示5。
感谢您的帮助,仅供参考 - 非常令人困惑,我他的父亲被大喊"那是 Blogger.com的错" - 不,这是 HTML 输入默认与"加法"运算符结合使用的功能,当它们一起出现时,所有和任何输入变量的默认左对齐解释是字符串的解释,因此加法运算符现在自然地充当其双重/并行角色作为连接运算符,因为正如您一样上面解释的人是 Java 和 Java 脚本中的左对齐类型的解释协议。非常有趣的事实。你们提供了解决方案,我正在为遇到这种情况的其他人添加详细信息。
简单一样简单...如果未在 HTML 中定义,则每个输入类型都被视为字符串。因此,加号"+"运算符正在连接。
使用 parseInt(i) 比 "i" 的值将被强制转换为 Integer。
比"+"运算符将像加法一样工作。
在您的情况下,这样做:-
divID = "question-" + parseInt(i)+1;