Je vois souvent du code JavaScript qui vérifie les paramètres non définis, etc. de cette façon:
if (typeof input !== "undefined") {
// do stuff
}
Cela semble un peu inutile, car cela implique à la fois une recherche de type et une comparaison de chaînes, sans parler de sa verbosité. Il est nécessaire car il undefined
pourrait être renommé.
Ma question est:
comment ce code est-il meilleur que cette approche:
if (null != input) {
// do stuff
}
Pour autant que je sache, vous ne pouvez pas redéfinir null
, donc ça ne va pas se casser de façon inattendue. Et, en raison de la coercition de type de l' !=
opérateur, cela vérifie les deux undefined
et null
... qui est souvent exactement ce que vous voulez (par exemple pour les paramètres de fonction facultatifs).
Pourtant, ce formulaire ne semble pas répandu, et il fait même que JSLint vous crie pour avoir utilisé l' !=
opérateur maléfique .
Pourquoi est-ce considéré comme un mauvais style?
la source
if (null != input)
est seulement "Yoda Speak" pour le locuteur anglais (De celui que je suis .... uuammmmm) donc s'ils équivalent à la même chose c'est vraiment juste de la sémantique. A MON HUMBLE AVIS.Réponses:
typeof
est plus sûr car il permet à l'identifiant de ne jamais avoir été déclaré auparavant:la source
==
peut être meilleur, car il teste à la fois null et indéfini.!==
ou===
lors de la comparaison d'une valeur dont le type est connu pour être une chaîne.Si la variable est déclarée (soit avec le
var
mot - clé, comme argument de fonction, soit comme variable globale), je pense que la meilleure façon de le faire est:jQuery le fait, donc c'est assez bon pour moi :-)
Sinon, vous devrez utiliser
typeof
pour éviter aReferenceError
.Si vous vous attendez à ce que undefined soit redéfini, vous pouvez envelopper votre code comme ceci:
Ou obtenez-le via l'
void
opérateur:la source
undefined
c'est le nom donné au paramètre de fonction, pas sa valeur. Rien n'est transmis à la fonction, ce qui signifie que la valeur du premier paramètre n'est pas définie.bonne façon:
Mais le meilleur moyen est de vérifier via:
la source
if (typeof neverDeclared === typeof undefined) {
mais Lint lance une erreur. "Attendu une chaîne et vu à la place 'typeof'." Comment contourneriez-vous cette erreur? Devrions-nous nous soumettre aux demandes de Lint et utiliser à la place la «bonne voie»?typeof neverDeclared === typeof void 0
;-Dif(typeof neverDeclared === typeof undefined_variable_with_a_name_assumed_to_be_never_defined) {
mais c'est assez long.Vous ne devriez pas vraiment vous soucier de renommer undefined. Si quelqu'un renomme indéfini, vous aurez beaucoup plus de problèmes que quelques-uns si les contrôles échouent. Si vous voulez vraiment protéger votre code, enveloppez-le dans une IFFE (expression de fonction immédiatement invoquée) comme ceci:
Si vous travaillez avec des variables globales (ce qui est déjà faux) dans un environnement de navigateur, je vérifierais pour undefined comme ceci:
Étant donné que les variables globales font partie de l'objet fenêtre, vous pouvez simplement vérifier par non défini au lieu de transtyper en chaîne et de comparer des chaînes.
En plus de cela, pourquoi vos variables ne sont-elles pas définies? J'ai vu beaucoup de code où ils vérifient l'existence d'une variable et effectuent une action basée sur cela. Pas une seule fois je n'ai vu où cette approche était correcte.
la source
Si vous êtes vraiment inquiet de la redéfinition d'undefined, vous pouvez vous protéger contre cela avec une méthode d'assistance comme celle-ci:
Cela fonctionne parce que lorsque quelqu'un écrit,
undefined = "foo"
il ne laisse que le nom faireundefined
référence à une nouvelle valeur, mais il ne change pas la valeur réelle deundefined
.la source
undefined_check
en haut et ensuite simplement l'utiliser partout dans votre code.typeof
vérification.Vous pouvez également utiliser l'opérateur void pour obtenir une valeur non définie:
(Et oui, comme indiqué dans une autre réponse, cela générera une erreur si la variable n'a pas été déclarée, mais ce cas peut souvent être exclu soit par inspection de code, soit par refactorisation de code, par exemple en utilisant
window.input !== void 0
pour tester des variables globales ou en ajoutantvar input
.)la source
J'ai en fait rencontré si
(typeof input !== 'undefined')
dans ce scénario où il est utilisé pour fournir des paramètres de fonction par défaut:ES6 propose de nouvelles façons d'introduire les paramètres de fonction par défaut de cette façon:
C'est moins verbeux et plus propre que la première option.
la source
la source
la source
la source
fonctionne très bien. Ce n'est bien sûr pas une
null
comparaison, mais je trouve généralement que si j'ai besoin de distinguer entreundefined
etnull
, j'ai plutôt besoin de distinguer entreundefined
et n'importe quelle valeur fausse, doncle fait.
Si un programme redéfinit,
undefined
il est vraiment braindead de toute façon.La seule raison pour laquelle je peux penser était pour la compatibilité IE4, il ne comprenait pas le
undefined
mot - clé (qui n'est pas réellement un mot-clé, malheureusement), mais bien sûr les valeurs pouvaient l' êtreundefined
, donc vous deviez avoir ceci:et la comparaison ci-dessus fonctionnerait très bien.
Dans votre deuxième exemple, vous avez probablement besoin de doubles parenthèses pour faire plaisir aux peluches?
la source
input == undefined
reviendreztrue
sur unenull
entrée.