En javascript, puis-je remplacer les crochets pour accéder aux caractères d'une chaîne?

StackOverflow https://stackoverflow.com/questions/255041

  •  05-07-2019
  •  | 
  •  

Question

Existe-t-il un moyen de définir String [int] afin d'éviter d'utiliser String.CharAt (int) ?

Était-ce utile?

La solution

Non, il n'y a pas de moyen de le faire.

C’est une question courante des développeurs qui utilisent JavaScript dans un autre langage, où les opérateurs peuvent être définis ou remplacés par pour un certain type.

En C ++, il n'est pas totalement hors de question de surcharger opérateur * sur MyType , ce qui aboutit à un opérateur astérisque unique pour les opérations impliquant des objets de type . Mon type . La lisibilité de cette pratique pourrait encore être remise en question, mais le langage lui en permet néanmoins.

En JavaScript, cela n’est tout simplement pas possible. Vous ne pourrez pas définir de méthode permettant d'indexer les caractères d'une Chaîne à l'aide de crochets.

@Lee Kowalkowski fait ressortir un bon point, à savoir qu'il est en quelque sorte possible d'accéder aux caractères à l'aide des crochets, car les crochets peuvent être utilisés pour accéder aux membres d’un tableau JavaScript. Cela impliquerait la création d'un nouveau tableau , en utilisant chacun des caractères de la chaîne en tant que membres, puis l'accès au tableau .

C'est probablement une approche déroutante. Certaines implémentations de JavaScript donneront accès à une chaîne via les crochets, d'autres non, ce n'est donc pas une pratique courante. L'objet peut être confondu avec une chaîne, et comme JavaScript est un langage mal typé, il existe déjà un risque de représentation incorrecte d'un type. Définir un tableau uniquement dans le but d’utiliser une syntaxe différente de celle fournie par le langage n’est que pour promouvoir ce type de confusion. Cela donne lieu à la question de @Andrew Hedges : "Pourquoi lutter contre la langue?" ..

Il existe des modèles utiles dans JavaScript pour la surcharge de fonctions légitimes et l'héritage polymorphe . Ce n'est pas un exemple de l'un ou l'autre.

La sémantique mise à part, les opérateurs n'ont toujours pas été remplacés.

Remarque latérale: les développeurs habitués aux conventions de vérification de type stricte et d'héritage classique sont parfois déroutés par la syntaxe de la famille C de JavaScript. Sous le capot, cela fonctionne d'une manière peu familière. Il est préférable d'écrire JavaScript de manière propre et sans ambiguïté, afin d'éviter toute confusion.

Autres conseils

Remarque: Avant que quiconque d'autre veuille voter contre ma réponse, la question à laquelle j'ai répondu était la suivante:

  

Indexeurs de chaînes javascript IE

     

Existe-t-il un moyen de définir string [int] pour éviter l'utilisation de string.CharAt (int)? "

Rien à propos des crochets, de la syntaxe ou des meilleures pratiques en particulier, la question que l'on vient de demander "d'une certaine manière". (Et la seule autre réponse a été "Non, il n'y en a pas.")

Eh bien, il y a en fait une sorte de:

var newArray = oldString.split(''); 

... vous pouvez maintenant accéder à newArray en utilisant la notation entre crochets, car vous venez de le convertir en tableau.

Utilisez String.charAt () .

Il s’agit de standard et dans tous les navigateurs .

Dans les navigateurs non-IE, vous pouvez utiliser la notation entre crochets pour accéder aux caractères suivants:

"TEST"[1]; // = E

Vous pouvez convertir une chaîne en un tableau de caractères en procédant ainsi:

var myString = "TEST";
var charArray = myString.split(''); // charArray[1] == E

Celles-ci seraient découragées. Il n'y a aucune raison de ne pas utiliser la méthode charAt () et rien ne sert de plus.

Ceci n’est pas une réponse, mais une astuce (fortement déconseillée!). Cela montre notamment qu'en Javascript, vous pouvez faire ce que vous voulez. C’est juste une question de fantaisie.

Vous pouvez utiliser le fait que vous pouvez définir toutes les propriétés supplémentaires sur Objet chaîne comme sur toutes les autres, afin de pouvoir créer les propriétés String.0, String.1, ...:

String.prototype.toChars = function()  {
    for (var i=0; i<this.length; i++) {
        this[i+""] = this.charAt(i);
    }
};

Vous pouvez désormais accéder à des caractères uniques à l'aide de:

var str = "Hello World";
str.toChars();
var i = 1+"";
var c = str[i]; // "e"

Notez que cela n’est utile que pour l’accès. Ce devrait être une autre méthode définie pour affecter les caractères de chaîne de cette manière.

Notez également que vous devez appeler la méthode .toChars () chaque fois que vous modifiez l'aiguillon.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top