Добавить дни в JavaScript Date

Мастерский ответ Эрика Липперта, тем не менее, не очень полезен, потому что речь идет о другом языке. Это Java, где спецификация языка Java является окончательным описанием семантики. В частности, §15.26.1 имеет значение, поскольку описывает порядок оценки для оператора = (все мы знаем, что он право-ассоциативный, да?). Немного отредактируем бит, который нам нужен в этом вопросе:

Если выражение левого операнда является выражением доступа к массиву ( §15.13 ), то требуются многие шаги:

  • Сначала оценивается подвыражение ссылки массива выражения доступа к элементу управления левой рукой. Если эта оценка завершается внезапно, то выражение присваивания резко завершается по той же причине; подвыражение индекса (из выражения доступа к левому полюсу операнда) и правый операнд не оцениваются и не происходит присвоение.
  • В противном случае подвыражение индекса для выражения доступа к элементу слева для операнда оценены. Если эта оценка завершается внезапно, то выражение присваивания резко завершается по той же причине, и правый операнд не оценивается и не выполняется присвоение.
  • В противном случае оценивается правый операнд. Если эта оценка завершается внезапно, выражение присваивания резко завершается по той же причине и не происходит никакого присваивания.
blockquote>

[... далее далее описывается фактическое значение задания сам, который мы можем здесь проигнорировать для краткости ...]

Короче говоря, Java имеет очень строго определенный порядок оценки , который почти точно слева направо в пределах аргументов любой вызов оператора или метода. Назначения массивов являются одним из наиболее сложных случаев, но даже там он все еще L2R. (JLS рекомендует, чтобы вы не писали код, который нуждается в этих типах сложных семантических ограничений , и я тоже: вы можете получить более чем достаточно проблем только с одним присваиванием за оператор!)

C и C ++ определенно отличаются от Java в этой области: их определения языка оставляют порядок оценки неопределенным намеренно, чтобы обеспечить большую оптимизацию. C # похож на Java, но я не знаю его литературы достаточно хорошо, чтобы иметь возможность указать на формальное определение. (Это действительно зависит от языка, хотя Ruby - это строго L2R, как и Tcl - хотя у него отсутствует оператор присваивания per se по причинам, не имеющим значения здесь - и Python - L2R, но R2L в отношении , который я нахожу странным, но там вы идете.)

917
задан John Slegers 16 April 2018 в 09:02
поделиться

3 ответа

Можно создать один with:-

Date.prototype.addDays = function(days) {
    var date = new Date(this.valueOf());
    date.setDate(date.getDate() + days);
    return date;
}

var date = new Date();

alert(date.addDays(5));

, Это заботится об автоматическом постепенном увеличении месяца при необходимости. Например:

8/31 + 1 день станет 9/1.

проблема с использованием setDate непосредственно состоит в том, что это - мутатор, и такой вещи лучше всего избегают. ECMA счел целесообразным рассматривать Date как изменяемый класс, а не неизменная структура.

1072
ответ дан ʇolɐǝz ǝɥʇ qoq 16 April 2018 в 19:02
поделиться
var today = new Date();
var tomorrow = new Date();
tomorrow.setDate(today.getDate()+1);

Быть осторожным, потому что это может быть хитро. При установке "завтра", это только работает, потому что это - соответствия текущего значения год и месяц для "сегодня". Однако установка на число даты как "32" обычно будет все еще работать просто великолепно для перемещения его в следующий месяц.

170
ответ дан Joel Coehoorn 16 April 2018 в 19:02
поделиться

Расширение прототипа в javascript не может быть хорошей идеей , особенно в профессиональных кодовых базах.

то, Что Вы хотите сделать, расширяют собственный компонент Date класс:

class MyCustomDate extends Date {

  addDays(days) {
    const date = new MyCustomDate(this.valueOf());
    date.setDate(date.getDate() + days);
    return date;
  }
  
}

const today = new MyCustomDate();

const nextWeek = today.addDays(7)

console.log(nextWeek)

Таким образом, если однажды JavaScript реализует собственный компонент addDays метод, Вы ничего не повредите.

2
ответ дан 19 December 2019 в 20:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: