4

最近在玩 JS,发现了一些有趣的东西。这就是我在 chrome 控制台中写入的内容:

today = new Date()
-> Mon Apr 29 2013 13:06:01 GMT+0200 (CEST)
DAY = 1000 * 3600 * 24
-> 86400000
today - 2 * DAY
-> 1367060761452
today + 2 * DAY
-> "Mon Apr 29 2013 13:06:01 GMT+0200 (CEST)172800000"

而且我想知道为什么我会根据操作类型得到不同类型的答案 - 加/减。当我做这样的事情时:

today - (-2) * DAY

一切安好。是否有任何意识形态,或者它是一个错误?

4

4 回答 4

3

today + 2 * DAY 使用字符串连接。如果您想正确执行此操作,请使用 today.getTime()。

例子:

tomorrow = new Date()
tomorrow.setTime(today.getTime() + DAY)
于 2013-04-30T09:04:33.397 回答
2

For -,即减号运算符,使用.valueOf日期对象的方法。

而 for +,这首先被认为是字符串连接。

today - 2 * DAY被认为是today.valueOf() - 2 * DAY

today + 2 * DAY被认为是today.toString() + 2 * DAY

因此,如果您想对日期对象使用数学运算,请使用today.getTime()而不是仅使用today.

于 2013-04-30T09:03:53.600 回答
2

在规范中找到这有点棘手,因为它与其余的Date东西无关。

如果您查看第 11.6.1 节“加法运算符”,您会发现以下注释:

注意 1 在第 5 步和第 6 步中对 ToPrimitive 的调用中没有提供任何提示。除 Date 对象之外的所有本机 ECMAScript 对象都处理没有提示的情况,就好像给出了提示 Number 一样;日期对象处理提示的缺失,就像给出了提示字符串一样。宿主对象可以以其他方式处理提示的缺失。

在上下文中,这意味着对+Date 对象使用加法运算符 ( ) 将使用字符串值而不是数值。从这个意义上说,Date 对象是特殊的,并且不同于任何其他类型的对象。

请注意,减法运算符没有这样的例外,因为它是明确的——它只适用于数字减法;它不适用于字符串。

另请注意,这适用于加法运算符,+两边都有操作数。一元“加号”运算符不能这样工作,因此+myDateObj左侧没有任何内容将导致数值。

于 2013-04-30T09:15:33.233 回答
0

我认为像这样在javascript日期中添加和减去天数

var today= new Date();
var addDay=30;
today.setDate(today.getDate()+addDay);

现在今天指向从今天开始的下一个第 30 天

于 2013-04-30T09:41:45.927 回答