Je lis le chapitre 4 de 'Javascript professionnel pour les développeurs Web' et il me dit que les cinq types de primitives sont les suivants: undefined, null, boolean, number et string.
Si null
est une primitive, pourquoi typeof(null)
renvoie-t-il "object"
?
Cela ne signifie-t-il pas que null
est passé par référence (je suppose ici que tous les objets sont passés par référence), ce qui en fait un NON primitif?
Dans la première implémentation de JavaScript, les valeurs JavaScript étaient représentées sous la forme d'une balise de type et d'une valeur, la balise de type pour les objets étant 0
, et null
était représenté par le pointeur NULL
(0x00
sur la plupart des plateformes). En conséquence, null avait 0
en tant que balise de type, d'où la valeur erronée typeof
de retour ( référence ).
typeof null === 'object'; // This stands since the beginning of JavaScript
Un "correctif" a été proposé pour ECMAScript (via un opt-in). Cela aurait eu pour résultat:
typeof null === 'null'
... mais cette modification était rejetée , en raison de problèmes de code utilisant ce "bizarrement" spécifique pour tester null
.
Si
null
est une primitive, pourquoitypeof(null)
renvoie-t-il"object"
?
Parce que la spécification le dit .
11.4. L'opérateur
typeof
La production UnaryExpression :
typeof
UnaryExpression est évaluée comme suit:
- Soit val le résultat de l’évaluation UnaryExpression .
- Si Type ( val ) est Référence , alors
une. Si IsUnresolvableReference ( val ) est vrai , retourne "undefined
".
B. Soit val be GetValue ( val ).- Renvoie une chaîne déterminée par Type ( val ) conformément au tableau 20.
Comme il a été souligné, la spécification le dit. Mais comme l’implémentation de JavaScript est antérieure à l’écriture de la spécification ECMAScript, et que la spécification a pris soin de ne pas corriger les faiblesses de l’implémentation initiale, la question de savoir pourquoi cela a été fait de cette manière demeure légitime. Douglas Crockford appelle cela une erreur . Kiro Risk pense que c'est plutôt logique :
Le raisonnement derrière cela est que
null
, contrairement àundefined
, était (et est toujours) souvent utilisé là où les objets apparaissent. En d'autres termes,null
est souvent utilisé pour désigner une référence vide à un objet. Lorsque Brendan Eich a créé JavaScript, il a suivi le même paradigme et il était logique (sans doute) de renvoyer "objet". En fait, la spécification ECMAScript définitnull
comme la valeur de la primitive qui représente l'absence intentionnelle de toute valeur d'objet (ECMA-262, 11.4. 11).
Extrait du livre YDKJS
Il s'agit d'un bogue de longue date dans JS, mais qui ne sera probablement jamais corrigé. Trop de code sur le Web repose sur le bogue et le corriger causerait donc beaucoup plus de bogues!
Si
null
est une primitive, pourquoitypeof(null)
renvoie-t-il "object
"?
en bref: c'est un bogue dans ECMAScript, et le type devrait être null
référence: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null