web-dev-qa-db-ja.com

JavaScriptのtypeofとinstanceofの違い

私はnode.jsで作業しているので、これはV8に固有の可能性があります。

私はいつもtypeofとinstanceofの違いに何か奇妙なことに気づいていましたが、ここに本当に私を悩ますものがあります:

var foo = 'foo';
console.log(typeof foo);

Output: "string"

console.log(foo instanceof String);

Output: false

そこで何が起こっているのでしょうか?

27
Eric

typeofは、渡したもののプリミティブ型を「返す」構造です。
instanceofは、右側のオペランドが左側のプロトタイプチェーンのどこかに現れるかどうかをテストします。

文字列リテラル_"abc"_と文字列オブジェクトnew String("abc")には大きな違いがあることに注意することが重要です。後者の場合、typeofは「string」ではなく「object」を返します。

40

リテラル文字列があり、Stringクラスがあります。これらは分離されていますが、シームレスに機能します。つまり、Stringメソッドをリテラル文字列に適用でき、リテラル文字列がStringオブジェクトインスタンスであるかのように動作します。

Stringインスタンスを明示的に作成する場合、それはオブジェクトであり、Stringクラスのインスタンスです。

var s = new String("asdf");
console.log(typeof s);
console.log(s instanceof String);

出力:

object
true
8
Guffa