Pourquoi le symbole ne peut-il pas être créé avec new dans JS

Notez que de nombreux types de données de base de js peuvent être créés avec new , mais Symbol, en tant que nouveau type de données js, ne peut pas être créé de cette manière. Les types de données de base peuvent être créés avec new pour obtenir des objets wrapper au lieu de littéraux.

Similaire à la différence entre new String("hello") et "hello" en Java

Il s'agit d'un point différent créé avec new , on peut donc supposer que l'officiel ne veut pas que nous obtenions un objet d'emballage de type Symbol . Cependant, l'objet wrapper peut toujours être obtenu via la méthode Object().
Voici quelques extensions :

La différence entre créer un objet avec new et créer un objet sans new

Dans la documentation MDN , nous pouvons voir l'explication suivante :

  1. Créez un objet JavaScript simple vide (c'est-à-dire {});
  2. Ajoutez l'attribut proto à l'objet nouvellement créé à l'étape 1 et liez cet attribut à l'objet prototype du constructeur ;
  3. Utilisez l'objet nouvellement créé à l'étape 1 comme contexte de ceci ;
  4. Si la fonction ne renvoie pas d'objet, celui-ci est renvoyé .

C'est-à-dire que new Foo() appelle essentiellement la méthode Foo(), mais le nouveau mot-clé effectue quelques opérations supplémentaires dessus. De là, la conclusion suivante peut être tirée :

Comment Symbol sait-il que nous utilisons le nouveau mot-clé en interne

Il existe de nombreuses façons de juger s'il faut utiliser new , ici nous supposons que la fonction Symbol() est la suivante :

function Symbol(){
    
    
	//native code here
	if(this instanceof Symbol){
    
    
		throw new Error('Uncaught TypeError: A is not a constructor')
	}
}

Étant donné que le nouveau mot-clé renverra un objet et que __proto__ pointera vers l'objet prototype, une erreur se produira.
Mais seulement lorsque la méthode Symbol() renvoie une valeur, son type de données est le type de données de base 'symbol'. L'utilisation de instanceof nécessite au moins que l'opérande gauche soit un type d'objet, donc la valeur de retour est fausse et aucune erreur ne sera signalée .

Je suppose que tu aimes

Origine blog.csdn.net/weixin_55658418/article/details/128802465
conseillé
Classement