11486 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous
En passant un fichier JavaScript dans un vérificateur de syntaxe, je trouve un message que je ne comprends pas
Le code
function newNode(tag = '', ...params) {...}

le message envoyé par le vérificateur
Regular parameters should not come after default parameters.


Ce que je crois comprendre c'est que le vérificateur s'attend à ce qu'à partir du moment où un paramètre a une valeur par défaut, tous les paramètres suivants devraient également avoir une valeur par défaut, y compris le "spread/rest operator" ?
Mais si j'essaie
function newNode(tag = '', ...params=[]) {...}

J'obtiens le message
Rest parameter does not a support default value.


Dois-je en conclure que le vérificateur est erroné ?
Modifié par PapyJP (02 Jan 2023 - 13:04)
PapyJP a écrit :
Bonjour à tous
En passant un fichier JavaScript dans un vérificateur de syntaxe, je trouve un message que je ne comprends pas
Le code
function newNode(tag = '', ...params) {...}

le message envoyé par le vérificateur
Regular parameters should not come after default parameters.


Le message te dit simplement que les paramètres qui n'ont pas une valeur par défault ne doivent pas être après ceux qui ont une valeur par défault. mais avant.


function newNode(...params, tag = '') {...}

Modifié par JENCAL (02 Jan 2023 - 14:36)
Mettre le "rest parameter" avant les paramètres ayant une valeur par défaut ?

Si je comprends bien on est sensé écrire quelques chose comme ça ?
function xxx(c, d, ...rest, a='', b=0) {...}


J'avoue que ça me laisse perplexe ! Je n'ai jamais vu jusqu'ici un langage qui préconise ce genre de syntaxe (et Dieu seul sait le nombre de langages de programmation que j'ai utilisés depuis mon premier programme en assembleur en 1966)
Bonsoir,

A partir du moment où un paramètre a une valeur par défaut, tous les paramètres suivants doivent aussi avoir des valeurs par défaut.


function (a, b=2, c) { ... }

est invalide. Le paramètre c qui vient après b doit obligatoirement avoir une valeur par défaut.

Le paramètre reste, lui, ne peut pas avoir de valeur par défaut.
Ca ne fait pas de sens, car ce sera quoi qu'il arrive toujours un tableau. Ca ne sera jamais null ou undefined, au pire ce sera un tableau vide.

Il ne peut y avoir qu'un seul paramètre reste, et ça doit obligatoirement être le dernier. Pour comprendre pourquoi, regardez ce code hypothétique:


function f (...a, b=100) { ... }

f(1, 2, 3);


Est-ce qu'on veut obtenir a=[1,2], b=3 ou bien a=[1,2,3], b=100 ? il n'y a aucun moyen de lever l'ambiguïté.
Le plus simple pour éviter cette ambiguïté est d'interdire purement et simplement cette construction.

On pourrait se dire que ce serait acceptable s'il n'y avait pas de valeur par défaut, mais en fait, en JavaScript, il n'y a pas de vérification stricte du nombre de paramètres passés.
ON a toujours le droit de passer moins de paramètres que ce que la fonction demande. Ce n'est pas du très bon code, mais ce n'est pas une erreur. Pour rappel, dans un tel cas, les paramètres reçoivent la valeur undefined...
Du coup,

function (...a, b) { ... }

f(5);

est toujours ambigu: veut-on a=[], b=5 ou bien a=[5], b=undefined ?
Merci de ta réponse. Elle est conforme à ce que je pensais.

Le vérificateur de syntaxe ne semble pas avoir prévu le cas, pourtant fréquent, où on passe un paramètre avec valeur par défaut et un reste.
Ce warning est donc sans intérêt, du reste de même que d’autres qui me rappellent en permanence que mon code n’est valable qu’avec ecmascript 6, alors que dans les paramètres du validateur précisent justement que le code est en ecmascript 6.
Des warnings superflus sont une plaie, il faut les examiner un à un pour voir s’ils sont relevants ou non.

Ça me rappelle une conférence d’André Tucat, premier pilote d’essai de Concorde. Il avait retardé le premier vol d’un an, le temps que les ingénieurs suppriment les warnings superflus qui perturbaient l’attention du pilote.