En passant NULL comme paramètre dans l'ES6 ne pas utiliser le paramètre par défaut lorsque l'on est
Est-il une raison pourquoi en passant null
comme un paramètre dans l'ES6 ne pas utiliser le paramètre par défaut lorsque l'on est?
function sayHello(name = "World") {
console.log("Hello, " + name + "!");
}
sayHello("Jim"); //Hello, Jim!
sayHello(undefined); //Hello, World!
sayHello(null); //Hello, null!
- parce que la valeur null est une valeur valide?
- Mais c'est
undefined
.. - non, il n'est pas 🙂 vous pouvez lire à propos de la différence entre l'indéfini et nul ici stackoverflow.com/questions/5076944/...
- sémantiquement, ils sont différents 🙂
- Si
undefined
n'était pas une valeur, elle ne serait pas affectée, mais elle peut être. C'est le test le plus simple pour déterminer si quelque chose est une valeur. Et tout simplement, la réponse est mal d'utiliser dans le contexte:undefined
est utilisé comme valeur par défaut dans certains cas, ce n'est pas indéfini "pas de valeur". Considérer:a = new Array(1)
. Puisa[0]
donnera leundefined
valeur même si la0 in a
est faux. Qu'il,a[0]
contient "aucune valeur", même si elle permettra d'évaluer l' (par défaut)undefined
valeur. - il peut être affecté, mais indéfini signifie que la variable n'est pas définie, alors que la valeur null signifie que la variable est définie, mais sa valeur est null.
- J'ai expliqué plus haut pourquoi c'est incorrect. Parler de "si la variable n'a pas été définie" (dans le cas de
typeof x === 'undefined'
, oùx
seul serait/pourrait jeter une ReferenceError) n'a aucune incidence sur le fait queundefined
est une valeur. En particulier, 'undefined' en JavaScript n'est pas strictement "signifie" n'a pas été défini/déclarée". - Qu'en est
var x = undefined;
? Est ma variable pas encore défini? - Je pense que je me suis exprimé mal avant. Ce n'est pas que la variable n'est pas définie, dans ce cas, la variable pointe vers une valeur qui n'a pas encore été défini. Alors que la var x = null signifie que x a la valeur définie de la valeur null. Vous pouvez penser pas défini comme non initialisé alors que null est initialisé avec une valeur nulle. C'est déroutant, je le sais. @Felix Kling
- Vous pouvez considérer ce cas d'utilisation. X doit être initialisé avec une valeur reçue sur une requête http. Nous commençons avec var x; et x n'est pas définie. Maintenant, nous faisons la demande et qui peut finir dans les 2 sens. La demande réussit et x obtient une valeur. Ou la requête échoue, auquel cas nous nous fixons x à la valeur nulle, car nous savons maintenant que x n'a pas de valeur. La différence est principalement sur de la signification et du javascript truthy/falsy système de valeur n'aide pas beaucoup à éclaircir ce point.
Vous devez vous connecter pour publier un commentaire.
Ce qui n'est pas évident
J'ai lu quelques commentaires de pourquoi
undefined
est complètement différent denull
et c'est pourquoi il explique le comportement actuel des paramètres par défaut.On pourrait dire explicitement en passant undefined ne devrait pas déclencher la valeur par défaut de substitution parce que quand j'ai une fonction:
Je voudrais l'imprimer
"default"
quand je le lance comme:mais je voudrais l'imprimer
"undefined"
quand j'ai lancer explicitement comme:parce que sinon, pourquoi voudrais-je utiliser
f(undefined)
en premier lieu? Clairement mon intention ici est de fournir un argument au lieu de le laisser sortir.Exemples contraires
Maintenant, pensez à cette fonction:
Lorsque je l'utilise comme:
J'obtiens:
[]
Mais quand je l'utilise comme:
J'obtiens:
[null]
qui démontre clairement que:
undefined
est pas la même de ne pas passer un argument à tous lesnull
peut être une valeur par défaut au lieu deundefined
TC39 décision
Un peu de contexte sur le comportement actuel de l'paramètres par défaut peuvent être vus dans le 24 juillet 2012 les Notes de Réunion par TC39:
Par ailleurs, il montre explicitement en passant
undefined
à l'origine n'a pas déclencher la valeur par défaut dans la première version, et il y avait une discussion quant à savoir si ou non il faut le faire. Donc, comme vous pouvez le voir le comportement actuel n'était pas évident pour le TC39 membres comme il semble maintenant être à des gens qui commentent ici.D'autres langues
Cela dit, la décision de ce qui doit et ce qui ne doit pas déclencher la valeur par défaut de substitution est tout à fait arbitraire, à la fin de la journée. Même en ayant un
undefined
etnull
peut être cependant assez étrange si vous pensez à ce sujet. Certaines langues ont seulementundefined
(commeundef
en Perl), certains ont seulementnull
(comme Java), certaines langues utilisent des équivalents defalse
ou d'une liste vide ou un tableau pour que (comme le Régime où vous pouvez avoir une liste vide ou#f
(faux), mais il n'y a pas d'équivalent denull
qui serait distinct de la liste vide et une valeur fausse) et dans certaines langues n'ont pas d'équivalents denull
,false
ouundefined
(comme en C qui utilise des entiers au lieu detrue
etfalse
et d'un pointeur NULL qui est en fait un normal pointeur pointant vers l'adresse 0 de décisions que l'adresse inaccessible, même lorsqu'elles sont mappées par du code qui teste des pointeurs null).Ce que vous pouvez faire
Maintenant, je peux comprendre votre besoin de remplacer les valeurs par défaut pour
null
. Malheureusement, ce n'est pas un comportement par défaut, mais vous pouvez faire une fonction simple pour vous aider à:Maintenant, chaque fois que vous voulez par défaut substitué
null
valeurs que vous pouvez utiliser de la sorte. E. g. si vous avez cette fonction à partir de l'un des exemples ci-dessus:il permet d'imprimer
"default"
pourf()
etf(undefined)
mais pas pourf(null)
. Mais lorsque vous utilisez leN
de la fonction définie ci-dessus pour définir laf
fonction comme ceci:maintenant
f()
etf(undefined)
mais aussif(null)
imprime"default"
.Si vous voulez quelque peu différent de comportement, par exemple en substituant les valeurs par défaut pour les chaînes vides - utile pour les variables d'environnement qui peuvent parfois être réglé à des chaînes vides au lieu de n'existant pas, vous pouvez utiliser:
Si vous voulez que tous les falsy valeurs à remplacer, vous pouvez l'utiliser comme ceci:
Si vous voulais des objets vides pour être remplacé, vous pouvez utiliser:
et ainsi de suite...
Conclusion
Le point est qu'il est de votre code et vous savez ce que devrait être l'API de vos fonctions et comment les valeurs par défaut devrait fonctionner. Heureusement JavaScript est assez puissant pour vous permettre de réaliser facilement ce dont vous avez besoin (même si ce n'est pas le comportement par défaut des valeurs par défaut, façon de parler) avec une fonction d'ordre de la magie.
C'est juste la façon dont les paramètres par défaut sont définies dans la spécification. Voir MDN: (l'emphase est mienne)
null
est ni aucune valeur, niundefined
, afin de ne pas déclencher l'initialisation par défaut.undefined
est spécialement traités est parce que "vide", les paramètres sont définis àundefined
. Siundefined
n'était pas équivalent à "pas de valeur", ce serait plus ennuyeux à mettre en œuvre:function foo(bar) { return functionWithDefaults(bar); }; foo();
. L'inconvénient est qu'il n'est pas possible de transmettre explicitementundefined
, mais qui ne fait que de toute façon 😛undefined
explicitement en passantundefined
, par exempledoSomething(undefined)
, voir codepen.io/morewry/stylo/KaEVmN?les éditeurs=0010.null
est une valeur qui ne déclenchent pas la valeur par défaut sera utilisé, les valeurs par défaut seront utilisées lorsque l'argument estundefined
.