En Python, vous pouvez faire cela:
let arr = [1,2,3]; arr[-1]; // evaluates to undefined
Mais en JS, vous ne pouvez pas:
arr = [1,2,3] arr[-1] // evaluates to 3
La question est: why?[
Je connais les astuces pour le contourner ( arr [arr.length-1]
, modification le prototype de tableau, etc.), mais ce n'est pas le but.
J'essaie de comprendre pourquoi il n'est toujours pas dans les normes EcmaScript d'interpréter les indices de tableau négatifs comme des indices commençant par la fin, malgré il semble assez facile d'implémenter un moteur JS qui comprend cela (et aussi, toute la communauté Python s'amuse avec cette notation).
Que me manque-t-il?
4 Réponses :
Vous manquez le point, que les tableaux sont des objets ( objet exotique ) et -1
est une clé valide.
var array = [1, 2, 3]; array[-1] = 42; console.log(array); console.log(array[-1]);
Ceci explique cela. Mais est-ce un bon modèle de programmation d'utiliser des indices négatifs dans des tableaux? Je ne vois aucune utilisation qui ne soit pas un hack
@NinoFiliu Javascript n'est pas connu pour être un langage avec beaucoup de garde-corps, plutôt pour sa sémantique simple, quoique flexible et expressive. Cela a commencé comme un langage de script pour permettre aux gens de faire des choses comme animer leurs sites Web directement dans le balisage, à une époque où tout le monde pensait que les applications Web seraient écrites sous forme d'applets Java.
@NinoFiliu Si vous travaillez avec un tableau, utiliser un index négatif n'a pas de sens et vous ne devriez pas le faire. Par exemple, les indices négatifs ne comptent pas dans le tableau longueur .
Vous pouvez utiliser L'accès aux propriétés Javascript a toujours fonctionné de cette façon - donc, changer les choses pour que arr [-1]
- il essaiera d'accéder à la propriété -1
sur le arr code> objet, ce qui est possible lorsqu'un code étrange a été attribué à l'index négatif. Par exemple:
const arr = [1,2,3]
arr[-1] = 'foo';
console.log(arr[-1]);
[-1]
fasse référence au dernier élément du tableau être un changement de rupture , que les normes s’efforcent très fort d’éviter. (rappelez-vous comment ils se sont retirés du nom Array.prototype.flatten
en raison d'une incompatibilité avec une version extrêmement ancienne et obsolète de MooTools qui n'existe encore que sur quelques sites - ce serait bien pire) p>
Parce que la plupart des langages aiment le indexOf
pour renvoyer -1
au lieu d'une exception inutile. Si -1
est un index valide, le code suivant donnerait 3
au lieu de undefined
.
var arr = [1,2,3] console.log(arr[arr.indexOf(4)])
À mon humble avis, Python a commis une erreur en rendant les index négatifs valides, car cela entraîne de nombreuses conséquences étranges qui ne sont pas directement intuitives.
.slice(-N)[0
:
const string = 'ABC' console.log(string.substr(-1)) // 'C' console.log(string.substr(-2, 1)) // 'B' console.log(string.substr(-3, 1)) // 'A'
String
, vous avez une autre option (au lieu de [0
).
const string = 'ABC' console.log(string.slice(-1)) // 'C' console.log(string.slice(-2, -1)) // 'B' console.log(string.slice(-3, -2)) // 'A'
.substr (-N, 1)
:
const array = [1, 2, 3] console.log(array.slice(-1)[0]) // 3 console.log(array.slice(-2)[0]) // 2 console.log(array.slice(-3)[0]) // 1
efficacité douteuse, au niveau de la mémoire .. array.slice
crée un nouveau tableau de sorte que vous doublez potentiellement la consommation de mémoire (pire des cas).
La rétrocompatibilité est importante.
Parce qu'ils n'ont pas choisi de faire fonctionner JavaScript de cette façon?
@Herohtar c'est exactement ma question - pourquoi ont-ils fait de cette façon
Il est plus logique de ne pas le faire de cette façon. Python dicte que les clés entières négatives sont corrélées avec des index entiers autrement positifs. Je pense que l'hypothèse que cette abstraction apporte de la clarté est naïve.