なぜtypeof null === 'object'?

すべてのJavaScriptプログラマーは、 typeof null === 'object'; // true



という事実に長い間慣れていtypeof null === 'object'; // true



typeof null === 'object'; // true



。ただし、実際にはnullはプリミティブな値です。 多くの人々はこれがバグであることを知っており、個人的にはBrandan Ike これを認識しています。 このバグは、既存のコードと新しいバージョンの言語との後方互換性を維持する必要があるため、修正されることはないでしょう。



興味深い話は、それがどのようにして生まれたのかです。 言語の最初のバージョン、つまり、変数の値が次の形式で32ビットセルに格納されていたという事実に戻ります。

29-31ビット:値自体。

1-3ビット:データ型ラベル。



タイプラベルオプションは5つしかありませんでした。

000:オブジェクト。

1:整数;

010:ダブル;

100:文字列;

110:ブール値;



したがって、最下位ビットが1に等しい場合、残りの31ビットは整数として解釈されました。 0の場合、次の2ビットの値に応じてタイプが決定されます。



2つの特別な予約値もありました。



未定義(JSVAL_VOID)-整数–2 30

null(JSVAL_NULL)は、NULL(マシンコードNULLポインター)へのポインターです。つまり、オブジェクトのラベルとその数値表現への参照はゼロです。



そのため、typeofはnullをオブジェクトとして定義し始めたことがわかりました。彼は型ラベルをチェックし、nullはオブジェクトに過ぎないことを通知しました。



経由で



All Articles