「Web開発者向けのプロフェッショナルJavascript」の第4章を読んでいますが、5種類のプリミティブは未定義、null、boolean、number、stringです。
null
がプリミティブの場合、なぜtypeof(null)
は"object"
を返すのですか?
null
が参照渡しされることを意味しないのですか(ここではすべてのオブジェクトが参照渡しされると仮定しています)。したがって、プリミティブではありません。
JavaScriptの最初の実装では、JavaScript値はtypeタグと値として表され、オブジェクトのtypeタグは0
であり、null
はNULL
ポインター(ほとんどのプラットフォームでは0x00
)として表されていました。その結果、nullは型タグとして0
を持っていたため、偽のtypeof
戻り値( reference )が返されました。
typeof null === 'object'; // This stands since the beginning of JavaScript
「修正」がECMAScriptに提案されました(オプトイン経由)。結果は次のとおりです。
typeof null === 'null'
...しかし、この変更は 却下 でした。これは、null
をテストするためにこの特定の "癖"を使用するコードに問題があるためです。
null
がプリミティブの場合、なぜtypeof(null)
は"object"
を返すのですか?
なぜなら、 仕様ではそう言っている 。
11.4.
typeof
演算子生成UnaryExpression:
typeof
UnaryExpressionは、次のように評価されます。
- valをUnaryExpressionの評価結果とします。
- Type (val)が Reference の場合、
a。 IsUnresolvableReference (val)がtrueの場合、「undefined
」。
b。 valを GetValue (val)とする。- 表20に従って Type (val)で決定された文字列を返します。
指摘されているように、仕様はそう述べています。しかし、JavaScriptの実装はECMAScript仕様の記述よりも前であり、仕様は初期実装の脆弱性を修正しないように注意していたため、そもそもなぜこのように行われたのかについての正当な疑問が残っています。ダグラス・クロックフォード それを間違いと呼ぶ 。キロリスク それはちょっと理にかなっていると思う :
この背後にある理由は、
null
は、undefined
とは対照的に、オブジェクトが表示される場所で頻繁に使用されている(まだ使用されている)ことです。つまり、null
は、オブジェクトへの空の参照を示すためによく使用されます。 Brendan EichがJavaScriptを作成したとき、彼は同じパラダイムに従い、「オブジェクト」を返すことは(ほぼ間違いなく)理にかなっています。実際、ECMAScript仕様ではnull
を、オブジェクト値が意図的に存在しないことを表すプリミティブ値(ECMA-262、11.4.11)として定義しています。
本から YDKJS
これはJSの長年のバグですが、おそらく修正されることはありません。 Web上のコードが多すぎるとバグに依存するため、それを修正するとさらに多くのバグが発生します。
null
がプリミティブの場合、なぜtypeof(null)
が "object
"を返すのですか?
要するに、それはECMAScriptのバグであり、タイプはnull
でなければなりません
参照: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null