【发布时间】:2011-08-23 02:11:48
【问题描述】:
为什么当我使用这个时:(假设i = 1)
divID = "question-" + i+1;
我得到 question-11 而不是 question-2?
【问题讨论】:
-
javascript 首先将 i 的值添加到字符串,然后添加 1
标签: javascript math
为什么当我使用这个时:(假设i = 1)
divID = "question-" + i+1;
我得到 question-11 而不是 question-2?
【问题讨论】:
标签: javascript math
另一种选择是使用:
divID = "question-" + (i - -1);
减负和加是一样的,不能用减号串联
编辑:忘记了括号仍然是必需的,因为代码是从左到右读取的。
【讨论】:
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 是数字,+ 应该总是做加法。
必须注意i 是一个整数类型的变量。在javaScript中,我们在声明变量时不指定数据类型,但是我们的初始化可以保证我们的变量是特定的数据类型。
初始化声明变量是一个好习惯:
var num = 0;
var str = "";
即使您的i 变量是整数,+ 运算符也可以执行连接而不是加法。
在您的问题的情况下,您假设i = 1,为了获得2 以及1,请尝试使用(i-1+2)。不需要使用()-括号。
-(减号运算符)不能被误解,你不会得到意想不到的结果。
【讨论】:
i - 1 + 2;如果i 不是数字,请改用Number 函数。
改用这个:
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;
var divID = "question-" + (parseInt(i)+1);
使用此 + 运算符的行为与 concat 一样,这就是它显示 11 的原因。
【讨论】:
简单到简单...如果没有在 HTML 中定义,每个输入类型都被视为字符串。因此,加号“+”运算符是连接的。
使用 parseInt(i) 而不是“i”的值将被强制转换为整数。
“+”运算符的作用类似于加法。
在你的情况下这样做:-
divID = "question-" + parseInt(i)+1;
【讨论】:
parseInt,只能用字符串。 parseInt(1e100) === 1.
由于您将数字连接到一个字符串上,因此整个事情都被视为一个字符串。当您想将数字相加时,您需要单独执行并将其分配给一个 var 并使用该 var,如下所示:
i = i + 1;
divID = "question-" + i;
或者你需要像这样指定数字加法:
divID = "question-" + Number(i+1);
编辑
我早就应该添加这个,但基于 cmets,它也可以:
divID = "question-" + (i+1);
【讨论】:
Number 不是必需的,只是括号。
Number,然后它不会导致其他东西被转换为字符串。
你也可以用这个
divID = "question-" + (i*1+1);
确保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 是首选。 + 不做加法时不是加法运算符。
仅供参考:
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 票的。
你得到这个的原因是运算符的优先顺序,以及+ 用于连接字符串以及执行数字加法的事实。
在您的情况下,“question-”和i 的连接首先发生给字符串“question=1”。然后另一个字符串与“1”连接给出“question-11”。
您只需向解释器提示您想要的优先顺序。
divID = "question-" + (i+1);
【讨论】:
在数字周围使用大括号将被视为加法而不是连续。
divID = "question-" + (i+1)
【讨论】:
添加括号
divID = "question-" + (i+1);
【讨论】:
divID = "question-" + parseInt(i+1,10);
check it here,这是一个 JSFiddle
【讨论】:
parseInt,只需要数字周围的括号。 jsfiddle.net/J8rvy
parseInt,只能用字符串。 parseInt(1e100) === 1.