J'écris du JavaScript depuis assez longtemps maintenant, et je n'ai jamais eu de raison de l'utiliser null
. Il semble que ce undefined
soit toujours préférable et sert le même objectif par programme. Quelles sont les raisons pratiques à utiliser à la null
place de undefined
?
javascript
null
undefined
Jimmy Cuadra
la source
la source
document.getElementById()
celle-là qui peuvent renvoyernull
mais pasundefined
, alors dans ces cas, pourquoi testeriez-vous le retourundefined
? (Bien sûr, cela fonctionnerait si vous utilisez==
plutôt que===
, mais quand même, pourquoidocument.getElementById('does-not-exist')
). Les variablesvar a;
et les fonctions retournent les valeurs par défaut non définies. Dans le passé, null était dans la portée globale, donc son utilisation ralentissait l'exécution et m'avait conduit à préférer d'autres types faussés (false, '', 0) aux références libres. Personnellement, j'évite null à moins qu'il n'y ait une raison impérieuse autrement parce que je le perçois comme étant plus simple, ce qui est généralement mieux.Réponses:
Null et undefined sont essentiellement deux valeurs différentes qui signifient la même chose. La seule différence réside dans les conventions d'utilisation de ces derniers dans votre système. Comme certains l'ont mentionné, certaines personnes utilisent null pour signifier "aucun objet" où vous pouvez parfois obtenir un objet alors que non défini signifie qu'aucun objet n'était attendu (ou qu'il y avait une erreur). Mon problème avec cela est qu'il est complètement arbitraire et totalement inutile.
Cela dit, il y a une différence majeure: les variables qui ne sont pas initialisées (y compris les paramètres de fonction où aucun argument n'a été passé, entre autres) sont toujours indéfinies.
C'est pourquoi dans mon code je n'utilise jamais null à moins que quelque chose que je ne contrôle pas retourne null (correspondance regex par exemple). La beauté de ceci est que cela simule beaucoup les choses. Je n'ai jamais à vérifier si x === undefined || x === nul. Et si vous avez l'habitude d'utiliser == ou simplement des trucs comme if (x) .... Arrête ça.
!x
évaluera à vrai pour une chaîne vide, 0, null, NaN - c'est-à-dire des choses que vous ne voulez probablement pas. Si vous voulez écrire du javascript qui n'est pas terrible, utilisez toujours triple equals === et n'utilisez jamais null (utilisez plutôt undefined). Cela vous facilitera la vie.la source
===
ou!==
. JS est un langage incroyablement expressif si vous savez comment vous en servir.null
/undefined
était nécessaire car la version initiale de JS n'avaithasOwnProperty
ni l'in
opérateur. Maintenant que c'est le cas, je ne comprends pas vraiment pourquoi l'un d'entre eux n'a pas été aboli dans ES6 ou dans les propositions ES7 que j'ai vues.Je n'ai pas vraiment de réponse, mais selon Nicholas C. Zakas , page 30 de son livre " Professional JavaScript for Web Developers " :
la source
undefined
signifie qu'une catastrophe s'est produite. Juste à mon humble avis.var myVar;
et vérifier explicitement la valeurundefined
pour déterminer si elle a été remplie ultérieurement avec une référence d'objet. Mon point est que c'est totalement théorique - vous pouvez le faire dans les deux sens, et quiconque conseille dans un sens plutôt que dans l'autre ne fait que pousser sa propre convention.undefined
etnull
. C'est toujours vraiment ennuyeux. J'évite d'assigner une variable ànull
juste pour réduire le nombre denull
tests supplémentaires .==
comparaison (par opposition à===
) a du sens:v == null
(ouv == undefined
) vérifiera la valeur nulle ou non définie.À la fin de la journée, parce que les deux
null
etundefined
contraignent à la même valeur (Boolean(undefined) === false && Boolean(null) === false
), vous pouvez techniquement utiliser l'un ou l'autre pour faire le travail. Cependant, il y a la bonne manière, l'OMI.Laissez l'utilisation de
undefined
au compilateur JavaScript.undefined
est utilisé pour décrire des variables qui ne pointent pas vers une référence. C'est quelque chose que le compilateur JS prendra soin de vous. Au moment de la compilation, le moteur JS définira la valeur de toutes les variables levées surundefined
. Au fur et à mesure que le moteur parcourt le code et que les valeurs deviennent disponibles, le moteur attribue des valeurs respectives aux variables respectives. Pour les variables pour lesquelles il n'a pas trouvé de valeurs, les variables continueraient à maintenir une référence à la primitiveundefined
.N'utilisez NULL que si vous souhaitez explicitement désigner la valeur d'une variable comme n'ayant "aucune valeur".
Comme l'indique @ com2gz:
null
est utilisé pour définir quelque chose de vide par programmation.undefined
veut dire que la référence n'existe pas. Unenull
valeur a une référence définie à «rien». Si vous appelez une propriété non existante d'un objet, vous obtiendrezundefined
. Si je veux rendre cette propriété intentionnellement vide, alors ce doit êtrenull
pour que vous sachiez que c'est exprès.TLDR; N'utilisez pas le
undefined
primitif. C'est une valeur que le compilateur JS définira automatiquement pour vous lorsque vous déclarez des variables sans affectation ou si vous essayez d'accéder aux propriétés d'objets pour lesquels il n'y a pas de référence. D'autre part, utiliseznull
si et seulement si vous voulez intentionnellement qu'une variable n'ait «aucune valeur».Je n'ai jamais défini explicitement quoi que ce soit sur undefined (et je n'ai pas rencontré cela dans les nombreuses bases de code avec lesquelles j'ai interagi). De plus, j'utilise rarement
null
. Les seules fois que j'utilise,null
c'est lorsque je veux désigner la valeur d'un argument d'une fonction comme n'ayant aucune valeur, c'est-à-dire:la source
indéfini, c'est là où aucune notion de la chose n'existe; il n'a pas de type, et il n'a jamais été référencé auparavant dans cette portée; null est l'endroit où la chose est connue pour exister, mais elle n'a aucune valeur.
la source
Chacun a sa propre façon de coder et sa propre sémantique interne, mais au fil des ans, j'ai trouvé que c'était le conseil le plus intuitif que je donne aux gens qui se posent cette question: en cas de doute, faites ce que fait JavaScript .
Disons que vous travaillez avec des propriétés d'objet comme des options pour un plugin jQuery ... demandez-vous quelle valeur JavaScript donne une propriété qui n'a pas encore été définie - la réponse est
undefined
. Donc, dans ce contexte, je initialiserais ces types de choses avec 'undefined' pour être cohérent avec JavaScript (pour les variables, vous pouvez le faire à lavar myVar;
place devar myVar = undefined;
).Maintenant, disons que vous faites une manipulation DOM ... quelle valeur JavaScript attribue-t-il aux éléments inexistants? La réponse est
null
. C'est la valeur avec laquelle je initialiserais si vous créez une variable d'espace réservé qui contiendra plus tard une référence à un élément, un fragment de document ou similaire lié au DOM.Si vous travaillez avec JSON, un cas particulier doit être fait: pour les valeurs de propriété non définies, vous devez les définir sur
""
ounull
parce qu'une valeur deundefined
n'est pas considérée comme le format JSON approprié.Cela dit, comme une affiche précédente l'a exprimé, si vous constatez que vous initialisez des éléments avec
null
ouundefined
plus d'une fois dans une lune bleue, vous devriez peut-être reconsidérer la façon dont vous codez votre application.la source
Vous pourriez adopter la convention suggérée ici, mais il n'y a vraiment aucune bonne raison de le faire. Il n'est pas utilisé de manière suffisamment cohérente pour être significatif.
Pour rendre la convention utile, vous devez d'abord savoir que la fonction appelée suit la convention. Ensuite, vous devez tester explicitement la valeur renvoyée et décider quoi faire. Si vous êtes indéfini , vous pouvez supposer qu'une erreur s'est produite et que la fonction appelée était au courant . Mais si une erreur s'est produite et que la fonction le savait, et qu'il est utile de l'envoyer dans un environnement plus large, pourquoi ne pas utiliser un objet d'erreur? c'est-à-dire jeter une erreur?
Donc en fin de compte, la convention est pratiquement inutile dans autre chose que de très petits programmes dans des environnements simples.
la source
Une propriété utile dans null qui n'est pas définie ne qualifie pas:
J'utilise
null
quand je veux «désactiver» une valeur numérique, ou en initialiser. Ma dernière utilisation était de manipuler la transformation css:Je ne sais pas si je devrais utiliser cette propriété pensée ...
la source
Les nœuds et éléments DOM ne sont pas indéfinis, mais peuvent être nuls.
Le nextSibling du dernier enfant d'un élément est nul.
Le previousSibling du premier enfant est nul.
Une référence document.getElementById est nulle si l'élément n'existe pas dans le document.
Mais dans aucun de ces cas, la valeur n'est indéfinie ; il n'y a tout simplement pas de nœud là-bas.
la source
window.myVar
renvoie «undefined si elle n'existe pas. Il y a des tonnes de choses qui retournent «indéfini» en JavaScript, juste il y a des tonnes de choses qui renvoient «null» - tout dépend du contexte.Quelques-uns ont dit qu'il était possible d'initialiser des objets avec
null
. Je voulais juste souligner que les valeurs par défaut des arguments de déstructuration ne fonctionnent pasnull
. Par exemple:Cela nécessite d'effectuer des
null
vérifications avant d'appeler la fonction, ce qui peut arriver souvent.la source
Je travaille sur cette question exacte en ce moment et j'examine la philosophie suivante:
Pour moi, cette question est importante parce que quiconque appelle une fonction qui renvoie un résultat ne devrait avoir aucune question quant à savoir s'il faut tester undefined vs null.
Cette réponse ne tente pas de traiter:
À mon avis, les variables sont votre propre entreprise et ne font pas partie de votre API, et les propriétés de tout système OO sont définies et doivent donc être définies avec une valeur différente de ce qu'elles seraient si elles n'étaient pas définies (nul pour défini, indéfini est ce que vous get lors de l'accès à quelque chose qui n'est pas dans votre objet).
la source
Voici une raison:
var undefined = 1
c'est du javascript légal, maisvar null = 1
c'est une erreur de syntaxe. La différence est qu'ilnull
s'agit d'un mot-clé de langue, alors que ceundefined
n'est pas le cas pour une raison quelconque.Si votre code repose sur des comparaisons
undefined
comme s'il s'agissait d'un mot-clé (if (foo == undefined)
- une erreur très facile à faire) qui ne fonctionne que parce que personne n'a défini une variable avec ce nom. Tout ce code est vulnérable à la définition accidentelle ou malveillante d'une variable globale portant ce nom. Bien sûr, nous savons tous que définir accidentellement une variable globale est totalement impossible en javascript ...la source
void 0
au lieu de non défini.Je veux juste ajouter qu'avec l'utilisation de certaines bibliothèques javascript, null et undefined peuvent avoir des conséquences inattendues.
Par exemple, la
get
fonction de lodash , qui accepte une valeur par défaut comme troisième argument:Autre exemple: si vous utilisez defaultProps dans React, si une propriété est transmise
null
, les accessoires par défaut ne sont pas utilisés car null est interprété comme une valeur définie . par exemplela source
Je ne suis absolument pas d'accord pour dire que l'utilisation nulle ou non définie n'est pas nécessaire. undefined est une chose qui maintient en vie tout le processus de chaînage de prototype. Ainsi, le compilateur uniquement avec null ne peut pas vérifier si cette propriété est juste égale à null ou n'est pas définie dans le prototype de point de terminaison. Dans d'autres langages typés dynamiques (par exemple Python), il lève une exception si vous voulez accéder à une propriété non définie, mais pour les langages basés sur des prototypes, le compilateur doit également vérifier les prototypes parents et voici l'endroit où le besoin indéfini est le plus important.
Toute la signification de l'utilisation de null est simplement de lier une variable ou une propriété avec un objet qui est singleton et qui a une signification de vide, et l'utilisation de null a également des objectifs de performance. Ce code 2 a un temps d'exécution différent.
la source
Variable inconnue:
undefined
.Variable connue encore aucune valeur:
null
.server_object
.server_object.errj
. Cela vous dit que c'estundefined
. Cela signifie qu'il ne sait pas ce que c'est.server_object.err
. Cela vous dit que c'estnull
. Cela signifie que vous faites référence à une variable correcte mais qu'elle est vide; donc pas d'erreur.Le problème est lorsque vous déclarez un nom de variable sans valeur (
var hello
) js déclare queundefined
: cette variable n'existe pas; alors que les programmeurs veulent surtout dire: «Je ne lui ai pas encore donné de valeur», la définition denull
.Ainsi, le comportement par défaut d'un programmeur - déclarer une variable sans valeur comme rien - est en contradiction avec js - en la déclarant comme non existante. Et d'ailleurs,
!undefined
et!null
sont les deuxtrue
donc la plupart des programmeurs les traitent comme équivalents.Vous pouvez bien sûr vous assurer que vous le faites toujours,
var hello = null
mais la plupart ne jetteront pas leur code en tant que tel pour garantir la cohérence du type dans un langage délibérément mal typé, quand eux et l'!
opérateur traitent les deuxundefined
etnull
comme équivalents.la source