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 ...
随机推荐
- springBoot actuator监控配置及使用
准备环境: 一个springBoot工程 第一步:添加以下依赖 <dependency> <groupId>org.springframework.boot</group ...
- hdu 5288||2015多校联合第一场1001题
pid=5288">http://acm.hdu.edu.cn/showproblem.php?pid=5288 Problem Description OO has got a ar ...
- HDU 1013.Digital Roots【模拟或数论】【8月16】
Digital Roots Problem Description The digital root of a positive integer is found by summing the dig ...
- 【quickhybrid】API多平台支撑的实现
前言 在框架规划时,就有提到过这个框架的一些常用功能需要支持H5环境下的调用,也就是需要实现API的多平台支撑 为什么要多平台支撑?核心仍然是复用代码,比如在微信下,在钉钉下,在quick容器下, 如 ...
- [UWP]本地化入门
1. 前言 上一篇文章介绍了各种WPF本地化的入门知识,这篇文章介绍UWP本地化的入门知识. 2. 使用resw资源文件实现本地化 在以前的XAML平台,resx资源文件是一种很方便的本地化方案,但在 ...
- 初识homebrew
homebrew是MAC上的一个包管理工具,用于软件安装,非常方便. homebrew安装: 命令行执行: ruby -e "$(curl -fsSL https://raw.githubu ...
- python+mysql+flask创建一个微博应用(持续更新)
微博应用的结构: 用户管理,包括登录管理,会话,用户角色,个人档案及用户头像. 数据库管理,包括数据库迁移处理. Web表单支持,包括字段检验和用于防止垃圾邮件的验证码功能. 大数据的分页功能. 全文 ...
- CSS实现文字换行
强制不换行:div{ white-space:nowrap; } 自动换行: div{ word-wrap:break-word; word-break:normal; } 强制不换行 white-s ...
- Error:Execution failed for task ':app:mergeDebugResources'. > Crunching Cruncher ******.9.png
有时候在Android Studio导入Eclipse项目时,会出现Error:Execution failed for task ':app:mergeDebugResources'. > C ...
- iOS UIAlertController中加入倒计时,输入框,Swift讲解
一.倒计时 @interface ViewController () { UIAlertController *alertview; NSString * message; NSTimer * wai ...