2016-11-08 12 views
0

厳密にはNumberのインスタンスではないリテラルの数を考えると、Number(またはStringまたはBoolean)オブジェクトのプロトタイプメソッドを対応するリテラルオブジェクトで呼び出すことができますか?ブラウザー間でこの標準的な動作ですか?なぜJavaScriptでは '3 instanceof Number' == falseですが、 '3..method()'はNumber.prototype.methodを呼び出しますか?

これが発生した場合、正確には何が起こっていますか?メソッド内でtypeof thisを調べると、 'number'ではなく 'object'が返されるため、メソッドを呼び出す前にリテラルを対応する型に強制すると思われます。

+0

3はNumberのインスタンスではありません。この型は数値型です。何かのインスタンスに対しては、 'object'型である必要があります。したがって、 'typeof 3 = number'、' typeof new Number(3)= object'、 'Object(3)instanceof Number'で組み込み型 'number、string'などを強制することができます。また、Stringなどのような他のビルドや 'var x = 3; x = Object(x); 'xは現在instanceofの番号です。 – Keith

+0

単純なisNumberチェック - > 'function isNumber(n){return typeof n === 'number' || n instanceof Number; } ' – Keith

+0

いいえ、私はすでにこれらの小切手を定義しています。実際、その実装は、別のウィンドウから来たNumberのインスタンスのブラウザウィンドウでは安全ではありません。 'function isNumber(n){return Object.prototype.toString.call(n)=== '[オブジェクト番号]'を使用する方が良いです。 } 'は、他のウィンドウからの数値プリミティブ、数値インテンシティ、および数インスタンスに対して機能します。また、Array.isArrayのようなシムのデフォルトの実装です。 – Triynko

答えて

1

リテラルはインスタンスに強制されません。

内部的には、インスタンスが作成され、値がインスタンスにコピーされ、メソッドがインスタンスを使用して実行されます。その後、インスタンスは破棄されます。リテラルは実際にメソッドを実行するために使用されていません。この「ラッパー」オブジェクトのコンセプトは、文字列プリミティブがStringオブジェクトのように使用されている場合にも使用されます。この動作は標準です。

3は数字リテラルです。 Number型のインスタンスではありません。 JavaScriptにはプリミティブな数値型とネイティブのNumberオブジェクトがあります。 MDNから

:メソッドは 原始文字列に呼び出されるまたはプロパティのルックアップが発生した状況では、JavaScriptが原始的な文字列をラップし、メソッドを呼び出すか プロパティ検索を実行し、自動的に ます。

+0

それは私が何を求めているかではありません。それは与えられたものです。問題は、Numberではないリテラル上のNumberのメソッドを呼び出すことができる理由です。 – Triynko

+0

@あなたはあなたの質問を編集し続け、私は自分の答えを更新し続ける! –

+0

いいえ、私は明確にするために最初の行を編集しました。問題は、3はNumberのインスタンスではないことを常に指摘しており、Numberのメソッドをまだ呼び出すことができる理由を尋ねます。さらに、標準的で信頼できる行動かどうかを尋ねています。この回答はどちらにも対処していません。最初に、それは与えられたものを元に戻し、それをインスタンスに強制しているという私の疑惑を再び述べました。それはそれが標準的な振る舞いであるかどうかをまだ扱っていない。 – Triynko

関連する問題