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