Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
奇怪的javascript算术行为(是的,这是意料之中的)_Javascript_Math - Fatal编程技术网

奇怪的javascript算术行为(是的,这是意料之中的)

奇怪的javascript算术行为(是的,这是意料之中的),javascript,math,Javascript,Math,好的,我正在编写一个小代码片段来获取昨天的ISO日期格式值 代码: 上述代码输出2009-111-23。显然,它没有将dateString.getMonth()视为一个intiger并在其末尾加上1 在dateString.getDate()前面加上“-”+,是否会将getDate()转换为字符串 这项工作得到了预期的结果 var dateString = new Date(); var yesterday = dateString.getFullYear() + "-"; yest

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

代码:

上述代码输出2009-111-23。显然,它没有将dateString.getMonth()视为一个intiger并在其末尾加上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会这样做?为什么会发生这种情况,有什么解释吗

它不起作用。在任何一个月的第一个月试用,你都会看到它像昨天一样报道“2009-12-0”

试着这样做:

var mydate = new Date();
mydate.setDate(mydate.getDate()-1);
document.write(mydate.getFullYear() + "-" + (mydate.getMonth()+1) + "-" + mydate.getDate() );
这是关于运算符是左关联的,所以

"-"+dateString.getMonth() + 1

("-"+dateString.getMonth()) + 1
在要首先计算的表达式周围加上括号:

"-" + (dateString.getMonth() + 1)
是,
“-”+dateString.getMonth()
强制转换为字符串,因为其中一个参数是字符串。因此,当您添加1时,它只是附加到字符串中。这并不奇怪——几乎每种动态类型语言都是这样工作的

使用括号应该可以:

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

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

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

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

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

当然,您仍然会遇到一个问题,即您报告的月份天数为零--
getDate()
不是零索引的。:)

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


请记住,JavaScript是一种函数式语言,不是面向对象的语言,因此没有您所知道的强制转换(尽管我认为可能有一些实用程序函数迫使JavaScript将某个东西视为一个数字-我记不得了)。

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


从那里您可以获得感兴趣的值,如
昨天.getDate()
,。

正如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();
试试这个:

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

var d=新日期();
document.writeln(“今天:+d+”
昨天:); d、 setDate(d.getDate()-1); 书面文件n(d);
编辑

或者这个:

<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>

var d=新日期();
document.writeln(“今天:”+(d.getDate()+1)+“-”+(d.getMonth()+1)+“-”+d.getFullYear());
d、 setDate(d.getDate()-1);
document.writeln(“
昨天:”+(d.getDate()+1)+“-”+(d.getMonth()+1)+“-”+d.getFullYear());
更直接的方法是获取昨天的日期方法,而不是从今天的日期中减去值

var d = new Date();
d.setDate(d.getDate()-1); //yesterday
var isodatestring= [d.getUTCFullYear(), 
d.getUTCMonth(),d.getUTCDate()].join('-');

好电话。。。我会想办法的——有效与否。为什么会这样?你可能应该在评论栏下发布类似的内容。。。正确的?(此网站新手…不确定这是否是常见做法)您正在考虑
Number()
。谢谢-如果是本月的第一天,这会说明问题吗?是的。您要做的是将“今天”表示为自纪元以来的毫秒数,减去一天中的毫秒数,然后使用日期构造函数为您完成其余的工作。这是一个更好的处理日期算术的方法,而不是自己尝试特殊情况下的所有事情。我认为如果是本月的第一天,这将无法正常工作。。。可能是错的
<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>
var d = new Date();
d.setDate(d.getDate()-1); //yesterday
var isodatestring= [d.getUTCFullYear(), 
d.getUTCMonth(),d.getUTCDate()].join('-');