Eu tenho um bug irritante em uma página da web:
date.GetMonth () não é uma função
Então, suponho que estou fazendo algo errado. A variável date
não é um objecto do tipo Date
. Como posso verificar um tipo de dados em Javascript? Tentei adicionar um if (date)
, mas não funciona.
function getFormatedDate(date) {
if (date) {
var month = date.GetMonth();
}
}
Então, se eu quiser escrever um código defensivo e impedir que a data (que não é uma) seja formatada, como faço isso?
Obrigado!
UPDATE: Não quero verificar o formato da data, mas quero ter certeza de que o parâmetro passado para o método getFormatedDate()
é do tipo Date
.
javascript
date
Martin
fonte
fonte
Invalid Date
: stackoverflow.com/a/44198641/5846045Respostas:
Como alternativa à digitação por pato via
você pode usar o
instanceof
operador, ou seja, mas também retornará true para datas inválidas, por exemplo,new Date('random_string')
também é instância de DateIsso falhará se os objetos forem passados através dos limites do quadro.
Uma solução alternativa para isso é verificar a classe do objeto via
fonte
window
ouself
); quadros diferentes têm seus próprios objetos globais e suas propriedades (isto é, globais) se referem a objetos distintos:Date
no quadro1 é um objeto de função diferente doDate
quadro2; o mesmo é verdadeiro paraDate.prototype
, que é a razão para oinstanceof
fracasso:Date.prototype
a partir frame1 não faz parte da cadeia de protótipos deDate
casos de frame2new Date('something') instanceof Date
retornatrue
no Chrome. Isso não vai funcionar então.Você pode usar o seguinte código:
fonte
instanceof
disparo falso negativo: jsbin.com/vufufoq/edit?html,js,consolePara verificar se o valor é um tipo válido do objeto JS-date padrão, você pode usar este predicado:
date
verifica se o parâmetro não foi um valor Falsas (undefined
,null
,0
,""
, etc ..)Object.prototype.toString.call(date)
retorna uma representação de string nativa do tipo de objeto especificado - no nosso caso"[object Date]"
. Comodate.toString()
substitui seu método pai , precisamos.call
ou.apply
o métodoObject.prototype
diretamente do qual ..instanceof
ouDate.prototype.isPrototypeOf
.!isNaN(date)
finalmente verifica se o valor não era umInvalid Date
.fonte
isNaN
pode ser usado para verificar aDate
. Isso é algum nível de inanidade do PHP.typeof Date.now() === "number"
, mas:typeof new Date() === "object"
. Mais realisticamente, porém, uma data é uma hora e um local no espaço.A função é
getMonth()
nãoGetMonth()
.De qualquer forma, você pode verificar se o objeto tem uma propriedade getMonth fazendo isso. Isso não significa necessariamente que o objeto é uma Data, apenas qualquer objeto que tenha uma propriedade getMonth.
fonte
if (date.getMonth && typeof date.getMonth === "function") {...}
Como indicado acima, provavelmente é mais fácil apenas verificar se a função existe antes de usá-la. Se você realmente se importa que seja um
Date
, e não apenas um objeto com umagetMonth()
função, tente o seguinte:Isso criará um clone do valor, se for um
Date
, ou criará uma data inválida. Você pode então verificar se o valor da nova data é inválido ou não.fonte
Object.prototype.toString.call(value) === '[object Date]'
) se for possível obter números. O método nesta resposta realmente informa se ovalue
é conversível em aDate
.Para todos os tipos, criei uma função de protótipo de objeto. Pode ser útil para você
Agora você pode verificar qualquer tipo como este:
[ Editar março de 2013 ] com base na percepção progressiva, este é um método melhor:
fonte
O UnderscoreJS e o Lodash têm uma função chamada
.isDate()
que parece ser exatamente o que você precisa. Vale a pena olhar para as respectivas implementações: Lodash isDate , UnderscoreJsfonte
A melhor maneira que encontrei é:
fonte
Você pode verificar se existe uma função específica para o objeto Date:
fonte
Em vez de todas as soluções alternativas, você pode usar o seguinte:
Eu achei esse hack melhor!
fonte
Além disso, você pode usar o formulário curto
ou algo parecido com isto:
fonte
Estou usando uma maneira muito mais simples, mas não tenho certeza se isso está disponível apenas no ES6 ou não.
No entanto, isso não funcionará em nulo ou indefinido, pois eles não têm construtor.
fonte
"Date"
também retorna, o que é tão arriscado quanto apenas verificar se o parâmetro temgetMonth
propriedade.Esta função retornará
true
se for Data oufalse
não:fonte
isDate(new (function AnythingButNotDate(){ })())
retornatrue
Ainda outra variante:
fonte
instanceof
.iWindow.Date.prototype.isPrototypeOf(iWindow.date); // true
iWindow.date instanceof iWindow.Date; // true
Uma abordagem usando uma tentativa / captura
fonte
Na verdade, a data será do tipo
Object
. Mas você pode verificar se o objeto temgetMonth
método e se é possível chamar.fonte
Também podemos validá-lo pelo código abaixo
fonte
function Date() {/*...*/}
é tambémDate
. Ou seja, simplesmente comparar a função construtora é muito propenso a erros, o que geralmente resulta em falsos positivos. Ignore o tipo de objeto definido pelo usuário com stackoverflow.com/a/44198641/5846045Inspirada nesta resposta , esta solução funciona no meu caso (eu precisava verificar se o valor recebido da API é uma data ou não):
Dessa forma, se houver alguma sequência aleatória proveniente de um cliente ou qualquer outro objeto, você poderá descobrir se é um objeto semelhante a uma Data.
fonte
Você não poderia simplesmente usar
fonte
isValid
métodoisValid
. Somente o moment.js possui essa API.