なぜ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はオブジェクトに過ぎないことを通知しました。

経由で

Source: https://habr.com/ru/post/J200664/


All Articles