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,
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 ()