J'ai un bug ennuyeux sur une page Web:
date.GetMonth () n'est pas une fonction
Donc, je suppose que je fais quelque chose de mal. La variable date
n'est pas un objet de type Date
. Comment puis-je vérifier un type de données en Javascript? J'ai essayé d'ajouter un if (date)
, mais cela ne fonctionne pas.
function getFormatedDate(date) {
if (date) {
var month = date.GetMonth();
}
}
Donc, si je veux écrire du code défensif et empêcher la mise en forme de la date (qui n'est pas une), comment faire?
Merci!
MISE À JOUR: Je ne veux pas vérifier le format de la date, mais je veux être sûr que le paramètre passé à la méthode getFormatedDate()
est de type Date
.
javascript
date
Martin
la source
la source
Invalid Date
: stackoverflow.com/a/44198641/5846045Réponses:
Comme alternative à la saisie de canard via
vous pouvez utiliser l'
instanceof
opérateur, c.-à-d. mais il retournera vrai aussi pour les dates invalides, par exemplenew Date('random_string')
est également une instance de DateCela échouera si les objets passent au-delà des limites du cadre.
Une solution consiste à vérifier la classe de l'objet via
la source
window
ouself
); différents cadres ont leurs propres objets globaux et leurs propriétés (c.-à-d. globaux) se réfèrent à des objets distincts:Date
dans le cadre 1 est un objet fonction différent deDate
dans le cadre 2; il en va de même pourDate.prototype
, ce qui est la raison de l'instanceof
échec:Date.prototype
from frame1 ne fait pas partie du prototype de la chaîne d'Date
instances de frame2new Date('something') instanceof Date
revienttrue
dans Chrome. Cela ne fonctionnera pas alors.Vous pouvez utiliser le code suivant:
la source
instanceof
déclenchement de faux négatifs: jsbin.com/vufufoq/edit?html,js,consoleAfin de vérifier si la valeur est un type valide de l'objet date JS standard, vous pouvez utiliser ce prédicat:
date
vérifie si le paramètre n'a pas été une valeur falsy (undefined
,null
,0
,""
, etc ..)Object.prototype.toString.call(date)
renvoie une représentation sous forme de chaîne native du type d'objet donné - Dans notre cas"[object Date]"
. Parce quedate.toString()
remplace sa méthode parente , nous devons.call
ou.apply
la méthode à partir deObject.prototype
laquelle ..instanceof
ouDate.prototype.isPrototypeOf
.!isNaN(date)
vérifie enfin si la valeur n'était pas unInvalid Date
.la source
isNaN
peut être utilisé pour vérifier aDate
. C'est un certain niveau d'inanité de PHP.typeof Date.now() === "number"
, mais:typeof new Date() === "object"
. Plus réaliste, cependant, une date est un temps et un lieu dans l'espace.La fonction n'est
getMonth()
pasGetMonth()
.Quoi qu'il en soit, vous pouvez vérifier si l'objet a une propriété getMonth en procédant ainsi. Cela ne signifie pas nécessairement que l'objet est une date, juste n'importe quel objet qui a une propriété getMonth.
la source
if (date.getMonth && typeof date.getMonth === "function") {...}
Comme indiqué ci-dessus, il est probablement plus facile de vérifier simplement si la fonction existe avant de l'utiliser. Si vous vous souciez vraiment que ce soit un
Date
, et pas seulement un objet avec unegetMonth()
fonction, essayez ceci:Cela créera un clone de la valeur s'il s'agit d'un
Date
, ou créera une date non valide. Vous pouvez ensuite vérifier si la valeur de la nouvelle date n'est pas valide ou non.la source
Object.prototype.toString.call(value) === '[object Date]'
) si c'est possible, vous obtiendrez des chiffres. La méthode de cette réponse vous indique vraiment si levalue
est convertible en aDate
.Pour tous les types, j'ai préparé une fonction prototype d'objet. Cela peut vous être utile
Vous pouvez maintenant vérifier n'importe quel type comme celui-ci:
[ Edit mars 2013 ] basé sur la progression des connaissances, c'est une meilleure méthode:
la source
UnderscoreJS et Lodash ont une fonction appelée
.isDate()
qui semble être exactement ce dont vous avez besoin. Cela vaut la peine de regarder leurs implémentations respectives: Lodash isDate , UnderscoreJsla source
La meilleure façon que j'ai trouvée est:
la source
Au lieu de toutes les solutions de contournement, vous pouvez utiliser les éléments suivants:
J'ai trouvé ce hack meilleur!
la source
Vous pouvez vérifier si une fonction spécifique à l'objet Date existe:
la source
Vous pouvez également utiliser un formulaire court
ou quelque chose comme ça:
la source
J'utilise une méthode beaucoup plus simple, mais je ne sais pas si cela est uniquement disponible dans ES6 ou non.
Cependant, cela ne fonctionnera pas sur null ou indéfini car ils n'ont pas de constructeur.
la source
"Date"
également ce qui est aussi risqué que de simplement vérifier si le paramètre a unegetMonth
propriété.Cette fonction retournera
true
si c'est Date oufalse
autrement:la source
isDate(new (function AnythingButNotDate(){ })())
retourstrue
Encore une autre variante:
la source
instanceof
.iWindow.Date.prototype.isPrototypeOf(iWindow.date); // true
iWindow.date instanceof iWindow.Date; // true
Une approche utilisant un try / catch
la source
En fait, la date sera de type
Object
. Mais vous pouvez vérifier si l'objet a unegetMonth
méthode et s'il est appelable.la source
Nous pouvons également le valider par le code ci-dessous
la source
function Date() {/*...*/}
est aussiDate
. C'est-à-dire que la simple comparaison de la fonction constructeur est trop sujette aux erreurs, ce qui entraîne souvent de faux positifs. Contourner le type d'objet défini par l'utilisateur avec stackoverflow.com/a/44198641/5846045Inspirée par cette réponse , cette solution fonctionne dans mon cas (j'avais besoin de vérifier si la valeur reçue de l'API est une date ou non):
De cette façon, s'il s'agit d'une chaîne aléatoire provenant d'un client ou de tout autre objet, vous pouvez savoir s'il s'agit d'un objet de type Date.
la source
Ne pourriez-vous pas simplement utiliser
la source
isValid
méthodeisValid
. Seul moment.js possède une telle API.