2013-12-19 4 views
0

Функция «плюс» («+»), похоже, имеет несколько функций для объектов типа даты в javascript. Следующий вход дает другой выход для + т:+ Оператор для дат в JavaScript

var t = new Date(); 
console.log('the date is '+t); 
console.log(+t); 

Более запутанным для меня является то, что она не превращается в millseconds здесь:

console.log(t+5); 

И особенно:

console.log(5+t); 

С :

console.log(+t+5); 

Я: он по-прежнему воспринимает пятерых как строки и что «+ t» семантически отличается от + t + 5 и t + 5.

Есть ли ссылка, где я могу найти, какие операторы имеют какое влияние на объекты Date? Таким образом, я могу получить некоторую уверенность в том, что множественность поведения для + реализуется одинаково в каждом браузере.

Быстрая скрипка: http://jsfiddle.net/yqQv7/

ответ

1

Унарный оператор «+» (+ x) - это просто способ преобразования выражения в число. Все остальные комбинации - это либо неявное число, либо преобразование строк. Специальной перегрузки оператора «+» для даты нет.

Ближе всего к полной справке о том, как именно Javascript операторы работают стандартный ECMAScript:

http://www.ecma-international.org/publications/standards/Ecma-262.htm

Для менее сложного обзора, вы можете захотеть взглянуть на ссылке Mozilla:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference#Operators

4

+new Date() таких же, как Number(new Date()). Он просто преобразуется в число с использованием преобразования типов.

+0

Нет, он не преобразует String в число в этом случае. – raina77ow

+0

@ raina77ow справа, исправлено :) – David

1

Вот важное замечание относительно + (оператором добавлений) в standard:

Нет и намека не предусмотрено в вызовах ToPrimitive [когда типа принуждении объект]. Все собственные объекты ECMAScript, кроме объектов Date, обрабатывают отсутствие подсказки, как если бы был указан номер подсказки; Объекты Date обрабатывают отсутствие подсказки, как если бы была указана строка подсказки.

И вот что происходит, когда вы пытаетесь оценить выражение new Date() + 5. Левый операнд должен стать Строкой, а не номером - и toString называется, а не valueOf.

Напротив, это ...

+new Date() + 5

... явно устанавливает тип левого операнда на номер (по телефону valueOf метод, который в случае Дата возвращения, что значение миллисекунды). Это делается до, оценивая двоичную операцию плюс, поскольку приоритет унарного плюса выше.


Как Замечание, порядок операндов в + операции не имеет значения в JS: t + 5 и 5 + t эквивалентны. И если t является строкой (или принудительно привязана к строкам), + будет рассматриваться как оператор конкатенации, а не дополнительный.

+0

Интересно. Но почему нет (5 + t), рассматриваемого как подсказка для того, чтобы дата была привязана по типу к Number? – Spork

+0

Потому что в противном случае операция '+' стала бы некоммутативной - и это считается большим злом при работе со слабыми типами. – raina77ow

+0

Итак, я думаю, 5 + (+ t)! Спасибо .. Теперь это имеет смысл. Я буду придерживаться Number() вместо унарного +. – Spork

Смежные вопросы