web-dev-qa-db-fra.com

pourquoi typeof est "objet"?

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?

207
thetrystero

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.

193
Dipak Ingole

Si null est une primitive, pourquoi typeof(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:

  1. Soit val le résultat de l’évaluation UnaryExpression .
  2. Si Type ( val ) est Référence , alors
    une. Si IsUnresolvableReference ( val ) est vrai , retourne "undefined ".
    B. Soit val be GetValue ( val ).
  3. Renvoie une chaîne déterminée par Type ( val ) conformément au tableau 20.

enter image description here

63
Matt Ball

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éfinit null comme la valeur de la primitive qui représente l'absence intentionnelle de toute valeur d'objet (ECMA-262, 11.4. 11).

23
chryss

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!

6
Faisal Ashfaq

Si null est une primitive, pourquoi typeof(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

4
jobin