Notation «Tuple» JavaScript: quel est son point?
-
14-11-2019 - |
Question
À wtfjs, J'ai trouvé que ce qui suit est un javascript légal.
",,," == Array((null,'cool',false,NaN,4)); // true
L'argument (null,'cool',false,NaN,4)
On dirait un tuple pour moi, mais JavaScript n'a pas de tuples!
Quelques tests rapides dans ma console JavaScript donne ce qui suit.
var t = (null,'cool',false,NaN,4); // t = 4
(null,'cool',false,NaN,4) === 4; // true
(alert('hello'), 42); // shows the alert and returns 42
Il semble se comporter exactement comme un point-virgule ;
Liste séparée des instructions, renvoyant simplement la valeur de la dernière instruction.
Y a-t-il une référence quelque part qui décrit cette syntaxe et sa sémantique? Pourquoi existe-t-il, c'est-à-dire quand devrait-il être utilisé?
La solution
Vous voyez l'effet du opérateur de virgule.
L'opérateur de virgule évalue ses deux opérandes (de gauche à droite) et renvoie la valeur du deuxième opérande.
La valeur résultante quand a,b,c,...,n
est évalué sera toujours la valeur de l'expression la plus à droite, cependant tout Les expressions dans la chaîne sont toujours évaluées (de gauche à droite).
Autres conseils
Comme déjà expliqué, ce comportement est causé par ,
opérateur. Pour cette raison, l'expression (null,'cool',false,NaN,4)
évaluera toujours à 4
. Donc nous avons
",,," == Array(4)
Array(4)
- Crée un nouveau tableau avec 4 éléments alloués. Au moment de la comparaison avec la chaîne, ce tableau est converti en chaîne comme il serait avec Array(4).toString()
. Pour les tableaux toString
Agit comme join(',')
Méthode appelée sur ce tableau. Donc, pour le tableau vide de 4 éléments, jointure produira la chaîne ",,,"
.
Essaye ça alert((null,'cool',false,NaN,4))
Et puis vous pouvez voir.
La raison en est que l'opérateur de virgule évalue toutes les déclarations et renvoie la dernière.
Pensez à cette ligne: a = 1, b = 2, c = 3;
Il exécutera chaque expression, donc en substance, il définira les variables sur ce que vous voulez et renverra la dernière valeur (dans ce cas 3)