Basiques
Vous ne le savez peut-être pas mais, en JavaScript, chaque fois que nous interagissons avec des chaînes, des nombres ou des primitives booléennes, nous entrons dans un monde caché d'ombres d'objets et de coercition.
string, number, boolean, null, undefined et symbol.
En JavaScript , il y a 7 types primitifs: undefined
, null
, boolean
, string
, number
, bigint
et symbol
. Tout le reste est un objet. Les types primitifs boolean
, string
et number
peuvent être enveloppés par leurs homologues de l' objet. Ces objets sont des instances du Boolean
, String
et les Number
constructeurs respectivement.
typeof true; //"boolean"
typeof new Boolean(true); //"object"
typeof "this is a string"; //"string"
typeof new String("this is a string"); //"object"
typeof 123; //"number"
typeof new Number(123); //"object"
Si les primitives n'ont pas de propriétés, pourquoi "this is a string".length
renvoie-t-elle une valeur?
Parce que JavaScript contraindra facilement les primitifs et les objets. Dans ce cas, la valeur de chaîne est forcée à un objet chaîne afin d'accéder à la longueur de la propriété. L'objet string n'est utilisé que pendant une fraction de seconde, après quoi il est sacrifié aux dieux de la collecte des ordures - mais dans l'esprit des émissions de découverte télévisée, nous allons piéger la créature insaisissable et la préserver pour une analyse plus approfondie ...
Pour illustrer cela davantage, considérons l'exemple suivant dans lequel nous ajoutons une nouvelle propriété au prototype du constructeur String.
String.prototype.sampleProperty = 5;
var str = "this is a string";
str.sampleProperty; // 5
Par ce moyen, les primitives ont accès à toutes les propriétés (y compris les méthodes) définies par leurs constructeurs d'objets respectifs.
Nous avons donc vu que les types primitifs contraindront de manière appropriée leur homologue Object respectif si nécessaire.
Analyse de toString()
méthode
Considérez le code suivant
var myObj = {lhs: 3, rhs: 2};
var myFunc = function(){}
var myString = "This is a sample String";
var myNumber = 4;
var myArray = [2, 3, 5];
myObj.toString(); // "[object Object]"
myFunc.toString(); // "function(){}"
myString.toString(); // "This is a sample String"
myNumber.toString(); // "4"
myArray.toString(); // "2,3,5"
Comme discuté ci-dessus, ce qui se passe vraiment, c'est lorsque nous appelons une toString()
méthode sur un type primitif, elle doit être forcée dans son homologue objet avant de pouvoir invoquer la méthode.
ie myNumber.toString()
équivaut àNumber.prototype.toString.call(myNumber)
et de même pour les autres types primitifs.
Mais que se passe-t-il si, au lieu que le type primitif soit passé dans la toString()
méthode de son homologue de la fonction de constructeur Object correspondante, nous forçons le type primitif à être passé en tant que paramètre sur la toString()
méthode du constructeur de la fonction Object ( Object.prototype.toString.call(x)
)?
Regardons de plus près Object.prototype.toString ()
Selon la documentation , lorsque la méthode toString est appelée, les étapes suivantes sont effectuées:
- Si la
this
valeur est undefined
, retournez "[object Undefined]"
.
- Si la
this
valeur est null
, retournez "[object Null]"
.
- Si cette valeur n'est aucune des réponses ci-dessus, Let
O
être le résultat de l'appel en toObject
passant la this
valeur comme argument.
- Soit class la valeur de la
[[Class]]
propriété interne de O
.
- Renvoie la valeur de chaîne qui est le résultat de concaténer les trois cordes
"[object "
, class
et "]"
.
Comprenez cela à partir de l'exemple suivant
var myObj = {lhs: 3, rhs: 2};
var myFunc = function(){}
var myString = "This is a sample String";
var myNumber = 4;
var myArray = [2, 3, 5];
var myUndefined = undefined;
var myNull = null;
Object.prototype.toString.call(myObj); // "[object Object]"
Object.prototype.toString.call(myFunc); // "[object Function]"
Object.prototype.toString.call(myString); // "[object String]"
Object.prototype.toString.call(myNumber); // "[object Number]"
Object.prototype.toString.call(myArray); // "[object Array]"
Object.prototype.toString.call(myUndefined); // "[object Undefined]"
Object.prototype.toString.call(myNull); // "[object Null]"
Références:
https://es5.github.io/x15.2.html#x15.2.4.2
https://es5.github.io/x9.html#x9.9
https://javascriptweblog.wordpress.com/ 2010/09/27 / la-vie-secrète-des-primitives-javascript /