【问题标题】:Why is this not a clear integer type and how to make it clear?为什么这不是一个明确的整数类型以及如何使其明确?
【发布时间】:2015-01-01 16:05:11
【问题描述】:

我有这个代码:

wallboard.data.Timer = function () {
    $("div[data-value]").each(function () {
        var time = $(this).attr("data-value");
        if (time > 0) {
            time += 1000;
            $(this).attr("data-value", time).text(TimeToText(time));
        }
    });
}

函数TimeToText() 只取一个毫秒值并将其输出为hour:seconds (00:00)

属性data-value 包含一个毫秒值并存储在变量time 中。

这是我的“调试”输出:

var time = $(this).attr("data-value"); 时间 = 4376

if (time > 0) { 为真,因为 4376 大于 0

time += 1000; 在这个“时间”之后是 43761000 - 她开始连接文本“4376”和“1000”,这证明 JavaScript 引擎认为时间是字符串类型。

如何明确时间应该是整数类型?

【问题讨论】:

  • 因为javascript中没有整数类型
  • 也许你可以使用javascript函数Number。例如。 var time = Number($(this).attr("data-value"));
  • @Kroltan 是的,可能是,但我也问了为什么 - 我只是忘记了它在我的身体 o_O。为什么 vm 不理解这是一个数字?对我们人类来说,这是一个很明显的数字,不是吗?
  • @Espen 因为这将是对约定的非常不愉快的偏离:在 JS 中,您尝试尽可能少地修改您的输出。然后,如果您想将两个数字字符串实际连接在一起,则必须做很多技巧才能做到这一点。我会在我的回答中解释更多。

标签: javascript jquery types


【解决方案1】:

您需要将attr()检索到的字符串转换为数字,例如

var time = +($(this).attr("data-value"));

【讨论】:

    【解决方案2】:

    可以使用一元加号运算符将字符串属性值转换为数字(也可以使用parseInt())

    var time = +$(this).attr("data-value");
    

    【讨论】:

      【解决方案3】:
      var time = $(this).attr("data-value");
      var timeInt = parseInt(time) + 1000;
      

      【讨论】:

      • parseInt(time, 10) 所以你不会得到八进制符号的奇怪结果。
      【解决方案4】:

      您可以通过一元 + 使用强制转换,或者将其包装在以 10 为底的 parseInt 中。

      wallboard.data.Timer = function () {
          $("div[data-value]").each(function () {
              var time = parseInt($(this).attr("data-value"), 10);
              if (time > 0) {
                  time += 1000;
                  $(this).attr("data-value", time).text(TimeToText(time));
              }
          });
      }
      

      此外,您可以搜索“javascript string to number”,您会找到数十亿条结果。

      编辑: 为什么不自动将数字字符串解释为数字?因为这将是对约定的非常不愉快的偏离:在 JS 中,您尝试尽可能少地修改您的输出。如果你想真正将两个数字字符串连接在一起,你必须做很多技巧才能做到这一点:

      你必须做这样的事情,而不是var a = "1000" + "10" 来获得"100010"

      var a = ["1000", "zz10"].join(""); // note the "zz", so it's not plain numeric.
      a = a.replace("zz", ""); // replace "zz" with nothing.
      // now `a` would be "100010"
      

      【讨论】:

      • 也许有道理。我只是在想 vm 应该与 time += 1000 和 time += "1000" 不同。并且这行代码应该提示类型比例以使 vm 认为时间是一个数字而不是一个字符串。但也许它只是不能中途改变类型......?
      • @Espen 可以,但是对于可能产生细微错误的东西来说,它的开销要大得多。数字加法是可交换的,字符串连接不是。最好假设如果剧本中有字符串,那将是一个串联。请记住,a += b 等同于 a = a + b。此外,保证 + 运算符的两边都明确地属于同一类型,这样更具可读性。简而言之,“因为标准是这样说的”。
      【解决方案5】:

      在加上 1000 之前,您应该将字符串转换为整数。

      var time =  parseInt($(this).attr("data-value"));
      

      【讨论】:

        猜你喜欢
        • 2010-10-17
        • 1970-01-01
        • 2017-02-15
        • 1970-01-01
        • 1970-01-01
        • 2020-11-04
        • 2014-11-18
        • 1970-01-01
        • 2012-09-27
        相关资源
        最近更新 更多