为什么当我使用这个:(假设i = 1
)
divID = "question-" + i+1;
我得到问题11而不是问题2?
Answers:
使用此代替:
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-" + 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;
"question-" + parseInt(i) + 1 === ("question-" + parseInt(i)) + 1
。有关更多详细信息,请参见Joachim的答案。另外,(+i)
是不是更简洁parseInt(i)
divID = "question-" + (parseInt(i) + 1)
parseInt
不应该用数字来称呼。
parseInt(i, 10)
。我不知道这个答案到今天仍然是完全错误的,如何获得21票赞成。
由于您是将数字连接到字符串上,因此整个过程都被视为字符串。当您想将数字加在一起时,您需要分别进行处理,然后将其分配给一个变量并使用该变量,如下所示:
i = i + 1;
divID = "question-" + i;
或者您需要像这样指定数字加法:
divID = "question-" + Number(i+1);
编辑
我应该早就添加了此内容,但是根据评论,它也可以正常工作:
divID = "question-" + (i+1);
Number
不是必需的,只是括号。
Number
是变量的初始分配时间,然后它不会导致将其他内容强制转换为字符串。
divID = "question-" + parseInt(i+1,10);
在这里检查它,这是一个JSFiddle
parseInt
,只需数字周围的括号即可。jsfiddle.net/J8rvy
parseInt
用数字呼叫,仅用字符串呼叫。parseInt(1e100) === 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);
string + number + number
在哪里number + number
进行加法string
。这是不是string + number
在一般情况下,这里string
是数字,+
应该总是做加法。
var divID = "question-" + (parseInt(i)+1);
使用此+
运算符的行为是concat
因为它显示11的原因。
必须注意,它i
是变量的整数类型。在javaScript中,我们没有在变量声明期间指定数据类型,但是我们的初始化可以保证我们的变量具有特定的数据类型。
初始化声明变量是一个好习惯:
var num = 0;
var str = "";
即使您的i
变量是整数,+
运算符也可以执行串联操作而不是加法运算。
在你的问题的情况下,你应该说i = 1
,为了得到2
除了与1
尝试使用(i-1+2)
。()
不需要使用-括号。
-
(负运算符)不能被误解,您也不会得到意外的结果。
i - 1 + 2
; Number
如果i
不是数字,请改用该函数。
括号建议失败的一个地方是,如果说两个数字都是HTML输入变量。说a和b是变量,并且它们按如下方式接收它们的值(我不是HTML专家,但我的儿子遇到了这个问题,并且没有括号解决方案,即
感谢您的帮助,仅供参考-非常混乱,我父亲对“这是Blogger.com的错”大喊大叫-不,这是HTML输入默认功能与“加法”运算符结合使用的功能,当它们一起出现时,所有输入变量的默认左对齐解释是字符串的解释,因此加法运算符现在自然地充当串联运算符的双重/并行角色,因为正如您在上面所解释的那样,它是解释协议的左对齐类型此后用Java和Java脚本编写。一个非常有趣的事实:你们提供了解决方案,我为其他参加此工作的人添加了细节。
string + number + number
在哪里number + number
进行加法string
。这是不是string + number
在一般情况下,这里string
是数字,+
应该总是做加法。<input type="number">
具有valueAsNumber
,所以这不是专门针对HTML的。praseInt
应该用radix参数调用;Number
是首选。+
不执行加法运算时不是加法运算符。