博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js 类数组arguments详解
阅读量:4309 次
发布时间:2019-06-06

本文共 2356 字,大约阅读时间需要 7 分钟。

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

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

[12, 23, 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[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));//25console.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));

 

转载于:https://www.cnblogs.com/minigrasshopper/p/8058679.html

你可能感兴趣的文章
Bootstrap 基础讲解2
查看>>
获取ServletContext
查看>>
七周成为数据分析师07_统计学基础
查看>>
变革之心
查看>>
IAP Store Kit Guide(中文)
查看>>
VS 2012 ASPX 页面编辑器的一点改进
查看>>
Python单元测试框架——unittest
查看>>
django序列化 serializers
查看>>
Centos7忘记root密码,修改root密码及其他用户密码
查看>>
删除数组指定的某个元素
查看>>
centos6.3 安装配置redis
查看>>
实现Callable接口。带返回值的线程
查看>>
一行代码将两个列表拼接出第三个列表(两个可迭代对象相加产生第三个可迭代对象)--map()方法...
查看>>
程序人口--MainFrame.java
查看>>
12-25造数据库面向对象
查看>>
web开发常见问题
查看>>
C++中namespace的使用
查看>>
非常好的Oracle教程【转】
查看>>
Java基础——安装及配置
查看>>
2017-03-05 CentOS中结合Nginx部署dotnet core Web应用程序
查看>>