Mam irytujący błąd na stronie:
date.GetMonth () nie jest funkcją
Przypuszczam więc, że robię coś złego. Zmienna date
nie jest obiektem typu Date
. Jak mogę sprawdzić typ danych w JavaScript? Próbowałem dodać if (date)
, ale to nie działa.
function getFormatedDate(date) {
if (date) {
var month = date.GetMonth();
}
}
Jeśli więc chcę napisać kod obronny i uniemożliwić sformatowanie daty (która nie jest jedną), jak to zrobić?
Dzięki!
AKTUALIZACJA: Nie chcę sprawdzać formatu daty, ale chcę mieć pewność, że parametr przekazany do metody getFormatedDate()
jest typu Date
.
javascript
date
Jaskółka oknówka
źródło
źródło
Invalid Date
: stackoverflow.com/a/44198641/5846045Odpowiedzi:
Jako alternatywa dla pisania kaczką przez
możesz użyć
instanceof
operatora, tzn. Ale zwróci on również prawdę dla niepoprawnych dat, np.new Date('random_string')
jest także instancją DateNie powiedzie się, jeśli obiekty zostaną przekroczone przez granice ramek.
Obejściem tego problemu jest sprawdzenie klasy obiektu za pomocą
źródło
window
lubself
); różne ramki mają swoje własne obiekty globalne, a ich właściwości (tj. globale) odnoszą się do odrębnych obiektów:Date
w frame1 jest innym obiektem funkcji niżDate
w frame2; to samo dotyczyDate.prototype
, co jest przyczynąinstanceof
niepowodzenia:Date.prototype
z klatki 1 nie jest częścią prototypowego łańcuchaDate
instancji z klatki 2new Date('something') instanceof Date
powracatrue
w Chrome. To nie zadziała.Możesz użyć następującego kodu:
źródło
instanceof
wyzwalania fałszywego negatywu: jsbin.com/vufufoq/edit?html,js,consoleAby sprawdzić, czy wartość jest poprawnym typem standardowego obiektu JS-date, możesz użyć tego predykatu:
date
sprawdza czy parametr nie był wartość falsy (undefined
,null
,0
,""
, itp ..)Object.prototype.toString.call(date)
zwraca natywną reprezentację ciągu danego typu obiektu - w naszym przypadku"[object Date]"
. Ponieważdate.toString()
przesłania metodę nadrzędną , musimy.call
lub.apply
metodę, zObject.prototype
której bezpośrednio…instanceof
lubDate.prototype.isPrototypeOf
.!isNaN(date)
w końcu sprawdza, czy wartość nie byłaInvalid Date
.źródło
isNaN
można wykorzystać do sprawdzeniaDate
. To jakiś poziom niepoczytalności PHP.typeof Date.now() === "number"
, ale:typeof new Date() === "object"
. Bardziej realistycznie jednak data to czas i miejsce w przestrzeni.Ta funkcja to
getMonth()
nieGetMonth()
.W każdym razie możesz sprawdzić, czy obiekt ma właściwość getMonth, wykonując tę czynność. Nie musi to oznaczać, że obiekt jest datą, tylko każdy obiekt, który ma właściwość getMonth.
źródło
if (date.getMonth && typeof date.getMonth === "function") {...}
Jak wskazano powyżej, prawdopodobnie najłatwiej jest po prostu sprawdzić, czy funkcja istnieje przed użyciem. Jeśli naprawdę zależy Ci na tym, aby był to obiekt
Date
, a nie tylko obiekt zgetMonth()
funkcją, spróbuj tego:Spowoduje to utworzenie klonu wartości, jeśli jest
Date
, lub utworzenie niepoprawnej daty. Następnie możesz sprawdzić, czy wartość nowej daty jest nieprawidłowa, czy nie.źródło
Object.prototype.toString.call(value) === '[object Date]'
), jeśli to możliwe, będziesz otrzymywać liczby. Metoda w tej odpowiedzi naprawdę mówi, czyvalue
można ją przekonwertować naDate
.Dla wszystkich typów przygotowałem funkcję prototypu Object. Może ci się przydać
Teraz możesz sprawdzić dowolny typ tego typu:
[ Edytuj marzec 2013 ] w oparciu o postęp wglądu jest to lepsza metoda:
źródło
UnderscoreJS i Lodash mają wywoływaną funkcję,
.isDate()
która wydaje się być dokładnie tym, czego potrzebujesz. Warto przyjrzeć się ich implementacjom: Lodash isDate , UnderscoreJsźródło
Najlepszy sposób, jaki znalazłem, to:
źródło
Możesz sprawdzić, czy istnieje funkcja specyficzna dla obiektu Date:
źródło
Zamiast wszystkich obejść można użyć następujących opcji:
Znalazłem ten hack lepiej!
źródło
Możesz także użyć krótkiego formularza
lub coś w tym stylu:
źródło
Korzystałem z dużo prostszego sposobu, ale nie jestem pewien, czy jest to dostępne tylko w ES6, czy nie.
Nie będzie to jednak działać w przypadku wartości NULL lub niezdefiniowanej, ponieważ nie mają one konstruktora.
źródło
"Date"
również dowolny obiekt niestandardowy o nazwie konstruktora „Data”, co jest tak ryzykowne, jak samo sprawdzenie, czy parametr magetMonth
właściwość.Ta funkcja zwróci,
true
jeśli jest to data lub wfalse
inny sposób:źródło
isDate(new (function AnythingButNotDate(){ })())
zwrotytrue
Jeszcze inny wariant:
źródło
instanceof
.iWindow.Date.prototype.isPrototypeOf(iWindow.date); // true
iWindow.date instanceof iWindow.Date; // true
Podejście wykorzystujące try / catch
źródło
W rzeczywistości data będzie typu
Object
. Ale możesz sprawdzić, czy obiekt magetMonth
metodę i czy można ją wywoływać.źródło
Możemy to również sprawdzić za pomocą poniższego kodu
źródło
function Date() {/*...*/}
jest równieżDate
. Tj. Zwykłe porównanie funkcji konstruktora jest zbyt podatne na błędy, co często skutkuje fałszywymi trafieniami.Zainspirowane tą odpowiedzią , to rozwiązanie działa w moim przypadku (musiałem sprawdzić, czy wartość otrzymana z API jest datą, czy nie):
W ten sposób, jeśli jest to dowolny ciąg losowy pochodzący od klienta lub dowolnego innego obiektu, możesz dowiedzieć się, czy jest to obiekt podobny do daty.
źródło
Nie możesz po prostu użyć
źródło
isValid
metoda ma tylko obiekt datyisValid
. Tylko moment.js ma taki interfejs API.