类数组对象arguments 和 数组对象
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 和 数组对象的更多相关文章
- 类数组对象 实参对象arguments
先看实参对象arguments 之前对argument有点印象,知道它不是真正的数组,但也可以arguments[0]和arguments.length.今天详细的记录一下. js的默认行为:省略的实 ...
- 浅谈js的类数组对象arguments
类数组对象:arguments总所周知,js是一门相当灵活的语言.当我们在js中在调用一个函数的时候,我们经常会给这个函数传递一些参数,js把传入到这个函数的全部参数存储在一个叫做arguments的 ...
- python 全栈开发,Day51(常用内置对象,函数,伪数组 arguments,关于DOM的事件操作,DOM介绍)
昨日内容回顾 1.三种引入方式 1.行内js <div onclick = 'add(3,4)'></div> //声明一个函数 function add(a,b){ } 2. ...
- 前端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 ...
- JavaScript学习笔记3之 数组 & arguments(参数对象)& 数字和字符串转换 & innerText/innerHTML & 鼠标事件
一.Array数组 1.数组初始化(Array属于对象类型) /*关于数组的初始化*/ //1.创建 Array 对象--方法1: var arr1=[]; arr1[0]='aa';//给数组元素赋 ...
- 如何使用Math对象快速计算数组中的最大值或最小值
Math 对象下包含 min() 和 max() 方法 用于确定一组数值中的最大值和最小值.这两个方法都可以接收任意多个数值参数. var max = Math.max(1,2,3,4,5,6); c ...
- 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用
[源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, con ...
- struts2:遍历自定义字符串数组,遍历Action实例所引用对象中的数组
在struts2:OGNL表达式,遍历List.Map集合:投影的使用一文中已经讲述了OGNL遍历List.Map集合等功能. 本文简单写一个遍历数组的示范程序. 1. 遍历自定义字符串数组 < ...
- [原创]java WEB学习笔记59:Struts2学习之路---OGNL,值栈,读取对象栈中的对象的属性,读取 Context Map 里的对象的属性,调用字段和方法,数组,list,map
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
随机推荐
- Metasploit学习笔记(博主推荐)
不多说,直接上干货! 连接后台的数据库,当然不是必须品. 连接数据库的好处:1.可以攻击和扫描的结果,保存起来 2.将一些搜索结果做个缓存 默认数据库是postgresql. 同时要注意的是 ...
- IE(8~11+) 可用右键加速器
必应词典工具 立即安装: 网络安装:http://dict.bing.com.cn/tools_dl.aspx?dl=ie8acc&mkt=ZH-CN 开发示例: <?xml versi ...
- CentOS7下安装二进制MYSQL8
早看到MySQL8发布, 性能相比MySQL7提升2倍,今天准备安装下试试看 1.先卸载当前系统中已安装的mariadb rpm -qa | grep mariadb rpm -e mysql*/ma ...
- input元素和display:inline-block的元素不在一行的解决办法
每次用到了<input/> 元素 和inline-block的<span></span>(不一定是span,其他一些inline的元素也是一样)元素,他们总是会不在 ...
- Linux/Mac vi命令详解
刚开始学着用Linux,对vi命令不是很熟,在网上转接了一篇. vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指 ...
- PHP安装curl扩展
昨天在写文章的时候,突然出现了一个很顽皮的bug. 一直跳到404页面??? 于是我赶紧打开debug,看看什么情况! 弹出的错误是 :Call to undefined function Home\ ...
- python 命令行下的命令参数
本文所介绍的命令或许是在依赖包里使用的,说白了,我不太清除,由于刚开始学习,所以对知识了解不清楚,按说学习本应该学以解惑,可是为了把知识面展开的太广而影响主要知识的学习,我决定抓住主要矛盾,把有些困惑 ...
- Docker入门实践(三) 基本操作
Docker安装完毕.我们就能够试着来执行一些命令了.看看docker能够干什么. (一) 创建一个容器 首先.让我们执行一个最简单的容器,hello-world.假设安装没有问题.并执行正确的话,应 ...
- EChart报表插件使用笔记(1)
报表插件Echart java类 package com.spring.controller; import java.io.IOException; import java.util.Arrays; ...
- android 选取部分 log 的两种方法
Grep多个条件: android logcat -v time | grep -e A -e B 选取多个android log tag: android logcat -v time -s TAG ...