Javascript(+)符号串联在一起,而不是给出变量总和


76

为什么当我使用这个:(假设i = 1

divID = "question-" + i+1;

我得到问题11而不是问题2


javascript首先将i的值添加到字符串中,然后添加1
jcubic,

Answers:


75

使用此代替:

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"

工作,谢谢!但是你能告诉我有什么区别吗?
2011年

1
@IlyaD-运算符优先级相关的运算符是Addition,它是从左到右处理的。因此,它的操作类似于:divID = ("question-" + i) + 1;
影子巫师为您服务

1
在我的案例中,这种简单的工作例如“ Question” +(i + j)假定两个变量均为字符串,最好采用以下解决方案作为“ question-” +(i * 1 + j)
Lokesh 2013年

刚才我很惊讶地发现这行不通:console.log('Add City Row:'+(i + 1)); 即使括号中有数学运算,也可以将它们连接在一起。
Rikaelus

很好地说明了为什么会这样。
apex

33

您也可以使用此

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

确保将i其转换为整数。


18

仅使用:

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;

6
这个答案是非常错误的。问题仍然是串联和加法是左关联的。即:"question-" + parseInt(i) + 1 === ("question-" + parseInt(i)) + 1。有关更多详细信息,请参见Joachim的答案。另外,(+i)是不是更简洁parseInt(i)
ZAQ

1
语法应为:divID = "question-" + (parseInt(i) + 1)
Panini Luncher

3
这个答案是完全错误的。并且parseInt不应该用数字来称呼。
Oriol

如果有的话,语法应该包括在内parseInt(i, 10)。我不知道这个答案到今天仍然是完全错误的,如何获得21票赞成。
user4642212

唯一适用于我的解决方案是,在我的情况下,这些parens无效。
mimi

9

由于您是将数字连接到字符串上,因此整个过程都被视为字符串。当您想将数字加在一起时,您需要分别进行处理,然后将其分配给一个变量并使用该变量,如下所示:

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

或者您需要像这样指定数字加法:

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

编辑

我应该早就添加了此内容,但是根据评论,它也可以正常工作:

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

4
Number不是必需的,只是括号。
Jamiec

是的,看到这里的其他答案,我意识到了。我肯定不是js专家。我以为您必须使用Number强制添加,但我应该知道。JS似乎能够“弄清楚它”,这是该语言真正酷的方面之一。感谢您的评论。
蒂姆·霍布斯

这非常适合我的需求。我有一个从文本输入中分配的变量,而不是字符串文字。我使用的Number是变量的初始分配时间,然后它不会导致将其他内容强制转换为字符串。
DCShannon DC



0

用括号括起来的数字将被视为加法运算而不是concat。

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

0

您得到的原因是运算符的优先顺序,以及+用于连接字符串和执行数字加法的事实。

在您的情况下,“ question-”的连接i是首先出现字符串“ question = 1”的情况。然后,另一个字符串与“ 1”串联,给出“问题11”。

您只需要向解释器提示您想要哪种优先顺序即可。

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

0

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);

1
这个答案没有解决这个问题。问题是在将其连接到之前应该string + number + number在哪里number + number进行加法string。这是不是string + number在一般情况下,这里string是数字,+应该总是做加法。
user4642212

0

另一种选择是使用:

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

减去负数就等于加法,负号不能用于串联

编辑:忘记了括号仍然是必需的,因为从左到右读取代码。


忘了加括号。在某些情况下(但并非全部)在没有括号的情况下有效。
Zinger

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

使用此+运算符的行为是concat因为它显示11的原因。


-1

必须注意,它i是变量的整数类型。在javaScript中,我们没有在变量声明期间指定数据类型,但是我们的初始化可以保证我们的变量具有特定的数据类型。

初始化声明变量是一个好习惯:

  • 如果是整数, var num = 0;
  • 如果是字符串, var str = "";

即使您的i变量是整数,+运算符也可以执行串联操作而不是加法运算。

在你的问题的情况下,你应该说i = 1,为了得到2除了与1尝试使用(i-1+2)()不需要使用-括号。

- (负运算符)不能被误解,您也不会得到意外的结果。


变量的初始化方式与此处无关。仍然需要括号;是分组运算符强制执行特定的操作优先级。不要做i - 1 + 2; Number如果i不是数字,请改用该函数。
user4642212

-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脚本编写。一个非常有趣的事实:你们提供了解决方案,我为其他参加此工作的人添加了细节。


这个答案没有解决这个问题。问题是在将其连接到之前应该string + number + number在哪里number + number进行加法string。这是不是string + number在一般情况下,这里string是数字,+应该总是做加法。<input type="number">具有valueAsNumber,所以这不是专门针对HTML的。praseInt应该用radix参数调用;Number是首选。+不执行加法运算时不是加法运算符。
user4642212

-2

一样简单...如果未在HTML中定义每种输入类型,则将其视为字符串。因此,加号“ +”运算符正在串联。

使用parseInt(i),然后将“ i”的值强制转换为Integer。

比“ +”运算符更像加法。

在您的情况下,请执行以下操作:

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

1
切勿parseInt用数字呼叫,仅用字符串呼叫。parseInt(1e100) === 1
Oriol
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.