Il semble que lorsque vous utilisez un type primitif (chaîne, nombre) comme objet this
d'un appel de fonction (en tant que premier argument de function.call() ou de function apply()), le type primitif est promu à son objet équivalent (par exemple, une chaîne se transforme en chaîne).Pourquoi javascript change-t-il les types primitifs lorsqu'il est passé dans function.apply() ou function.call()?
À titre d'illustration:
var f = function(x) { return [typeof(this), typeof(x)]; }
var obj = '123'
f.call(obj, obj)
>>> ["object", "string"]
C'est, « ce » devient un objet (il est un objet de chaîne, je l'ai vérifié) tandis que le second argument pour appeler devient le premier argument de la fonction « f » et reste une chaîne primitive.
Les objets sont à la fois "123", mais les choses subtiles ne fonctionnent pas (par exemple, ils sont égaux en termes de "==" mais pas en termes de "===").
J'ai remarqué ce comportement dans Chrome et Firefox, donc je suppose qu'il y a une raison spécifique pour cela. J'ai cherché, mais je n'ai trouvé aucune explication. J'apprécierais toute explication, j'espère avec une sorte de lien vers la documentation expliquant les règles autour de cela et pourquoi cela se produit.
Vraiment bien trouver J-P. Question très intéressante (et réponse ofc). Un moins WTF JavaScript pour moi atleast =) – anddoutoi
Non seulement cela semble être juste, mais c'est tout à fait exact. Excellente source. –
Ahh, merci beaucoup! Je suis curieux de savoir pourquoi toObject() est appelé, mais je ne suppose pas que le raisonnement soit dans la spécification n'importe où. Je me souviens avoir lu quelque part que les méthodes sur les chaînes primitives sont résolues en les convertissant temporairement en objet String et en retour, donc c'est vraisemblablement un cas similaire ... – gfxmonk