Analyse des tâches WTF en JavaScript


JavaScript est un langage spécial. Peu importe combien vous l'étudiez, il y aura toujours des moments qui feront même un professionnel chevronné commencer à gratter les navets.


Cet article fournit quelques puzzles JavaScript liés à un comportement linguistique inhabituel. Ils aideront quelqu'un à apprendre quelque chose de nouveau et quelqu'un pourra simplement rafraîchir ses connaissances.


Tâche 1 - "BANANE"



Ce tweet à l'époque a gagné en popularité dans le segment Twitter en anglais dédié à JavaScript. Notamment parce qu'il n'est pas du tout évident de savoir ce qui se passe ici.


Solution

Les «b» et «a» au début ne sont que des chaînes qui s'ajoutent à «ba». Après "a", vous voyez deux signes plus (+). Le premier est destiné à être ajouté, mais le second est un opérateur unaire qui convertit la chaîne qui le suit en nombre. Étant donné que le deuxième «a» ne peut pas être converti en nombre, il est converti en «NaN».


Ainsi nous avons: «ba» + «NaN» + «a» - «baNaNa». toLowerCase nous donne insidieusement le résultat final - «banane».



Tâche 2 - Ajout de tableaux



C'est une tâche simple, mais une personne qui ne connaît pas le fonctionnement de JavaScript peut être source de confusion.


Solution

Tout d'abord, les tableaux sont convertis en chaînes - «1,2,3» et «4,5,6». Le résultat de la concaténation de ces lignes sera la réponse finale - la chaîne "1,2,34,5,6".



Tâche 3 - fonction parseInt ()


De toutes les tâches JavaScript, ce fut la plus difficile pour moi.



Si probablement tout a été rencontré avec parseInt en JavaScript d'une manière ou d'une autre, moins de personnes connaissent déjà l'existence du deuxième paramètre optionnel «radix». C'est la base du système numérique du premier argument.


Solution

Le premier argument "null" est converti en chaîne. Le premier caractère de cette chaîne «n» est converti en un nombre dans le système numérique avec la base 24. Le résultat de cette conversion est 23.


parseInt continue d'analyser la chaîne caractère par caractère jusqu'à ce qu'il rencontre un caractère qu'il ne peut pas convertir en nombre. Il s'agit du deuxième caractère de la chaîne - «u», car il n'y a pas un tel chiffre dans le système numérique avec la base 24.


De cette façon:


parseInt(null, 24) === parseInt("null", 24) parseInt("null", 24) === parseInt("n", 24) parseInt("n", 24) === 23 


Tâche 4 - Numéros à virgule flottante de précision



Cela a l'air horrible, mais en toute honnêteté, à un degré ou à un autre, vous pouvez en rencontrer un similaire dans n'importe quelle langue qui utilise des calculs à virgule flottante.


Solution
 console.log(0.1 + 0.2); // 0.30000000000000004 

Les constantes «0,2» et «0,3» du programme seront rapprochées de leurs valeurs «réelles» dans la représentation de la machine. Et il se trouve que le double le plus proche de «0,2» est supérieur au nombre rationnel «0,2». En revanche, le double le plus proche de «0,3» est inférieur au «0,3» rationnel.


Ainsi, la somme de «0,1» et «0,2» dans le code est supérieure à la «0,3» rationnelle, et la constante «0,3» dans le code est inférieure à la «0,3» rationnelle.


Remarque à l'hôtesse: n'utilisez jamais "===" ou "==" pour travailler avec des nombres à virgule flottante. Utiliser à la place


 if (abs(x - y) < toleranceValue) { ... } 




Conclusion


Oui, lorsque vous travaillez avec JavaScript, il y a beaucoup de moments WTF. D'un autre côté, quelle autre langue peut donner autant de sensations inoubliables?


Voici une liste de liens (en anglais) pour une étude approfondie des tâches de ce poste (et pas seulement):


Source: https://habr.com/ru/post/fr479496/


All Articles