Javascript 为什么这不是一个清晰的整数类型,以及如何使其清晰?

Javascript 为什么这不是一个清晰的整数类型,以及如何使其清晰?,javascript,jquery,types,Javascript,Jquery,Types,我有以下代码: 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(

我有以下代码:

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)

属性
数据值
包含毫秒值,并存储在变量
时间

这是我的“调试”输出:

var time=$(this.attr(“数据值”)时间=4376

如果(时间>0){
为真,因为4376大于0

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


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

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

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

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

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

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


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


您可以通过一元数
+
使用强制,或者仅将其包装在以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字符串到数字”,您将发现数十亿个结果

编辑:为什么不自动将数字字符串解释为数字?因为这将是一个非常令人不快的偏离约定的行为:在JS中,您尝试尽可能少地修改输出。如果您想将两个数字字符串连接在一起,您必须进行大量的破解:

要获得
“100010”
,而不是
var a=“1000”+“10”
,您必须执行以下操作

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"

您可以通过一元数
+
使用强制,或者仅将其包装在以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字符串到数字”,您将发现数十亿个结果

编辑:为什么不自动将数字字符串解释为数字?因为这将是一个非常令人不快的偏离约定的行为:在JS中,您尝试尽可能少地修改输出。如果您想将两个数字字符串连接在一起,您必须进行大量的破解:

要获得
“100010”
,而不是
var a=“1000”+“10”
,您必须执行以下操作

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"

在将字符串与1000相加之前,应将其转换为整数

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

在将字符串与1000相加之前,应将其转换为整数

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

因为javascript中没有整数类型?可能您可以使用javascript函数Number。例如,var time=Number($(this).attr(“数据值”));可能是@Kroltan的复制品是的,可能是,但我也问了一个问题为什么——我只是把它忘在我的身体里了。为什么虚拟机不理解这是一个数字?对我们人类来说,这是一个数字,很明显,不是吗?@Espen,因为这将是一个非常不愉快的偏离惯例的行为:在JS中,你试图修改一点点这可能是您的输出。如果您想将两个数字字符串连接在一起,您必须进行大量的操作。我将在回答中详细解释。因为javascript中没有整数类型?可能您可以使用javascript函数Number。例如,var time=Number($(this).attr(“data value”));可能是@Kroltan的复制品是的,可能是,但我也问了一个问题为什么——我只是把它忘在我的身体里了。为什么虚拟机不理解这是一个数字?对我们人类来说,这是一个数字,很明显,不是吗?@Espen,因为这将是一个非常不愉快的偏离惯例的行为:在JS中,你试图修改一点点这可能是您的输出。如果您想将两个数字字符串连接在一起,您必须进行大量的操作。我将在回答中详细解释。
parseInt(time,10)
这样您就不会得到八进制表示法的奇怪结果。
parseInt(time,10)
所以八进制符号不会产生奇怪的结果。也许这是有意义的。我只是认为vm应该不同于time+=1000和time+=1000。这行代码应该改变类型规模,让vm认为时间是一个数字而不是一个字符串。但也许它不能中途更改类型…?@Espen它可以,但对于可能产生细微错误的东西来说,它的开销要大得多。数字相加是可交换的,字符串串联不是。最好假设如果e是剧中的字符串,它将是一个串联。请记住,
a+=b
相当于
a=a+b
。此外,它更易于阅读,可以明确地保证
+
运算符的两边都是相同的类型。简言之,“因为标准这么说”.也许有道理。我只是觉得虚拟机应该不同于time+=1000和time+=1000。这行代码应该改变类型规模,让vm认为时间是一个数字而不是一个字符串。但也许它不能中途更改类型…?@Espen它可以,但对于可能产生细微错误的东西来说,它的开销要大得多。数字相加是可交换的,字符串串联不是。最好假设如果e是剧中的字符串,它将是一个串联。请记住,
a+=b
相当于
a=a+b
。此外,它的可读性更高,可以明确保证
+
运算符的两边都是相同的类型。简言之,“因为标准这么说”。