web-dev-qa-db-ja.com

なぜtypeof nullの「オブジェクト」なのですか?

「Web開発者向けのプロフェッショナルJavascript」の第4章を読んでいますが、5種類のプリミティブは未定義、null、boolean、number、stringです。

nullがプリミティブの場合、なぜtypeof(null)"object"を返すのですか?

nullが参照渡しされることを意味しないのですか(ここではすべてのオブジェクトが参照渡しされると仮定しています)。したがって、プリミティブではありません。

198
thetrystero

JavaScriptの最初の実装では、JavaScript値はtypeタグと値として表され、オブジェクトのtypeタグは0であり、nullNULLポインター(ほとんどのプラットフォームでは0x00)として表されていました。その結果、nullは型タグとして0を持っていたため、偽のtypeof戻り値( reference )が返されました。

 typeof null === 'object'; // This stands since the beginning of JavaScript

「修正」がECMAScriptに提案されました(オプトイン経由)。結果は次のとおりです。

typeof null === 'null'

...しかし、この変更は 却下 でした。これは、nullをテストするためにこの特定の "癖"を使用するコードに問題があるためです。

186
Dipak Ingole

nullがプリミティブの場合、なぜtypeof(null)"object"を返すのですか?

なぜなら、 仕様ではそう言っている

11.4.typeof演算子

生成UnaryExpressiontypeofUnaryExpressionは、次のように評価されます。

  1. valUnaryExpressionの評価結果とします。
  2. Typeval)が Reference の場合、
    a。 IsUnresolvableReferenceval)がtrueの場合、「undefined」。
    b。 valGetValueval)とする。
  3. 表20に従って Typeval)で決定された文字列を返します。

enter image description here

62
Matt Ball

指摘されているように、仕様はそう述べています。しかし、JavaScriptの実装はECMAScript仕様の記述よりも前であり、仕様は初期実装の脆弱性を修正しないように注意していたため、そもそもなぜこのように行われたのかについての正当な疑問が残っています。ダグラス・クロックフォード それを間違いと呼ぶ 。キロリスク それはちょっと理にかなっていると思う

この背後にある理由は、nullは、undefinedとは対照的に、オブジェクトが表示される場所で頻繁に使用されている(まだ使用されている)ことです。つまり、nullは、オブジェクトへの空の参照を示すためによく使用されます。 Brendan EichがJavaScriptを作成したとき、彼は同じパラダイムに従い、「オブジェクト」を返すことは(ほぼ間違いなく)理にかなっています。実際、ECMAScript仕様ではnullを、オブジェクト値が意図的に存在しないことを表すプリミティブ値(ECMA-262、11.4.11)として定義しています。

21
chryss

本から YDKJS

これはJSの長年のバグですが、おそらく修正されることはありません。 Web上のコードが多すぎるとバグに依存するため、それを修正するとさらに多くのバグが発生します。

5
Faisal Ashfaq

nullがプリミティブの場合、なぜtypeof(null)が "object"を返すのですか?

要するに、それはECMAScriptのバグであり、タイプはnullでなければなりません

参照: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null

4
jobin