Question

par http: //www.ecma- international.org/publications/files/ECMA-ST/ECMA-262.pdf , JavaScript dispose de 6 types:. undefined, null, boolean, string, number et object

var und;
console.log(typeof und); // <-- undefined

var n = null;
console.log(typeof n); // <--- **object**!

var b = true;
console.log(typeof b); // <-- boolean

var str = "myString"
console.log(typeof str); // <-- string

var int = 10;
console.log(typeof int); // <-- number

var obj = {}
console.log(typeof obj); // <-- object

Question 1:

Pourquoi est nul de type object au lieu de null?

Question 2:

Qu'en est-il des fonctions?

var f = function() {};
console.log(typeof f); // <-- function

Variable f a le type de function. Pourquoi pas spécifié dans la spécification comme un type distinct?

Merci,

Était-ce utile?

La solution

A propos typeof null == 'object', ceci est une erreur qui vient depuis les premiers jours, et malheureusement cette erreur va rester avec nous pendant longtemps, il était trop tard à fixer dans le ECMAScript 5 Spécification édition

A propos de Fonctions , ils ne sont que des objets, mais ils ont une propriété interne spéciale nommée [[Call]] qui est utilisée en interne lorsqu'une fonction est appelée.

Le typeof opérateur distinction entre les objets simples et les fonctions que par vérifier si l'objet a cette propriété interne.

Autres conseils

Il est parce que typeof est définie pour renvoyer « objet » si l'entrée est null et retour « fonction » si l'entrée est appelable. (Voir 11.4.3 L'opérateur de typeof.)

Je ne sais pas pourquoi la norme est définie comme celui-ci ( et Crockford dit qu'il est faux ). Peut-être la compatibilité arrière.

Réponse à la question 1:

Une propriété, quand il n'a pas de définition, est définie. La valeur null raison est un objet est donc qu'une propriété peut exister sans valeur ont encore encore une définition.

typeof null === "object" parce que la spécification dit que oui, mais c'est une erreur de la première version de JavaScript. (Comme KennyTM dit ci-dessus).

typeof f === "function" parce que, sans try / catch, il n'y a pas d'autre fiable, moyen infaillible pour déterminer si quelque chose est appelable. En utilisant f.constructor === Function peut travail, mais je pense qu'il est pas garanti d'être.

Pour être complet, notez que la façon la plus pratique actuelle pour vérifier les informations de type est quelque chose comme ceci:

var typeInfo = Object.prototype.toString.call(yourObject);

Cela vous donne une chaîne qui ressemble à « [Quelque chose d'objet] », où « quelque chose » est un nom de type.

null est une forte valeur spéciale, il est pas faux, il est 0, ou la chaîne vide ou NaN ou non définie.

null est ce que vous obtenez lorsque vous cherchez un objet qui n'est pas there- pas une propriété non définie d'un objet, mais la chose elle-même.

un paragraphe avec un textNode renvoie null pour le nextSibling nœuds, une expression rationnelle que does'n rendements de correspondance nulle à la place de la matrice et ainsi de suite.

peut-être qu'il devrait avoir son propre type, mais il commence à être quelque chose, un quelque chose avec un type, au lieu de l'absence d'un objet.

Il est Array.prototype aussi bien.

  • Object.prototype
  • Array.prototype
  • Function.prototype
  • Number.prototype
  • String.prototype
  • Boolean.prototype

Crockford dit de ne pas utiliser:

  • nouveau numéro ()
  • new String ()
  • new Boolean ()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top