js 类数组arguments详解
arguments并不是一个真正的数组,而是一个“类似数组(array-like)”的对象;
就像下面的这段输出,就是典型的类数组对象:
[, , 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[]); // 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 == ){
return arguments[] * arguments[];
}
//传2个参数,求和
else if(arguments.length == ){
return arguments[] + arguments[];
}
}
console.log(calc());//
console.log(calc(,));//
2、实现递归:在函数内部反复的调用函数本身
首先我们用最原始的方法,实现数字的叠加
function calc(num){
if(num <= ){
return ;
}else{
return num += calc(num - );
}
}
console.log(calc()); //
然后我们用类数组来实现同样的功能:
arguments.callee:返回当前函数本身
function calc(num){
if(num <= ){
return ;
}else{
return num += arguments.callee(num - );
}
}
console.log(calc()); //
下面举个栗子,来说明这两种调用的一点小区别:
如果写成 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 <= ){
return ;
}else{
return num += arguments.callee(num - );
// return num += calc(num - 1); // 报错 Uncaught TypeError: calc is not a function
}
}
var result = calc;
calc = null;
console.log(result());
注意: 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 <= ){
return ;
}else{
return num += arguments.callee(num - );
}
}
console.log(calc());
js 类数组arguments详解的更多相关文章
- js对象 数组Array详解 (参照MDN官网:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find)
一:数组的创建方式: 1.采用直接量创建 var arr = [];//创建一个空数组 var arr2 = [1,2,3];//创建一个有三个元素的数组 2.采用构造函数创建 a.var arr1 ...
- js中数组Array 详解
unshift:将参数添加到原数组开头,并返回数组的长度 pop:删除原数组最后一项,并返回删除元素的值:如果数组为空则返回undefined push:将参数添加到原数组末尾,并返回数组 ...
- js数组方法详解
Array对象的方法-25个 /*js数组方法详解 */ /* * 1 concat() 用于连接多个数组或者值-------------- * 2 copyWithin() 方法用于从数组的指定位置 ...
- JavaScript中的arguments详解
1. arguments arguments不是真正的数组,它是一个实参对象,每个实参对象都包含以数字为索引的一组元素以及length属性. (function () { console.log(ar ...
- JavaScript数组方法详解
JavaScript数组方法详解 JavaScript中数组的方法种类众多,在ES3-ES7不同版本时期都有新方法:并且数组的方法还有原型方法和从object继承的方法,这里我们只介绍数组在每个版本中 ...
- 【转】UML类图与类的关系详解
UML类图与类的关系详解 2011-04-21 来源:网络 在画类图的时候,理清类和类之间的关系是重点.类的关系有泛化(Generalization).实现(Realization).依赖(D ...
- String类的构造方法详解
package StringDemo; //String类的构造方法详解 //方法一:String(); //方法二:String(byte[] bytes) //方法三:String (byte[] ...
- [转]c++类的构造函数详解
c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初 ...
- Scala 深入浅出实战经典 第63讲:Scala中隐式类代码实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
随机推荐
- 安装phpnow服务[Apache_pn]提示失败的解决方法
win 7/win 8/Win10 phpnow提示"安装服务[Apache_pn]失败"错误解决办法汇总 常常在安装phpnow的时候,提示"安装服务 [ Apache_pn ] 失败&q ...
- JAVA设计模式之:命令模式
*通常情况下:行为请求者与实现者通常呈现一种高度耦合状态.有时要对行为进行变更处理处理.高度耦合方式就显得不合适. * 将行为请求者与行为实现者解耦,将一组行为抽象为对象.实现二者之间的松耦合. 这就 ...
- HVR又一次load的时候须要将schedule suspend掉
今天在进行HVR的又一次load的时候.报错了: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fi ...
- Windows Azure系列-- 配置Azure Power Shell
1.下载Azure Power shell https://azure.microsoft.com/en-us/documentation/articles/powershell-install-co ...
- Android 四大组件学习之ContentProvider四
上节我们学习了怎样去读取系统短信以及插入一条短信到系统中. 本节我们学习怎样获取系统的联系人,以及插入一条联系人 好.废话不多说了,直接操作. 首先和读取短信一样,先找到联系人在数据库中的位置. wa ...
- 开源Android-PullToRefresh下拉刷新源代码分析
PullToRefresh 这个库用的是很至多.github 今天主要分析一下源代码实现. 我们通过ListView的下拉刷新进行分析.其他的类似. 整个下拉刷新 父View是LinearLayo ...
- Swiper单页网站简单案例(全屏网页)
<!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...
- canvas图形函数
function drawStar(cobj,x, y, radius1, radius2, num, drawType, color) {//参数:画笔,圆心X.圆心Y,半径1,半径2,形状边,实心 ...
- linux应用态下的时间
1.时间值 1.1 日历时间(UTC) 该值是自1 9 7 0年1月1日0 0 : 0 0 : 0 0以来国际标准时间( U T C)所经过的秒数累计值(早期的手册称 U T C为格林尼治标准时间) ...
- 【maven教程】(1)---maven环境配置
maven环境配置 刚开始学习maven,现在项目需要用到maven,而且他确实很好用,也比较容易上手,我也是主要通过视频学习,在写博客的时候也会总结其它人所写 博客,从简到难,如果你也是初学者那接下 ...