「Web開発者向けのプロフェッショナルJavascript」の第4章を読んでいますが、プリミティブには、未定義、null、ブール、数値、文字列の5種類があることがわかります。
null
がプリミティブである場合、なぜtypeof(null)
returnするの"object"
ですか?
それはそれnull
が参照によって渡されることを意味しませんか?
「Web開発者向けのプロフェッショナルJavascript」の第4章を読んでいますが、プリミティブには、未定義、null、ブール、数値、文字列の5種類があることがわかります。
null
がプリミティブである場合、なぜtypeof(null)
returnするの"object"
ですか?
それはそれnull
が参照によって渡されることを意味しませんか?
回答:
null
//これはJavaScriptの最初から存在します typeof null === 'オブジェクト';JavaScriptの最初の実装では、JavaScript値はタイプタグと値として表されていました。オブジェクトのタイプタグは0
null
でした。NULLポインタ(ほとんどのプラットフォームでは0x00)として表されていました。その結果、nullはタイプタグとして0を持っていたため、「オブジェクト」のtypeof
戻り値が返されました。(参考)(オプトインを介して)ECMAScriptの修正が提案されましたが、拒否されました。それは結果になりました
typeof null === 'null'
。
null
がプリミティブである場合、なぜtypeof(null)
returnするの"object"
ですか?
そのため仕様はそう言います。
11.4.3ザ・
typeof
オペレータプロダクションUnaryExpression:
typeof
UnaryExpressionは次のように評価されます。
- してみましょうvalが評価した結果であるUnaryExpressionを。
- 場合タイプ(valが)ある参考その後、
。場合IsUnresolvableReference(valが)である真、 "返しますundefined
"。
b。してみましょうVALなります GetValueメソッド(ヴァル)。- 表20に従って、タイプ(val)によって決定される文字列を返します。
typeof
は、何かに対してメソッドを呼び出すことができるかどうかについては何も教えません。
null
および以外のメソッドを呼び出すことができますundefined
。
.
または[ ]
)。
指摘されたように、仕様はそう述べています。しかし、JavaScriptの実装はECMAScript仕様の作成よりも前であり、仕様は最初の実装の問題を修正しないように注意していたため、そもそもなぜこのように行われたのかについては正当な疑問が残っています。ダグラス・クロックフォードはそれを間違いと呼んでいる。Kiro Risk は、それはちょっと理にかなっていると考えています:
これの背後にある理由は、
null
とは対照的にundefined
、オブジェクトが表示される場所で頻繁に使用された(そして現在も使用されている)ことです。つまり、null
オブジェクトへの空の参照を示すためによく使用されます。ブレンダンアイヒが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
この動作を行うコードに興味がある人にとっては、これはあなたへのリンクです... なぜtypeof nullが実装を伴う オブジェクトなのか