<JavaScript 深入>arguments

JavaScript 深入系列 #6

<JavaScript 深入>arguments
Photo by Greg Rakozy / Unsplash

arguments对象

在JavaScript中,arguments对象是比较特别的一个对象,实际上是当前函数的一个内置属性。arguments非常类似Array,但实际上又不是一个Array实例。

Array.prototype.testArg = 'Text';
function funArg(a){
    console.log(arguments); // [10,length:1,...]
    console.log(arguments.testArg); //undefined
    console.log(arguments[0]); // 10
}

console.log(new Array().testArg); // Text

funArg(10);

arguments对象的长度是由实参个数而不是形参个数决定的。形参是函数内部重新开辟内存空间存储的变量,但是其与arguments对象内存空间并不重叠。对于arguments和值都存在的情况下,两者值是同步的,但是针对其中一个无值的情况下,对于此无值的情形值不会得以同步。

function f(a,b,c){
	console.log(arguments.length);  // 2
	a = 100;
	console.log(arguments[0]); // 100
	arguments[0] = 'function';
	console.log(a);  // function
	console.log(c);  // undefined
	c = 2012;
	console.log(arguments[2]); // undefined
}

f(1,2)

由JavaScript中函数的声明和调用特性,可以看出JavaScript中函数是不能重载的。
根据其他语言中重载的依据:"函数返回值不同或形参个数不同",我们可以得出上述结论:

  1. Javascript函数的声明是没有返回值类型这一说法的;
  2. JavaScript中形参的个数严格意义上来讲只是为了方便在函数中的变量操作,实际上实参已经存储在arguments对象中了。

从JavaScript函数本身深入理解为什么JavaScript中函数是不能重载的:在JavaScript中,函数其实也是对象,函数名是关于函数的引用,或者说函数名本身就是变量。对于如下所示的函数声明与函数表达式,其实含以上是一样的(在不考虑函数声明与函数表达式区别的前提下)。

function f(a){ return a }
// 在不考虑函数声明与函数表达式区别的前提下,其等价于:
var f = function (a){ return a }

链接