2016-04-16 8 views
2

MDNはそれが "an Array like object"だと言っていますが、それが何のインスタンスなのかは言いません。引数は何のインスタンス変数ですか?

HTMLCollectionまたはNodeListではありません。

Object.prototype.toString.call(arguments)に電話すると、"[object Arguments]"が返されますが、arguments instanceof Argumentsはエラーです。

だからargumentsのインスタンスは?

答えて

7

したがって、引数のインスタンスは何ですか?

Objectのインスタンスです。あなたはそれを識別するためにinstanceofと一緒に使うことができる公衆Argumentsコンストラクタがないようです。

あなたが一意に識別したい場合は、:

Object.prototype.toString.call(arguments) === "[object Arguments]" 

はそれを識別するための安全な方法です。

section 9.4.4 in the EcmaScript 6 specificationの場合、argumentsオブジェクトは通常のオブジェクトまたはエキゾチックオブジェクトのいずれかです。ここでは、仕様が言うことだ:

ほとんどのECMAScript関数は、その コードに使用可能な引数のオブジェクトを作ります。関数定義の特性に応じて、 引数オブジェクトは普通オブジェクトまたは引数 エキゾチックオブジェクトのいずれかです。

引数エキゾチック 目的は、配列のインデックスプロパティがその関連 のECMAScript関数の呼び出しの 仮パラメータのバインディングにマップエキゾチックな目的です。

引数エキゾチックオブジェクトは、通常のオブジェクトと同じ内部 スロットを持ちます。また、[[ParameterMap]]内部に スロットもあります。通常の引数オブ​​ジェクトには、[[ParameterMap]]内部の スロットがあり、値は常に未定義です。通常の引数オブ​​ジェクトの場合、 [[ParameterMap]]内部スロットは、 Object.prototype.toString(19.1.3.6)によってのみ使用され、そのように識別されます。

「エキゾチックな」オブジェクトなので、基本的にすべての通常の予定された規則に従わないことを意味します。たとえば、独自のオブジェクトを作成できるコンストラクタ関数はありません。また、publicコンストラクタ関数がないため、おそらくそれがユニークに識別できるようにテストできるinstanceofがない理由も説明されています。

0

あなたはargumentscallee.name

function test() { 
    this.args = arguments; 
} 

var obj = new test(); 

console.log(obj.args.callee.name); 

function test() { 
    return arguments 
} 

console.log(test().callee.name); 

も参照してくださいWhy was the arguments.callee.caller property deprecated in JavaScript?Arguments object

+2

は 'strict'モードでこれを行うことはできませんを使用してから返された関数の名前を取得することができます。 – jfriend00

+0

@ jfriend00はい。詳細へのリンクが含まれています。 – guest271314

関連する問題