typeofが「オブジェクト」である理由


241

「Web開発者向けのプロフェッショナルJavascript」の第4章を読んでいますが、プリミティブには、未定義、null、ブール、数値、文字列の5種類があることがわかります。

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

それはそれnullが参照によって渡されることを意味しませんか?


50
回答:仕様がそう言っているからです。これは一般に間違いと見なされます。
SLaks 2013

5
typeofは関数ではなく演算子であり(実際、その後の括弧を省略できます)、参照による受け渡しについてここで説明しても意味がないことに注意してください。「JavaScript:The Good Parts」という本は、付録AのセクションA.6のtypeof null === 'object'が「Awful Parts」というタイトルであることに言及しています。
ジョン・ソンダーソン

5
「Awful Parts」を読みたいと思います
オースティンハイマン

1
大きな間違い、計り知れない!:)
アレクサンダーミルズ

2
変数が保持している値のタイプを確認するために、typeofの代わりに何を使用する必要がありますか?ブール値、文字列、数値、配列、オブジェクト、関数、記号、null、未定義、NaN)の間にあるものを知りたい
Costa

回答:


219

オペレーターの動作に関するMDNページtypeofから:

null

//これはJavaScriptの最初から存在します
typeof null === 'オブジェクト';

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

(オプトインを介して)ECMAScriptの修正が提案されましたが、拒否されました。それは結果になりましたtypeof null === 'null'


137
それは...この変化は、少なくともstrictモードにそれをしなかった残念だ
インゴ・バーク

人々はこの癖を利用しており、これが拒否されなかった場合、そこにある多くのコードを変更する必要があると思います
Cold Cerberus

これによってコードを変更したい少数の生きている人々にとっては、残りの開発者がそれを学ぶ必要がある残りの時間よりも、より理にかなっています。人がまだ存在していないからといって、必ずしも関係ないという意味ではなく、単に無防備であることを意味します。
Seph Reed

とにかくこれをnullチェックとして使用する理由は理解できません。直感的に理解できないので、なぜそれを使用するのでしょうか?コーディングが不適切なため、変更を追加できません。
Emobe

69

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

そのため仕様はそう言います

11.4.3ザ・typeofオペレータ

プロダクションUnaryExpressiontypeof UnaryExpressionは次のように評価されます。

  1. してみましょうvalが評価した結果であるUnaryExpressionを
  2. 場合タイプvalが)ある参考その後、
       。場合IsUnresolvableReferencevalが)である、 "返しますundefined"。
       b。してみましょうVALなります GetValueメソッドヴァル)。
  3. 表20に従って、タイプval)によって決定される文字列を返します。

ここに画像の説明を入力してください


@peter typeofは、何かに対してメソッドを呼び出すことができるかどうかについては何も教えません。
マットボール

2
私の知る限り、nullおよび以外のメソッドを呼び出すことができますundefined
マットボール

4
@peter文字列プリミティブでメソッドを呼び出すことはできませんが、ありがたいことに、文字列プリミティブ(および数値プリミティブとブールプリミティブ)は、プロパティでプリミティブの1つを使用すると、暗黙的かつ自動的に文字列、数値、ブールラッパーで「自動ボックス化」されます。参照演算子(.または[ ])。
指摘された

28

指摘されたように、仕様はそう述べています。しかし、JavaScriptの実装はECMAScript仕様の作成よりも前であり、仕様は最初の実装の問題を修正しないように注意していたため、そもそもなぜこのように行われたのかについては正当な疑問が残っています。ダグラス・クロックフォードはそれを間違いと呼んでいる。Kiro Risk は、それはちょっと理にかなっていると考えています

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


3
私は今ビデオを見つけることができないので、私はこれを好奇心の強い人々のために参照なしで投稿します:Crockfordはnullの型の解決のゼロ値が型配列のゼロのインデックス付き要素を指す方法を説明したので、これは明らかでした彼らのブラウザのJSを逆コンパイルして再コンパイルする場合、マイクロソフトの連中が誤って伝播バグ開発
アクセル・コスタスペーニャ

6

YDKJSから

これはJSの長年のバグですが、決して修正されることはないでしょう。Web上のコードが多すぎるとバグに依存するため、それを修正するとさらに多くのバグが発生します。


1
すべてが本に書かれていると信頼しないでください。私はその本が大好きですが、JavaScriptのECMA仕様ではnullの型はオブジェクトである必要があると規定されているため、このバグを考慮することはできません。
andreasonny83 2018

4

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

つまり、ECMAScriptのバグであり、タイプは null

リファレンス:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null


1
あなたの参照のどこにもそれがバグであることを述べていません。
user2867288 2017

1
また、仕様のどこにもtypeofが「未定義」、「オブジェクト」、「ブール値」、「数値」、「文字列」、「関数」、および「記号」以外を返す必要があるとは記載されていません(ECMAScript 2015)
Brad Kent

1

JavaScriptではnullは「何も」ではありません。存在しないものと思われます。残念ながら、JavaScriptでは、nullのデータ型はオブジェクトです。typeof nullがオブジェクトであるというJavaScriptのバグと考えることができます。nullである必要があります。


0

JavaScriptでは、typeof nullは「オブジェクト」であり、nullがオブジェクトであることを誤って示唆しています。これはバグであり、残念ながら既存のコードを壊してしまうため修正できません。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.