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

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

{0:12, 1:23}

一、类数组 VS 数组

相同点:

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

不同点:

  • 数组对象的类型是Array,类数组对象的类型是Object;
  • 类数组对象不能直接调用数组API;
  • 数组遍历可以用for in和for循环,类数组只能用for循环遍历;
function calc(){
console.log(arguments); // ["sky", "moon", callee: ƒ, Symbol(Symbol.iterator): ƒ]
console.log(arguments[0]); // sky
console.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));

类数组对象arguments 和 数组对象的更多相关文章

  1. 类数组对象 实参对象arguments

    先看实参对象arguments 之前对argument有点印象,知道它不是真正的数组,但也可以arguments[0]和arguments.length.今天详细的记录一下. js的默认行为:省略的实 ...

  2. 浅谈js的类数组对象arguments

    类数组对象:arguments总所周知,js是一门相当灵活的语言.当我们在js中在调用一个函数的时候,我们经常会给这个函数传递一些参数,js把传入到这个函数的全部参数存储在一个叫做arguments的 ...

  3. python 全栈开发,Day51(常用内置对象,函数,伪数组 arguments,关于DOM的事件操作,DOM介绍)

    昨日内容回顾 1.三种引入方式 1.行内js <div onclick = 'add(3,4)'></div> //声明一个函数 function add(a,b){ } 2. ...

  4. 前端JavaScript(2) --常用内置对象,函数,伪数组 arguments,关于DOM的事件操作,DOM介绍

    昨日内容回顾 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ...

  5. JavaScript学习笔记3之 数组 & arguments(参数对象)& 数字和字符串转换 & innerText/innerHTML & 鼠标事件

    一.Array数组 1.数组初始化(Array属于对象类型) /*关于数组的初始化*/ //1.创建 Array 对象--方法1: var arr1=[]; arr1[0]='aa';//给数组元素赋 ...

  6. 如何使用Math对象快速计算数组中的最大值或最小值

    Math 对象下包含 min() 和 max() 方法 用于确定一组数值中的最大值和最小值.这两个方法都可以接收任意多个数值参数. var max = Math.max(1,2,3,4,5,6); c ...

  7. 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用

    [源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, con ...

  8. struts2:遍历自定义字符串数组,遍历Action实例所引用对象中的数组

    在struts2:OGNL表达式,遍历List.Map集合:投影的使用一文中已经讲述了OGNL遍历List.Map集合等功能. 本文简单写一个遍历数组的示范程序. 1. 遍历自定义字符串数组 < ...

  9. [原创]java WEB学习笔记59:Struts2学习之路---OGNL,值栈,读取对象栈中的对象的属性,读取 Context Map 里的对象的属性,调用字段和方法,数组,list,map

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. HD-ACM算法专攻系列(2)——Rightmost Digit

    题目描述: 源码: /**/ #include"iostream" using namespace std; int main() { int t, mod; long long ...

  2. Android仿微信进度弹出框的实现方法

    MainActivity: package com.ruru.dialogproject; import android.app.Activity; import android.os.Bundle; ...

  3. XML字符串解析实体类方法

    /// <summary> /// XML字符串解析实体类方法 /// </summary> public class StringXML { public StringXML ...

  4. 《剑指offer》链表中倒数第k个结点

    一.题目描述 输入一个链表,输出该链表中倒数第k个结点. 二.输入描述 一个链表 三.输出描述 链表的倒数第k个结点 四.牛客网提供的框架 /* struct ListNode { int val; ...

  5. pc端如何引用日期插件

    页面的html部分 <li> <span>出生日期</span> <input type="text" placeholder=" ...

  6. 简单的 centos7&rhel7 系统初始化脚本

    #!/bin/bash #描述: 基于RHEL7&centos7的初始化配置 #读取用户输入的ip read -p "输入你当前Linux的IP地址:" LAST #截取网 ...

  7. 打包maven项目

    使用插件maven-jar-plugin打包自己的项目,为了打包后点击jar文件可以直接运行,需要指定入口类和classpath.使用maven-dependency-plugin插件打包项目的依赖& ...

  8. Unity Shader (四)顶点程序示例

    1.在顶点函数中实现凸起效果 Shader "Custom/Example" { properties { _R(,))= //圆的半径,也是凸起的范围 _OX(,))= //x轴 ...

  9. 137 - ZOJ Monthly, November 2014 - J Poker Face

    Poker Face Time Limit: 2 Seconds      Memory Limit: 65536 KB As is known to all, coders are lack of ...

  10. ecnu 1244

    SERCOI 近期设计了一种积木游戏.每一个游戏者有N块编号依次为1 ,2,-,N的长方体积木. 对于每块积木,它的三条不同的边分别称为"a边"."b边"和&q ...