arguments并不是一个真正的数组,而是一个“类似数组(array-like)”的对象;

就像下面的这段输出,就是典型的类数组对象:

[12, 23, callee: ƒ, Symbol(Symbol.iterator): ƒ]

一、类数组 VS 数组

相同点:

  • 都可用下标访问每个元素
  • 都有length属性

不同点:

  • 数组对象的类型是Array,类数组对象的类型是Object;
  • 类数组对象不能直接调用数组API;
  • 数组遍历可以用for in和for循环,类数组只能用for循环遍历;
function calc(){console.log(arguments);        // ["sky", "moon", callee: ƒ, Symbol(Symbol.iterator): ƒ]console.log(arguments[0]);    // skyconsole.log(arguments.length);    // 2// arguments.pop();   // 报错,arguments.pop is not a function
}calc('sky', 'moon');

类数组对象转为数组对象方法: Array.prototype.slice.call ( arguments );

function calc(){var newArr = Array.prototype.slice.call(arguments);newArr.pop();    console.log(newArr);    // ["sky"]
}calc('sky', 'moon');

二、类数组的用法

1、实现重载(overload):当函数的参数个数不明确时,函数体根据参数的不同进行相应处理;

比如我们要实现:一个参数时,做乘法运算;二个参数时,做加法运算;

看下面代码,我们可以这样实现:

// 实现重载(overload)
function calc(){//传1个参数,求平方if(arguments.length == 1){return arguments[0] * arguments[0];  }//传2个参数,求和else if(arguments.length == 2){return arguments[0] + arguments[1];}
}
console.log(calc(5));//25
console.log(calc(12,23));//35

2、实现递归:在函数内部反复的调用函数本身

首先我们用最原始的方法,实现数字的叠加

function calc(num){if(num <= 0){return 0;}else{return num += calc(num - 1);}
}console.log(calc(3));    // 6

然后我们用类数组来实现同样的功能:

arguments.callee:返回当前函数本身
function calc(num){if(num <= 0){return 0;}else{return num += arguments.callee(num - 1);}
}
console.log(calc(3));  // 6

下面举个栗子,来说明这两种调用的一点小区别:

如果写成 return num += calc(num - 1) 会报错;原因很简单,当执行calc = null 后,calc已经不是一个函数;

但是写成 return num += arguments.callee(num - 1) 不会报错;因为arguments.callee指的是“当前函数”,并不是“calc”

function calc(num){console.log(arguments);if(num <= 0){return 0;}else{return num += arguments.callee(num - 1);// return num += calc(num - 1);  // 报错 Uncaught TypeError: calc is not a function
    }
}
var result = calc;
calc = null;
console.log(result(3));

注意: arguments.callee的用法在严格模式下是不允许的;

Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them

"use strict";
function calc(num){if(num <= 0){return 0;}else{return num += arguments.callee(num - 1);}
}
console.log(calc(3));

转载于:https://www.cnblogs.com/minigrasshopper/p/8058679.html

js 类数组arguments详解相关推荐

  1. java的数组与Arrays类源码详解

    java的数组与Arrays类源码详解 java.util.Arrays 类是 JDK 提供的一个工具类,用来处理数组的各种方法,而且每个方法基本上都是静态方法,能直接通过类名Arrays调用. 类的 ...

  2. jQuery数组处理详解(含实例演示)

    jQuery的数组处理,便捷,功能齐全. 最近的项目中用到的比较多,深感实用,一步到位的封装了很多原生js数组不能企及的功能. 最近时间紧迫,今天抽了些时间回过头来看 jQuery中文文档 中对数组的 ...

  3. java的String类源码详解

    java的String类源码详解 类的定义 public final class Stringimplements java.io.Serializable, Comparable<String ...

  4. java 重启线程_java 可重启线程及线程池类的设计(详解)

    了解JAVA多线程编程的人都知道,要产生一个线程有两种方法,一是类直接继承Thread类并实现其run()方法:二是类实现Runnable接口并实现其run()方法,然后新建一个以该类为构造方法参数的 ...

  5. python随机生成二维列表_对python产生随机的二维数组实例详解

    对python产生随机的二维数组实例详解 最近找遍了python的各个函数发现无法直接生成随机的二维数组,其中包括random()相关的各种方法,都没有得到想要的结果.最后在一篇博客中受到启发,通过列 ...

  6. Python学习 Day31 JS类数组对象

    JS类数组对象 一.三元运算符 概述:三元运算符由三部分组成,使用语法如下: A ? B : C 三元运算符A:它需要的是一个布尔值(其他类型数值也可以,但是需要隐式转换为布尔值) 如果A部分为布尔值 ...

  7. computed用发_Vue.js中computed使用详解

    这次给大家带来Vue.js中computed使用详解,Vue.js中computed使用的注意事项有哪些,下面就是实战案例,一起来看一下. JS属性: JavaScript有一个特性是Object.d ...

  8. 普歌-码灵团队-System类,StringBuilder类的常用方法详解

    System类,StringBuilder类的常用方法详解(java基础必掌握)java面试必问) System类的介绍: System类中常用方法: 1.System.currentTimeMill ...

  9. 对python3中pathlib库的Path类的使用详解

    原文连接   https://www.jb51.net/article/148789.htm 1.调用库 ? 1 from pathlib import 2.创建Path对象 ? 1 2 3 4 5 ...

最新文章

  1. 但并不从包含函数声明的接口派生_C++的虚函数和纯虚函数
  2. (转载)IIS安装配置全过程
  3. [数据结构与算法]平衡二叉树实现
  4. java jaspersoft,Jaspersoft Studio
  5. 摆脱加卡他卡_如何通过三个简单的步骤摆脱“故事卡地狱”。
  6. linux sleeping进程多_你知道Linux进程的睡眠和唤醒操作?
  7. 串口调试助手CRC16_MODBUS校验码计算
  8. appium for java教程_Java教程:Appium环境搭建
  9. python美团外卖_美团外卖不满意分析_Python和Excel
  10. 什么是主数据?有什么作用?
  11. RDS - 远程桌面服务
  12. wireshark排查网络延迟问题
  13. V831——脱机实现通信行程卡识别
  14. 人人都可以用的项目管理工具,5分钟告诉你如何做好活动策划
  15. 【Electron-Vue】构建桌面应用(40)- Electron程序未响应
  16. 地塞米松/多柔比星/胡桃醌/丹皮酚-PLGA聚乳酸-羟基乙酸纳米粒
  17. 掘金 Web 沸点优化 1.1 版本上线啦~
  18. 浏览器下载软件时,默认是用迅雷下载,如何取消?
  19. 神经网络类型介绍 ANN FNN RNN LSTM GAN DQN
  20. flink1.12.0学习笔记第2篇-流批一体API

热门文章

  1. Week1 Team Homework #2 Introduction of team member with photos
  2. Navigation Drawer介绍
  3. 浅谈PVID和VID区别
  4. AS3 调用外部SWF中元件库中的元件 【转】
  5. 《当程序员的那些狗日日子》(六十一)美丽的天际
  6. SQL Server 2005参考:Apply运算符
  7. 图解LinkedHashMap原理
  8. javascript --- 瀑布流的实现
  9. Android绘制(一):来用shape绘出想要的图形吧!
  10. 深入理解Elasticsearch(原书第2版)》一1.2 何为Elasticsearch