2
votes

Pourquoi ne puis-je pas faire de tableau [-1] en JavaScript?

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 commentaires

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.


4 Réponses :


17
votes

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]);


3 commentaires

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 .



11
votes

Vous pouvez utiliser 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]);

L'accès aux propriétés Javascript a toujours fonctionné de cette façon - donc, changer les choses pour que [-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>


0 commentaires

4
votes

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.


0 commentaires

2
votes

Utilisez .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'

Dans les 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'

Ou en utilisant .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

1 commentaires

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).