【问题标题】:All JavaScript Arithmetic Operators work except addition (+) [duplicate]除加法 (+) 外,所有 JavaScript 算术运算符都有效 [重复]
【发布时间】:2018-06-18 20:14:01
【问题描述】:

编辑:有几个线程建议作为答案,但任何一个线程的想法都没有奏效。我都试过了。

非常感谢您: 用户 Eazy 在他的建议中进一步评论解决了这个问题。事实证明,这样做的正确方法是将整个 paresInt 数学放在括号中:

List += "" + list[i].team + "" + (parseInt(list[i].wins) + parseInt(list[i].ties) + parseInt(list[i].lost)) ""

原问题:

所以我正在制作一个 js 代码来打印数据库中的表。该数据库包含一个足球联赛表,其中包含球队名称、赢球、平局和输球。当我将表格打印为 HTML 时,我想做数学计算来计算所玩的游戏和总分,因为数据库不提供信息。

最奇怪的是,如果我将表中的 (*) 值相乘,它就会起作用。如果我减去 (-) 或除 (/) 数字,它会起作用。但是,如果我尝试将数字与 + 相加,则代码会将数字视为字符串,并且只是将数字彼此相邻写入。我以前遇到过这个问题,我很困惑。解决方案可能很明显,但我就是想不通。

如果一支球队赢了 23 场比赛,平局 7 次,输了 3 次,那么加起来就是 33 场比赛。所以如果我做数学:

List += "<tr><td>" + list[i].team + "</td><td>" + 
list[i].wins + list[i].ties + list[i].lost + "</td></tr>"

返回 2373

如果我使用不同的运算符,例如乘法:

List += "<tr><td>" + list[i].team + "</td><td>" + 
list[i].wins * list[i].ties * list[i].lost + "</td></tr>"

它返回 483 wichs 是正确计算的,因此这些项目显然不是字符串。正如我所说,该代码适用于除 + 之外的所有其他运算符。这是为什么呢?

【问题讨论】:

  • 这些版本都不应该工作。您有一个 ) 没有匹配的 ( 并且您在 .lost 之后缺少 +
  • “代码将数字视为字符串”。不,它们确实是字符串,所有其他操作都强制转换为数字
  • 哦,抱歉,缺少的 + 和唯一的 )(我在尝试了 pareInt() 选项后不小心把它留在那里)是帖子中的拼写错误,而不是实际代码。

标签: javascript jquery operators


【解决方案1】:

JavaScript 的类型非常弱。它假定所有可能是字符串的内容 is 都是字符串,因此它将连接数字,因为加法是为字符串定义的。字符串没有定义乘除法和减法,所以编译器会先检查是否可以进行整数运算。

您可能希望使用parseInt() 函数来保证正确处理数字。

【讨论】:

  • 我尝试了 parseInt(list[i].wins) + 等,但没有任何效果。但这是一个语言功能,这令人非常不安:)
  • 这是弱类型的一个众所周知的缺点,但它的主要优点是在大多数情况下减少了编写代码的时间。在变量没有歧义的情况下,您不必考虑创建什么类型。权衡是这样的边缘情况,您必须明确声明您希望将其视为整数
  • 好吧,也许这是一个很好的权衡
【解决方案2】:

@Brandon Wyatt 告诉您的 parseInt() 的替代方法是将变量放在括号内。

const list = [
    {team: 'Team 1', wins: 5, ties: 3, lost: 2},
  {team: 'Team 2', wins: 2, ties: 3, lost: 5}
]

let content = "";
for (let i = 0; i < list.length; i++) {
    content += "<tr><td>" + list[i].team + "</td><td>" + (list[i].wins + list[i].ties + list[i].lost) + "</td></tr>";
}


document.getElementById("teams").innerHTML = content;

jsfiddle 这个解决方案: https://jsfiddle.net/j7nfqvmr/21/

【讨论】:

  • 数据来自 SQL 数据库,因此它以 ('Team1 ',23,7,3)、(Team2,16,10,7) 等形式出现。我已经使用循环和代码结构相同。这太奇怪了。
【解决方案3】:

我曾建议您使用parseInt() 将返回的值强制为整数。

所以你的代码可以是这样的:

List += "<tr><td>" + list[i].team + "</td><td>" + 
parseInt(list[i].wins) + parseInt(list[i].ties) + parseInt(list[i].lost) "</td></tr>"

【讨论】:

  • 我也想到了,已经试过了,没有任何效果——它仍然把它们当作字符串。我什至仔细检查并再次尝试,但没有成功。
  • 好的,我建议你用括号括起来(), List += "&lt;tr&gt;&lt;td&gt;" + list[i].team + "&lt;/td&gt;&lt;td&gt;" + (parseInt(list[i].wins) + parseInt(list[i].ties) + parseInt(list[i].lost)) "&lt;/td&gt;&lt;/tr&gt;"
  • 我相信,数学计算会先计算,括号()优先。
  • 这成功了!谢啦!我尝试了建议线程的所有可能变化,但没有一个技巧奏效。你拯救了我的一天:)
  • 很高兴能为您提供帮助 :)
猜你喜欢
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 2013-11-26
  • 2010-12-10
  • 1970-01-01
相关资源
最近更新 更多