У меня есть раздражающая ошибка на веб-странице:
date.GetMonth () не является функцией
Итак, я полагаю, что я делаю что-то не так. Переменная date
не является объектом типа Date
. Как я могу проверить тип данных в Javascript? Я пытался добавить if (date)
, но это не работает.
function getFormatedDate(date) {
if (date) {
var month = date.GetMonth();
}
}
Итак, если я хочу написать защитный код и предотвратить форматирование даты (не одной), как мне это сделать?
Спасибо!
ОБНОВЛЕНИЕ: я не хочу проверять формат даты, но я хочу быть уверен, что параметр, переданный методу, getFormatedDate()
имеет тип Date
.
javascript
date
Мартин
источник
источник
Invalid Date
: stackoverflow.com/a/44198641/5846045Ответы:
Как альтернатива печатанию утки через
вы можете использовать
instanceof
оператор, т. е. но он также вернет true для недопустимых дат, напримерnew Date('random_string')
, также является экземпляром DateЭто не удастся, если объекты будут переданы через границы кадра.
Обходным путем для этого является проверка класса объекта с помощью
источник
window
илиself
); разные фреймы имеют свои собственные глобальные объекты, и их свойства (т. е. глобальные) относятся к разным объектам:Date
в frame1 есть другой объект функции, чемDate
в frame2; то же самое верно дляDate.prototype
, что является причинойinstanceof
сбоя:Date.prototype
из frame1 не является частью цепочки прототиповDate
экземпляров из frame2new Date('something') instanceof Date
возвращаетсяtrue
в Chrome. Это не сработает тогда.Вы можете использовать следующий код:
источник
instanceof
запуска ложного негатива: jsbin.com/vufufoq/edit?html,js,consoleЧтобы проверить, является ли значение допустимым типом стандартного объекта JS-date, вы можете использовать этот предикат:
date
проверяет , не был ли параметр а falsy значение (undefined
,null
,0
,""
и т.д ..)Object.prototype.toString.call(date)
возвращает нативное строковое представление заданного типа объекта - в нашем случае"[object Date]"
. Посколькуdate.toString()
переопределяет его родительский метод , нам нужно.call
или.apply
методObject.prototype
непосредственно из которого ..instanceof
илиDate.prototype.isPrototypeOf
.!isNaN(date)
наконец проверяет, не было ли значениеInvalid Date
.источник
isNaN
можно использовать для проверкиDate
. Это какой-то уровень безразличия в PHP.typeof Date.now() === "number"
, но:typeof new Date() === "object"
. Более реалистично, однако, дата - это время и место в пространстве.Функция есть
getMonth()
, нетGetMonth()
.В любом случае, вы можете проверить, имеет ли объект свойство getMonth, выполнив это. Это не обязательно означает, что объект является Date, просто любой объект, который имеет свойство getMonth.
источник
if (date.getMonth && typeof date.getMonth === "function") {...}
Как указано выше, вероятно, проще всего просто проверить, существует ли функция перед ее использованием. Если вам действительно важно, что это
Date
не объект сgetMonth()
функцией, попробуйте следующее:Это создаст либо клон значения, если оно есть
Date
, либо создаст недопустимую дату. Затем вы можете проверить, является ли значение новой даты недействительным или нет.источник
Object.prototype.toString.call(value) === '[object Date]'
), если возможно, что вы будете получать цифры. Метод в этом ответе действительно говорит вам, можно лиvalue
преобразовать в aDate
.Для всех типов я подготовил функцию-прототип Object. Это может быть полезно для вас
Теперь вы можете проверить любой тип как это:
[ Изменить март 2013 ], основываясь на прогрессивном понимании, это лучший метод:
источник
UnderscoreJS и Lodash имеют функцию,
.isDate()
которая называется именно то, что вам нужно. Стоит посмотреть на их соответствующие реализации: Lodash isDate , UnderscoreJsисточник
Лучший способ, который я нашел, это:
источник
Вместо всех обходных путей вы можете использовать следующее:
Я нашел этот взлом лучше!
источник
Вы можете проверить, существует ли функция, специфичная для объекта Date:
источник
Также вы можете использовать короткую форму
или что-то вроде этого:
источник
Я использовал гораздо более простой способ, но не уверен, доступен ли он только в ES6 или нет.
Тем не менее, это не будет работать с нулевым или неопределенным, поскольку у них нет конструктора.
источник
"Date"
тоже возвращает, что так же рискованно, как просто проверка, имеет ли параметрgetMonth
свойство.Эта функция вернет,
true
если это Date илиfalse
иначе:источник
isDate(new (function AnythingButNotDate(){ })())
возвращаетсяtrue
Еще один вариант:
источник
instanceof
.iWindow.Date.prototype.isPrototypeOf(iWindow.date); // true
iWindow.date instanceof iWindow.Date; // true
Подход с использованием try / catch
источник
На самом деле дата будет иметь тип
Object
. Но вы можете проверить, есть ли у объектаgetMonth
метод и можно ли его вызвать.источник
Мы также можем подтвердить это с помощью кода ниже
источник
function Date() {/*...*/}
такжеDate
. Т.е. простое сравнение функции конструктора слишком подвержено ошибкам, что часто приводит к ложным срабатываниям. Обход пользовательского типа объекта с помощью stackoverflow.com/a/44198641/5846045Вдохновленный этим ответом , это решение работает в моем случае (мне нужно было проверить, является ли значение, полученное из API, датой или нет):
Таким образом, если это какая-то случайная строка, исходящая от клиента или любого другого объекта, вы можете узнать, является ли это объектом типа даты.
источник
Не могли бы вы просто использовать
источник
isValid
методisValid
. Только момент.js имеет такой API.