什么是变量实例的变量?

时间:2016-04-16 02:22:07

标签: javascript arguments

MDN说它是“an Array like object”,但没有说出它的实例是什么。

不是HTMLCollectionNodeList

如果我致电Object.prototype.toString.call(arguments),则会返回"[object Arguments]",但arguments instanceof Arguments是错误。

那么arguments的实例是什么?

2 个答案:

答案 0 :(得分:7)

  

那么参数是什么?

这是Object的一个实例。似乎没有任何公共Arguments构造函数可以与instanceof一起使用来识别它。

如果您想要唯一识别它,那么:

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

是识别它的安全方式。

Per section 9.4.4 in the EcmaScript 6 specificationarguments对象是普通对象或异国对象。这是规范所说的:

  

大多数ECMAScript函数都会为其提供参数对象   码。根据功能定义的特征,   它的参数对象是普通对象参数   异国情调的对象

     

充满异国情调的论点   object是一个奇特的对象,其数组索引属性映射到   形式参数绑定其关联的调用   ECMAScript函数。

     

参数奇异物体具有相同的内部   插槽作为普通对象。它们内部也有[[ParameterMap]]   插槽。普通参数对象也有[[ParameterMap]]内部   槽的值始终未定义。对于普通的参数对象   [[ParameterMap]]内部插槽仅用于   Object.prototype.toString(19.1.3.6)来识别它们。

由于它是一个“异国情调”的对象,这实际上意味着它不遵循所有正常和预期的约定。例如,没有构造函数可以从中创建自己的对象。并且,因为没有公共构造函数,这可能也解释了为什么没有instanceof可以对其进行测试以唯一地识别它。

答案 1 :(得分:0)

您可以使用arguments

检索返回callee.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