24

http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdfによると、JavaScript には 、 、 、 、 の 6 つundefinednullタイプbooleanstringありnumberますobject

var und;
console.log(typeof und); // <-- undefined

var n = null;
console.log(typeof n); // <--- **object**!

var b = true;
console.log(typeof b); // <-- boolean

var str = "myString"
console.log(typeof str); // <-- string

var int = 10;
console.log(typeof int); // <-- number

var obj = {}
console.log(typeof obj); // <-- object

質問1:

objectの代わりにnull 型が使用されるのはなぜnullですか?

質問2:

関数はどうですか?

var f = function() {};
console.log(typeof f); // <-- function

変数fの型はfunctionです。別のタイプとして仕様で指定されていないのはなぜですか?

ありがとう、

4

7 に答える 7

13

についてtypeof null == 'object'は、これは初期の頃からの間違いであり、残念ながらこの間違いは長い間残るでしょう。ECMAScript 5th Edition 仕様で修正するには遅すぎました。

functionsについては、それらは単なるオブジェクトですが[[Call]]、関数が呼び出されたときに内部で使用されるという名前の特別な内部プロパティがあります。

オペレーターはtypeof、オブジェクトがこの内部プロパティを持っているかどうかをチェックするだけで、単純なオブジェクトと関数を区別します。

于 2010-03-25T18:58:25.763 に答える
5

これtypeofは、入力が。の場合は「オブジェクト」を返しnull、入力が呼び出し可能の場合は「関数」を返すように定義されているためです。(11.4.3typeofオペレーターを参照してください。)

なぜ標準がこのように定義されているのかわかりません(そしてCrockfordはそれが間違っていると言いました)。多分後方互換性。

于 2010-03-25T18:28:22.777 に答える
0

typeof null === "object"仕様にはそう書かれているからですが、これはJavaScriptの最初のバージョンからの間違いです。(KennyTMが上で言ったように)。

typeof f === "function"なぜなら、try/catchがないと、何かが呼び出可能かどうかを判断するための信頼できる、絶対確実な方法が他にないからです。使用することはうまくいくf.constructor === Function かもしれませんが、そうなるとは限りません。

于 2010-03-25T18:53:44.320 に答える
0

質問1への回答:

プロパティに定義がない場合、プロパティは未定義です。nullがオブジェクトである理由は、プロパティが値なしで存在できるが、まだ定義があるためです。

于 2010-03-25T18:43:33.580 に答える
0

完全を期すために、型情報を確認する現在のベスト プラクティスの方法は次のようなものであることに注意してください。

var typeInfo = Object.prototype.toString.call(yourObject);

これにより、"[object Something]" のような文字列が得られます。ここで、"Something" は型名です。

于 2010-03-25T19:02:22.610 に答える
0

Array.prototype もあります。

  • オブジェクトのプロトタイプ
  • Array.prototype
  • Function.prototype
  • Number.prototype
  • 文字列.プロトタイプ
  • Boolean.prototype

クロックフォードは使用しないように言っています:

  • 新しい番号()
  • 新しい文字列()
  • 新しいブール()
于 2011-05-10T13:45:38.593 に答える
0

null は特別な値です。false、0、空の文字列、NaN、または未定義ではありません。

null は、そこにないオブジェクトを探すときに得られるものです。オブジェクトの未定義のプロパティではなく、物そのものです。

1 つの textNode を含む段落はノード nextSibling に対して null を返し、一致しない正規表現は配列の代わりに null を返します。

独自の型を持つべきかもしれませんが、オブジェクトが存在しないのではなく、何か、型を持つ何かになり始めます。

于 2010-03-25T19:17:59.067 に答える