Saya memiliki bug yang mengganggu di halaman web:
date.GetMonth () bukan fungsi
Jadi, saya kira saya melakukan sesuatu yang salah. Variabel date
bukan objek bertipe Date
. Bagaimana saya bisa memeriksa datatype dalam Javascript? Saya mencoba menambahkan if (date)
, tetapi tidak berhasil.
function getFormatedDate(date) {
if (date) {
var month = date.GetMonth();
}
}
Jadi, jika saya ingin menulis kode defensif dan mencegah tanggal (yang bukan salah) diformat, bagaimana saya melakukannya?
Terima kasih!
UPDATE: Saya tidak ingin memeriksa format tanggal, tetapi saya ingin memastikan bahwa parameter yang dikirimkan ke metode getFormatedDate()
bertipe Date
.
javascript
date
Martin
sumber
sumber
Invalid Date
: stackoverflow.com/a/44198641/5846045Jawaban:
Sebagai alternatif untuk mengetik melalui bebek
Anda dapat menggunakan
instanceof
operator, yaitu Tapi itu akan mengembalikan true untuk tanggal yang tidak valid juga, misalnyanew Date('random_string')
juga merupakan contoh DateIni akan gagal jika objek melewati batas bingkai.
Solusi untuk ini adalah memeriksa kelas objek melalui
sumber
window
atauself
); frame yang berbeda memiliki objek global mereka sendiri, dan properti mereka (yaitu global) merujuk ke objek yang berbeda:Date
dalam frame1 adalah objek fungsi yang berbeda dariDate
pada frame2; hal yang sama berlaku untukDate.prototype
, yang merupakan alasaninstanceof
kegagalan:Date.prototype
dari frame1 bukan bagian dari rantai prototipeDate
contoh dari frame2new Date('something') instanceof Date
kembalitrue
di Chrome. Itu tidak akan berhasil kalau begitu.Anda dapat menggunakan kode berikut:
sumber
instanceof
pemicu false negative: jsbin.com/vufufoq/edit?html,js,consoleUntuk memeriksa apakah nilainya adalah tipe yang valid dari objek JS-date standar, Anda dapat menggunakan predikat ini:
date
memeriksa apakah parameter itu bukan nilai falsy (undefined
,null
,0
,""
, dll ..)Object.prototype.toString.call(date)
mengembalikan representasi string asli dari jenis objek yang diberikan - Dalam kasus kami"[object Date]"
. Karenadate.toString()
mengesampingkan metode induknya , kita perlu.call
atau.apply
metode dariObject.prototype
langsung yang ..instanceof
atauDate.prototype.isPrototypeOf
.!isNaN(date)
akhirnya memeriksa apakah nilainya bukanInvalid Date
.sumber
isNaN
bisa digunakan untuk mengecek aDate
. Itu beberapa level PHP yang tidak waras.typeof Date.now() === "number"
, tapi:typeof new Date() === "object"
. Lebih realistis lagi, kencan adalah waktu dan lokasi di luar angkasa.Fungsinya
getMonth()
bukanGetMonth()
.Lagi pula, Anda dapat memeriksa apakah objek memiliki properti getMonth dengan melakukan ini. Itu tidak selalu berarti objek adalah Tanggal, sembarang objek yang memiliki properti getMonth.
sumber
if (date.getMonth && typeof date.getMonth === "function") {...}
Seperti yang ditunjukkan di atas, mungkin paling mudah untuk hanya memeriksa apakah fungsi tersebut ada sebelum menggunakannya. Jika Anda benar-benar peduli bahwa itu adalah
Date
, dan bukan hanya objek dengangetMonth()
fungsi, coba ini:Ini akan membuat klon nilai jika itu adalah
Date
, atau membuat tanggal yang tidak valid. Anda kemudian dapat memeriksa apakah nilai tanggal yang baru tidak valid atau tidak.sumber
Object.prototype.toString.call(value) === '[object Date]'
) jika memungkinkan Anda akan mendapatkan nomor. Metode dalam jawaban ini benar-benar memberi tahu Anda apakahvalue
dapat dikonversi keDate
.Untuk semua tipe saya membuat fungsi prototipe Object. Ini mungkin berguna bagi Anda
Sekarang Anda dapat memeriksa semua jenis seperti ini:
[ Edit maret 2013 ] berdasarkan kemajuan wawasan, ini adalah metode yang lebih baik:
sumber
UnderscoreJS dan Lodash memiliki fungsi yang disebut
.isDate()
yang tampaknya persis apa yang Anda butuhkan. Layak untuk melihat implementasi masing-masing: Lodash isDate , UnderscoreJssumber
Cara terbaik yang saya temukan adalah:
sumber
Anda bisa memeriksa apakah ada fungsi khusus untuk objek Date:
sumber
Alih-alih semua solusi Anda dapat menggunakan yang berikut:
Saya menemukan retasan ini lebih baik!
sumber
Anda juga dapat menggunakan formulir pendek
atau sesuatu seperti ini:
sumber
Saya telah menggunakan cara yang jauh lebih sederhana tetapi saya tidak yakin apakah ini hanya tersedia di ES6 atau tidak.
Namun, ini tidak akan berfungsi pada nol atau tidak ditentukan karena mereka tidak memiliki konstruktor.
sumber
"Date"
juga kembali yang sama berisikonya dengan hanya memeriksa apakah parameter tersebut memilikigetMonth
properti.Fungsi ini akan kembali
true
jika itu Tanggal ataufalse
sebaliknya:sumber
isDate(new (function AnythingButNotDate(){ })())
kembalitrue
Varian lain:
sumber
instanceof
.iWindow.Date.prototype.isPrototypeOf(iWindow.date); // true
iWindow.date instanceof iWindow.Date; // true
Pendekatan menggunakan try / catch
sumber
Sebenarnya tanggal akan bertipe
Object
. Tetapi Anda dapat memeriksa apakah objek memilikigetMonth
metode dan apakah itu bisa dipanggil.sumber
Kami juga dapat memvalidasinya dengan kode di bawah ini
sumber
function Date() {/*...*/}
jugaDate
. Yaitu hanya membandingkan fungsi konstruktor terlalu rawan kesalahan yang sering menghasilkan positif palsu. Lewati tipe objek yang ditentukan pengguna dengan stackoverflow.com/a/44198641/5846045Terinspirasi oleh jawaban ini , solusi ini berfungsi dalam kasus saya (saya perlu memeriksa apakah nilai yang diterima dari API adalah tanggal atau tidak):
Dengan cara ini, jika itu adalah string acak yang berasal dari klien, atau objek lain, Anda dapat mengetahui apakah itu adalah objek seperti Date.
sumber
Tidak bisakah Anda menggunakan saja
sumber
isValid
metodeisValid
. Hanya moment.js yang memiliki API seperti itu.