Javascript (+) 符号连接而不是给出变量的总和



为什么当我使用这个时:(假设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;

最新更新