Tengo un error molesto en una página web:
date.GetMonth () no es una función
Entonces, supongo que estoy haciendo algo mal. La variable date
no es un objeto de tipo Date
. ¿Cómo puedo verificar un tipo de datos en Javascript? Intenté agregar un if (date)
, pero no funciona.
function getFormatedDate(date) {
if (date) {
var month = date.GetMonth();
}
}
Entonces, si quiero escribir código defensivo y evitar que se formatee la fecha (que no es una), ¿cómo hago eso?
¡Gracias!
ACTUALIZACIÓN: No quiero verificar el formato de la fecha, pero quiero estar seguro de que el parámetro pasado al método getFormatedDate()
es de tipo Date
.
javascript
date
Martín
fuente
fuente
Invalid Date
: stackoverflow.com/a/44198641/5846045Respuestas:
Como alternativa al tipeo de pato a través de
puede usar el
instanceof
operador, es decir, pero también devolverá verdadero para fechas no válidas, por ejemplo,new Date('random_string')
también es instancia de FechaEsto fallará si los objetos se pasan a través de los límites del marco.
Una solución para esto es verificar la clase del objeto a través de
fuente
window
oself
); los diferentes marcos tienen sus propios objetos globales, y sus propiedades (es decir, globales) se refieren a objetos distintos:Date
en frame1 es un objeto de función diferente queDate
en frame2; lo mismo es cierto paraDate.prototype
, que es la razón de lainstanceof
falla:Date.prototype
desde frame1 no es parte de la cadena deDate
instancias prototipo desde frame2new Date('something') instanceof Date
Vuelvetrue
en Chrome. Eso no funcionará entonces.Puedes usar el siguiente código:
fuente
instanceof
desencadenante falso negativo: jsbin.com/vufufoq/edit?html,js,consolePara verificar si el valor es un tipo válido del objeto JS-date estándar, puede hacer uso de este predicado:
date
comprueba si el parámetro no era un valor Falsy (undefined
,null
,0
,""
, etc ..)Object.prototype.toString.call(date)
devuelve una representación de cadena nativa del tipo de objeto dado: en nuestro caso"[object Date]"
. Debido a quedate.toString()
anula su método principal , necesitamos.call
o.apply
el métodoObject.prototype
directamente desde el cual ...instanceof
oDate.prototype.isPrototypeOf
.!isNaN(date)
finalmente comprueba si el valor no era unInvalid Date
.fuente
isNaN
se puede usar para verificar aDate
. Ese es un nivel de locura PHP.typeof Date.now() === "number"
pero:typeof new Date() === "object"
. Sin embargo, de manera más realista, una fecha es una hora y una ubicación en el espacio.La función es
getMonth()
, noGetMonth()
.De todos modos, puede verificar si el objeto tiene una propiedad getMonth haciendo esto. No significa necesariamente que el objeto sea una Fecha, solo cualquier objeto que tenga una propiedad getMonth.
fuente
if (date.getMonth && typeof date.getMonth === "function") {...}
Como se indicó anteriormente, probablemente sea más fácil verificar si la función existe antes de usarla. Si realmente te importa que sea un
Date
, y no solo un objeto con unagetMonth()
función, prueba esto:Esto creará un clon del valor si es a
Date
, o creará una fecha no válida. Luego puede verificar si el valor de la nueva fecha no es válido o no.fuente
Object.prototype.toString.call(value) === '[object Date]'
) si es posible obtendrá números. El método en esta respuesta realmente te dice si elvalue
es convertible a aDate
.Para todos los tipos, preparé una función de prototipo de objeto. Puede ser de utilidad para usted
Ahora puede verificar cualquier tipo como este:
[ Editar marzo de 2013 ] basado en una visión progresiva, este es un mejor método:
fuente
UnderscoreJS y Lodash tienen una función llamada
.isDate()
que parece ser exactamente lo que necesita. Vale la pena mirar sus respectivas implementaciones: Lodash isDate , UnderscoreJsfuente
La mejor manera que encontré es:
fuente
En lugar de todas las soluciones, puede usar lo siguiente:
¡Encontré este truco mejor!
fuente
Puede verificar si existe una función específica para el objeto Fecha:
fuente
También puedes usar forma corta
o algo como esto:
fuente
He estado usando una forma mucho más simple, pero no estoy seguro de si esto solo está disponible en ES6 o no.
Sin embargo, esto no funcionará en nulo o indefinido ya que no tienen constructor.
fuente
"Date"
También se devuelve cualquier objeto personalizado con el nombre de constructor "Fecha", que es tan arriesgado como simplemente verificar si el parámetro tienegetMonth
propiedad.Esta función volverá
true
si es Fecha ofalse
no:fuente
isDate(new (function AnythingButNotDate(){ })())
regresatrue
Otra variante más:
fuente
instanceof
.iWindow.Date.prototype.isPrototypeOf(iWindow.date); // true
iWindow.date instanceof iWindow.Date; // true
Un enfoque usando un try / catch
fuente
En realidad la fecha será de tipo
Object
. Pero puede verificar si el objeto tienegetMonth
método y si es invocable.fuente
También podemos validarlo con el siguiente código
fuente
function Date() {/*...*/}
es tambiénDate
. Es decir, simplemente comparar la función del constructor es demasiado propenso a errores, lo que a menudo resulta en falsos positivos.Inspirada en esta respuesta , esta solución funciona en mi caso (necesitaba verificar si el valor recibido de la API es una fecha o no):
De esta manera, si se trata de una cadena aleatoria proveniente de un cliente o de cualquier otro objeto, puede averiguar si es un objeto tipo Fecha.
fuente
¿No podrías simplemente usar
fuente
isValid
métodoisValid
. Solo moment.js tiene esa API.