为什么像字符串+数字+数字这样的加法会将数字连接成字符串?

问题描述 投票:0回答:10

好的,我正在编写一些代码片段来获取昨天的 ISO 日期格式值。

代码:

var dateString = new Date();

var yesterday = dateString.getFullYear();

    yesterday += "-"+dateString.getMonth()+1;

    yesterday += "-"+dateString.getDate()-1;

上面的代码输出2009-111-23。 它显然没有将 dateString.getMonth() 视为整数并在其末尾添加 1。

在 dateString.getDate() 前面添加“-”+是否会将 getDate() 转换为字符串?

这个作品得到了想要的结果。

var dateString = new Date();

var yesterday = dateString.getFullYear() + "-";

    yesterday += dateString.getMonth()+1+ "-";

    yesterday += dateString.getDate()-1;
//yesterday = 2009-12-22

虽然我不太喜欢它的样子……但没什么大不了的。

任何人都可以向我解释为什么 javascript 会这样吗?有什么解释为什么会发生这种情况吗?

javascript math
10个回答
13
投票

这是关于关联性。 + 运算符是左结合的,所以

"-"+dateString.getMonth() + 1

相同
("-"+dateString.getMonth()) + 1

在您想要首先计算的表达式两边加上括号:

"-" + (dateString.getMonth() + 1)

3
投票

获取代表“昨天”的日期值的正确方法是:

var today = new Date();
var yesterday = new Date(today.getTime() - (1000*60*60*24));

从那里您可以获得感兴趣的值,例如

yesterday.getDate()
,。


2
投票

这不起作用。 在任何一个月的第一天尝试一下,您会得到它报告“2009-12-0”就像昨天一样。

尝试这样的事情:

var mydate = new Date();
mydate.setDate(mydate.getDate()-1);
document.write(mydate.getFullYear() + "-" + (mydate.getMonth()+1) + "-" + mydate.getDate() );

1
投票

简而言之,JavaScript 是弱类型的。这意味着它直到运行时才确定 var 是文本还是数字。因此,操作顺序很重要。看起来其他海报都谈到了关联性。

请记住,JavaScript 是一种函数式语言,而不是面向对象的语言,因此没有您所知道的强制转换(尽管我认为可能有一些实用函数可以强制 JavaScript 将某些内容视为数字 - 我不记得了我的头顶)。


0
投票

是的,

"-" + dateString.getMonth()
转换为字符串,因为参数之一是字符串。 因此,当您添加 1 时,它只是附加到字符串中。 这并不奇怪——这就是几乎所有动态类型语言的工作方式。

使用括号应该有效:

    yesterday += "-"+(dateString.getMonth()+1);

    yesterday += "-"+(dateString.getDate()-1);

0
投票
var dateString = new Date();

var yesterday = dateString.getFullYear();

    yesterday += "-"+String(parseInt(dateString.getMonth())+1);

    yesterday += "-"+String(parseInt(dateString.getDate())-1);

0
投票

您已经正确理解了它——Javascript 首先评估赋值的右侧,看到“-”字符,并承诺其他所有内容都将转换为字符串值。

在您的第一个代码示例中,您可以通过使用括号来防止过早转换来获得您想要的内容,如下所示:

var dateString = new Date();
var yesterday = dateString.getFullYear();
yesterday += "-" + (dateString.getMonth() + 1);
yesterday += "-" + (dateString.getDate() - 1);

当然,您仍然会遇到一个问题,即报告月份中为零的天数 -

getDate()
不是零索引。 :)


0
投票

正如 Kieveli 提到的,这在本月的第一天不起作用。相反,获取自纪元以来的基本毫秒数并减去一天的值:

var dateobj = new Date();
var yesterdayms = dateobj.valueOf() - (24*60*60*1000);
var yesterdayobj = new Date(yesterdayms);
var yesterdaydatestring = yesterdayobj.getFullYear() + "-"
                        + (yesterdayobj.getMonth()+1) + "-"
                        + yesterdayobj.getDate();

0
投票

试试这个:

<script type="text/javascript">
var d = new Date();
document.writeln ("Today: " + d + "<br/>Yesterday:");
d.setDate(d.getDate()-1);
document.writeln (d);
</script>

编辑

或者这个:

<script type="text/javascript">
var d = new Date();
document.writeln ("Today: " +  (d.getDate()+1) + "-" + (d.getMonth()+1) + "-" + d.getFullYear() );
d.setDate(d.getDate()-1);
document.writeln ("<br/>Yesterday: " +  (d.getDate()+1) + "-" + (d.getMonth()+1) + "-" + d.getFullYear() );
</script>

0
投票

获取昨天的日期方法会更直接,而不是从今天的日期中减去值。

var d = new Date();
d.setDate(d.getDate()-1); //yesterday
var isodatestring= [d.getUTCFullYear(), 
d.getUTCMonth(),d.getUTCDate()].join('-');
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.