【问题标题】:Javascript (+) sign concatenates instead of giving sum of variablesJavascript (+) 符号连接而不是给出变量的总和
【发布时间】:2011-08-23 02:11:48
【问题描述】:

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

divID = "question-" + i+1;

我得到 question-11 而不是 question-2

【问题讨论】:

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

标签: javascript math


【解决方案1】:

另一种选择是使用:

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

减负和加是一样的,不能用减号串联

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

【讨论】:

  • 忘记加括号了。在某些情况下不带括号有效,但不是全部。
  • 唯一对我有用的答案。令人印象深刻的是,像 Javascript 这样的语言如果没有这样的技巧就无法轻松完成简单的添加。尝试了所有其他答案但没有成功!
【解决方案2】:

Joachim Sauer's answer 可以在这样的情况下工作。但在某些情况下,添加括号无济于事。

例如:您将“输入元素和整数的值之和”作为参数传递给函数。

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 是数字,+ 应该总是做加法。
【解决方案3】:

必须注意i 是一个整数类型的变量。在javaScript中,我们在声明变量时不指定数据类型,但是我们的初始化可以保证我们的变量是特定的数据类型。

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

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

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

在您的问题的情况下,您假设i = 1,为了获得2 以及1,请尝试使用(i-1+2)。不需要使用()-括号。

-(减号运算符)不能被误解,你不会得到意想不到的结果。

【讨论】:

  • 变量如何初始化在这里无关紧要。仍然需要括号;它是强制特定操作优先级的分组运算符。不要做i - 1 + 2;如果i 不是数字,请改用Number 函数。
【解决方案4】:

改用这个:

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"

【讨论】:

  • 工作,谢谢!但你能告诉我有什么区别吗?
  • @IlyaD - Operator Precedence 相关运算符是从左到右处理的加法。所以它正在做类似的事情:divID = ("question-" + i) + 1;
  • 这在我的情况下有效,例如“问题”+(i + j)它假设两个变量都是字符串,最好使用以下解决方案作为“问题-”+(i * 1 + j)
  • 我刚刚惊讶地发现这不起作用:console.log('Add City Row: '+(i+1));即使括号中有数学,它也将它们连接起来。
  • 很好地描述了为什么会发生这种情况。
【解决方案5】:
var divID = "question-" + (parseInt(i)+1);

使用此 + 运算符的行为与 concat 一样,这就是它显示 11 的原因。

【讨论】:

    【解决方案6】:

    简单到简单...如果没有在 HTML 中定义,每个输入类型都被视为字符串。因此,加号“+”运算符是连接的。

    使用 parseInt(i) 而不是“i”的值将被强制转换为整数。

    “+”运算符的作用类似于加法。

    在你的情况下这样做:-

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

    【讨论】:

    • 永远不要用数字调用parseInt,只能用字符串。 parseInt(1e100) === 1.
    【解决方案7】:

    由于您将数字连接到一个字符串上,因此整个事情都被视为一个字符串。当您想将数字相加时,您需要单独执行并将其分配给一个 var 并使用该 var,如下所示:

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

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

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

    编辑

    我早就应该添加这个,但基于 cmets,它也可以:

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

    【讨论】:

    • Number 不是必需的,只是括号。
    • 是的,看到这里的其他答案,我意识到了这一点。我肯定不是 js 大师。我以为您必须使用 Number 进行加法运算,但我应该知道。 JS 似乎能够“弄清楚”,这是该语言非常酷的方面之一。感谢您的评论。
    • 这非常适合我的需求。我有一个从文本输入分配的变量,而不是字符串文字。我在最初分配变量时使用Number,然后它不会导致其他东西被转换为字符串。
    【解决方案8】:

    你也可以用这个

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

    确保i 被转换为整数。

    【讨论】:

      【解决方案9】:

      括号建议失败的一个地方是如果说两个数字都是 HTML 输入变量。 假设 a 和 b 是变量,一个接收它们的值如下(我不是 HTML 专家,但我儿子遇到了这个问题,没有括号解决方案,即

      • HTML 输入是变量 a 和 b 的预期数值,因此输入是 2 和 3。
      • 以下给出字符串连接输出:a+b 显示 23; +a+b 显示 23; (a)+(b) 显示 23;
      • 根据上面的建议,我们尝试成功:Number(a)+Number(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 是首选。 + 不做加法时不是加法运算符。
      【解决方案10】:

      仅供参考:

      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 票的。
      • 唯一对我有用的解决方案,那些括号的东西在我的情况下不起作用。
      【解决方案11】:

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

      在您的情况下,“question-”和i 的连接首先发生给字符串“question=1”。然后另一个字符串与“1”连接给出“question-11”。

      您只需向解释器提示您想要的优先顺序。

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

      【讨论】:

        【解决方案12】:

        在数字周围使用大括号将被视为加法而不是连续。

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

        【讨论】:

          【解决方案13】:

          添加括号

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

          【讨论】:

            【解决方案14】:
            divID = "question-" + parseInt(i+1,10);
            

            check it here,这是一个 JSFiddle

            【讨论】:

            • 你不需要parseInt,只需要数字周围的括号。 jsfiddle.net/J8rvy
            • +1,只是在我自己的项目中遇到了很多整数问题,所以我现在使用 parseInt 太多了,呵呵
            • 永远不要用数字调用parseInt,只能用字符串。 parseInt(1e100) === 1.
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-12-09
            • 2014-09-28
            • 2015-06-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多