类数组对象arguments和数组对象

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

类数组对象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));。

相关文档
最新文档