2011-12-23 4 views
4

私はまだJavaScriptを学んでおり、書籍を読んでおり、FireBugを利用して実験しています。JavaScript instanceof:関数の引数のインスタンスを定義できません

私は次のものに驚いております。

は、関数の宣言を持っている:

var t = function (args){ 
      ... 
    } 

それは可変引数だと、想定しています。 typeof args.fromの結果は正気に見えnumber
ある

args.from 

<body onload="t({to:100,from:0})"> 

それが呼び出すことによってfrom引数の値を取得することが可能です:

は、私は次のようにそれを呼び出します。
注意を払う:number私は何インスタンスargs.fromあるの興味が下部ケース

です。
実際には、インスタンス値を取得できません。
が試み:

args.from instanceof Number 
args.from instanceof String 
args.from instanceof Object 
args.from instanceof Boolean 

Numberではありません -
それはObjectではありません非常に奇妙な - 非常に奇妙な
それはOKだ - つまりStringはありませんOKです - つまり
それはないBoolean
イッツどちらnull'undefined' - OKです。

この意味は?

+0

ところで、それは可変引数ではありません。それはオブジェクトを保持する通常のパラメータです。 – SLaks

+0

はい、私は書きましたが、Javaとは正反対の "想定" varargsであることを明確に宣言する必要があります – sergionni

+0

プリミティブ型Numberの値は "何のインスタンス"でもありません。 'instanceof'演算子は、プリミティブな値ではなくオブジェクトの値に使用されます... –

答えて

5

これは基本的な数値です。
これはどのクラスのインスタンスでもありません。

instanceofは、オブジェクトに対してtrueを返すことができます(typeof"object"または"function"を返します)。

これは、argsオブジェクトとは関係ありません。 4 instanceof Numberから同じ虚偽を得ることができます。これとは対照的に

new Number(4)は、プリミティブ4をラップするオブジェクトですので、渡されたようtypeof new Number(4) === "objectnew Number(4) instanceof Number === true

+0

ああ、 'number'小文字の点もこれになります – sergionni

+3

これは、Javaのどこでも' instanceof'で厳密な型チェックを行うべきではないということです。それは単にJavascriptが適しているプログラミングのスタイルではありません。 [duck typing](http://en.wikipedia.org/wiki/Duck_typing)を使用して、必要な引数とインタフェースを文書化してください。 –

+0

@Francis Avilaヒントありがとうございました – sergionni

2

from.toはプリミティブ型であるので、あなたがそれにinstanceofを呼び出すことはできません。

あなたが本当にObjectでそれをラップし、instanceof代わりのtypeofを使用する場合:

var from = Object(args.from); 
alert(from instanceof Number); // true! 
+0

ラップについての素敵な点 – sergionni

+0

興味深いもの: 'typeof'結果' object'はラップした後に小文字になります.Laksは既に説明しました) – sergionni

+0

@sergionniはい、それは予想されます。 – Alnitak

関連する問題