Existe-t-il un navigateur moderne qui lève des exceptions lors de la propagation de NaN (c'est-à-dire la multiplication ou l'addition d'un nombre à NaN), ou qui peut être configuré pour le faire ?
La propagation silencieuse des NaN est une source terrible et insidieuse de bogues, et j'aimerais pouvoir les détecter à temps, même si les performances en pâtissent.
Voici un exemple de bug qui use strict
, jshint
et al. n'ont pas décroché :
object = new MyObject();
object.position.x = 0;
object.position.y = 10;
// ... lots of code
var newPosition = object.position + 1; // <- this is an error, and should
// have been object.position.x
// however it fails *silently*,
// rather than loudly
newPosition *= 2; // <- this doesn't raise any errors either.
// this code is actually ok if the
// previous line had been correct
Note : Le compilateur TypeScript est capable de détecter des erreurs comme celles ci-dessus, même dans le code JS, si l'inférence de type réussit.
1 votes
Vous pouvez vérifier
isNaN()
?10 votes
Je n'ai pas vraiment envie de truffer mon code de isNaNs à chaque fois que j'ajoute des chiffres.
0 votes
@RUJordan vous pouvez certainement. Mais cela se traduit par BEAUCOUP de code.
6 votes
Ne pouvez-vous pas simplement vous assurer que vos données sont correctes avant de les utiliser dans des calculs ? C'est le principe GIGO en action
0 votes
Vous pouvez simuler la surcharge de l'opérateur et vérifier les NaNs à l'intérieur. Jetez un coup d'œil à 2ality.com/2011/12/fake-operator-overloading.html
0 votes
...et stackoverflow.com/questions/1634341/
3 votes
Cela pourrait-il être un cas pour les Monads ? :)
3 votes
@Jack : vous lisez réellement dans mes pensées. Mais - non.
2 votes
@zerkms donc essentiellement la même chose que l'idée de RUJordan - utilisation libérale d'un tas de assertNotNaNs ? Je cherche un moyen de détecter rapidement les bogues de codage plutôt que de gérer les entrées inutiles.
0 votes
@kibibu : eh bien, pour moi, ça ne semble pas naturel à utiliser.
+
opérateur pour quelque chose qui ne l'accepte pas. Et même dans les langages à typage dynamique hebdomadaire comme le JS, je sais toujours quel est le type d'une variable particulière. Je n'ai donc jamais fait l'expérience d'une telle chose.1 votes
@zerkms suppose que c'est juste une faute de frappe dans le code, et aurait dû être object.position.x
0 votes
Je ne considère pas cela comme un bug, mais plutôt comme un mauvais codage.
1 votes
@Grumpy quelle est la différence ?