Note : JS, dataset et typage pourri

Quand on utilise les attributs « data-* », JS le récupère toujours sous la forme d’une chaîne de caractères, même si ça contient un nombre :

// <div data-nb="12"/>
div.dataset.nb; // contient « "12" », pas « 12 ».

Une façon de s’en convaincre :

div.dataset.nb += 2; // <div data-nb="122"/>

car "12"+2 = "122".

Par contre, si au lieu de faire une addition, on fait une soustraction, alors là il le transforme en nombre puis fait l’opération. Car si une chaîne + chaîne résulte en la concaténation des chaînes, les soustractions de chaînes il ne sait pas faire : la soustraction ne concerne que des nombres, d’où le .parseInt() implicite.

div.dataset.nb -= 2; // <div data-nb="10"/>

Une solution peut-être :

div.dataset.nb = div.dataset.nb+2.

Mais c’est pas joli, pas efficace, ni propre quand l’expression est un peu longue (avec des querySelector partout).

Du coup, une petite astuce :

div.dataset.nb -= -2; // <div data-nb="14"/>

Tout bêtement :-)

ÉDIT :
Et un autre truc tout con, quand on veut transformer une variable de 1 à 0 ou de 0 à 1.
Au lieu de faire ça :

if (var == 1) {
   var = 0;
} else {
   var = 1;
}

Faites ça :

var = 1-var;

Ça fait la même chose :
— si var vaut 1, alors le résultat sera 1−1, donc la nouvelle valeur sera 0.
— si var vaut 0, alors le résultat sera 1−0, donc la nouvelle valeur sera 1.

Si vous utilisez les booléens :

var = !var;