2010-09-08 43 views
3

Comment se fait-il Object.prototype.toString === toString? Si je présente dans la portée globale:JavaScript: toString

var toStringValue = toString.call("foobaz"); 

Je me attends toStringValue être la valeur de window.toString parce window est la portée par défaut, non? Comment se fait-il que toString se résout à Object.prototype.toString au lieu de window.toString?

Répondre

4

Les résultats que vous obtiendrez dépendront de l'environnement hôte. Si je lance ceci:

alert(toString === window.toString); 
alert(toString === Object.prototype.toString);​ 

... sur Chrome et je reçois truefalse, respectivement; sur Firefox, je reçois false et false. IE donne true et falsemais voir ci-dessous.

L'objet fenêtre sur les navigateurs est un peu délicat, car il s'agit d'un objet hôte, et les objets hôtes peuvent faire des choses étranges s'ils le souhaitent. :-) Par exemple, votre toString.call("foobaz") va échouer sur IE, car le toString de window n'est pas une véritable fonction JavaScript et n'a pas call ou apply. (Je ne dis pas que c'est correct d'être ainsi, vous comprenez ...)

+0

Est-ce la raison pour laquelle les frameworks ont tendance à mettre en cache 'Object.prototype.toString' localement? – Jeremy

+1

@Jeremy: Non, ils le font juste pour sauvegarder le chercher tout le temps ('Object.prototype.toString' est deux recherches de propriétés et potentiellement un tas de traversées/recherches de portée); saisir la valeur d'un local peut être beaucoup plus rapide et plus concis). Ils veulent une référence pratique car 'Object.prototype.toString' est l'un des moyens de comprendre ce qu'est un objet. Détails: http://blog.niftysnippets.org/2010/09/say-what.html –