Javascript中的arguments与重载介绍

  因为语言上的设计错误,arguments可以被当成一个数组。

  

复制代码 代码如下:

  function zero () {

  console.log(arguments[0]);

  }

  也会有

  

复制代码 代码如下:

  function zero () {

  for(var i=0;i<arguments.length;i++){

  console.log(arguments[i]);

  }

  }

  它利用了Javascript的一个事实,即Javasc

  而这里的arguments变量给实参提供了一个类似数组的接口。因为这里的arguments的可变参数,我们可以利用这个有意思的东西来做一些有意思的事,比如重载。

  Javscript 重载

  stackvoerflow上有一个关于重载的问题,于是有了第一个答案

  

复制代码 代码如下:

  if (typeof friend === "undefined") {

  } else {

  }

  还有一个答案则是

  

复制代码 代码如下:

  switch (arguments.length) {

  case 0:

  //Probably error

  break;

  case 1:

  //Do something

  break;

  case 2:

  default: //Fall through to handle case of more parameters

  //Do something else

  break;

  }

  只是这种方式真的不好看,难道我们的函数最后要变成这样子的?

  

复制代码 代码如下:

  function zero1 (){

  console.log('arguments 1')

  };

  function zero2 (){

  console.log('arguments 2')

  };

  function zero () {

  if(arguments.length == 1){

  zero1();

  } else{

  zero2();

  }

  }

  真的一点都不好看,即使我们换个switch..case,也不好看啊。

  Javascript arguments不是一个数组

  arguments不是向我们看到的那样一直是一个数组,有时候可能不是。

  

复制代码 代码如下:

  function hello(){

  console.log(typeof arguments);

  }

  这里arguments的类型是一个对象,虽然数组的类型也是一个对象,虽然我们可以将之转换为一个数组

  

复制代码 代码如下:

  var args = Array.prototype.slice.call(arguments);

  但是这也表明了这不是一个数组,它拥有的只有Array的唯一一个属性,即length。除此还有

  arguments.callee

  Reference to the currently executing function.

  arguments.caller

  Reference to the function that invoked the currently executing function.

  arguments.length

  Reference to the number of arguments passed to the function.