Quel est le point de new String(“x”) en JavaScript?
Quels sont les cas d'utilisation pour faire new String("already a string")
?
Quel est le but de tout cela?
Vous devez vous connecter pour publier un commentaire.
Quels sont les cas d'utilisation pour faire new String("already a string")
?
Quel est le but de tout cela?
Vous devez vous connecter pour publier un commentaire.
Il y a très peu d'utilité pratique pour
String
objets créés parnew String("foo")
. Le seul avantage d'unString
objet a plus d'une primitive de la chaîne de valeur est qu'un objet, on peut stocker propriétés:Si vous n'êtes pas sûr de ce que les valeurs peuvent être transmis à votre code alors je vous suggère d'avoir de plus gros problèmes dans votre projet. Pas de JavaScript natif objet, de la grande bibliothèque ou DOM méthode qui renvoie une chaîne de caractères sera de retour d'une
String
objet plutôt qu'une chaîne de valeur. Toutefois, si vous voulez être absolument sûr que vous avez une chaîne de valeur plutôt qu'uneString
objet, vous pouvez convertir comme suit:Si la valeur que vous êtes à la vérification pourrait être n'importe quel objet, vos options sont les suivantes:
Ne vous inquiétez pas sur les objets String et il suffit d'utiliser typeof. Ce serait ma recommandation.
typeof str == "string"
.Utiliser instanceof ainsi que typeof. Généralement, cela fonctionne, mais a l'inconvénient de retour d'un faux négatif pour une Chaîne de caractères de l'objet créé dans une autre fenêtre.
typeof str == "string" || str instanceof String
Utilisation duck-typing. Vérifier l'existence d'un ou plusieurs Chaîne de méthodes spécifiques, telles que la fonction substring() ou toLowerCase(). C'est clairement imprécis, puisqu'il sera de retour un faux positif pour un objet qui se trouve à avoir une méthode avec le nom que vous êtes vérifier, mais il sera suffisant dans la plupart des cas.
typeof str == "string" || typeof str.substring == "function"
str = "" + str;
convertit tout pour une chaîne de caractères. Si vous ne voulez convertir des objets String pour les chaînes (et le Nombre d'objets à des nombres, etc.), mais sinon, laisser les choses seul, vous pouvez écrirestr = str.valueOf()
.Javascript créateurs créé des wrappers pour les types de base comme string ou int juste pour le rendre similaire à java. Malheureusement, si someome fait new String("x") le type de l'élément sera "objet" et non pas "chaîne".
String
les objets ont des propriétés, tandis que la chaîne de primitives peuvent pas:Et
String
les objets peuvent être héritées d', tandis que la chaîne de primitives peuvent pas:String
objets ne peuvent être égaux à eux-mêmes, pas d'autresString
les objets ayant la même valeur, alors que les primitives avec la même valeur sont considérés comme égaux:Vous pourriez mettre en œuvre la surchargecomme comportement:
Ou spécifier argument objectif:
Ou le suivi d'objets:
L'existence de
String
des objets et de la chaîne de primitives efficacement vous de chaîne de deux "types" en Javascript avec des comportements différents et, par conséquent, les utilisations. Il en va ainsi pourBoolean
etNumber
des objets et de leurs sociétés primitives trop.Attention, cependant, à faire passer la corde (ou d'autres) primitives comme la valeur de
this
lors de l'utilisation de la fonction méthodesbind()
,call()
etapply()
, la valeur sera convertie enString
un objet (ou uneBoolean
ou unNumber
objet, en fonction de la primitive) avant d'être utilisée commethis
:Et inattendu/contre-intuitif types de retour:
Vous pouvez utiliser
instanceof
si vous voulez vraiment être parano:La
instanceof
de l'opérateur gèrent correctement les sous-classes de la Chaîne de trop:Je ne pense pas que j'ai jamais utilisé la classe String en JavaScript, mais il n'y a rien de mal à être paranoïaque, et visant l'exactitude.
Dans la plupart des cas vous travaillez seul et pouvez contrôler vous-même, ou sur une équipe et il y a une équipe de directive, ou l'on peut voir le code que vous travaillez avec, donc il ne devrait pas être un problème. Mais vous pouvez toujours être en sécurité:
Mise à jour
N'ai pas si bien sur les implications que cela, bien qu'il semble fonctionner:
De sûr, vous devriez vérifier si l'objet a un constructeur (c'est à dire si c'est un objet).
De sorte que vous pourriez avoir:
Bien que je suggère que vous venez d'utiliser typeof et "chaîne", un utilisateur doit connaitre pour passer dans le cadre d'un littéral de chaîne.
Je note cette méthode est sans doute sensibles à quelqu'un la création d'un objet et la valeur du constructeur à être
String
(ce qui serait en effet complètement obscur), même si elle n'est pas une chaîne...constructor
propriété n'est pas assez. Il pourrait y étrange, les gens là-bas qui sous-classe String en JavaScript.instanceof
il ressemble à l'OP était juste d'essayer de différencier un objet, un littéral de chaîne etnew String('blah')
. Peu importe, l'idée est là, on peut pinailler toute la journée.Pourquoi avez-vous besoin de vérifier si elle est en string?
Il suffit de vérifier si elle est définie, ou la valeur null, et sinon défensivement convertir à n'importe quel type que vous voulez, que ce soit la
var bar = new String(foo);
ouvar bar = "" + foo;
.Vous pouvez également convertir un objet Chaîne de caractères (avec quoi que ce soit d'autre) d'une Chaîne de caractères primitifs avec
toString
:var str = new String("foo");
typeof str; //object
typeof str.toString(); //string