js 类数组arguments详解
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]); // skyconsole.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));
转载于:https://www.cnblogs.com/minigrasshopper/p/8058679.html
js 类数组arguments详解相关推荐
- java的数组与Arrays类源码详解
java的数组与Arrays类源码详解 java.util.Arrays 类是 JDK 提供的一个工具类,用来处理数组的各种方法,而且每个方法基本上都是静态方法,能直接通过类名Arrays调用. 类的 ...
- jQuery数组处理详解(含实例演示)
jQuery的数组处理,便捷,功能齐全. 最近的项目中用到的比较多,深感实用,一步到位的封装了很多原生js数组不能企及的功能. 最近时间紧迫,今天抽了些时间回过头来看 jQuery中文文档 中对数组的 ...
- java的String类源码详解
java的String类源码详解 类的定义 public final class Stringimplements java.io.Serializable, Comparable<String ...
- java 重启线程_java 可重启线程及线程池类的设计(详解)
了解JAVA多线程编程的人都知道,要产生一个线程有两种方法,一是类直接继承Thread类并实现其run()方法:二是类实现Runnable接口并实现其run()方法,然后新建一个以该类为构造方法参数的 ...
- python随机生成二维列表_对python产生随机的二维数组实例详解
对python产生随机的二维数组实例详解 最近找遍了python的各个函数发现无法直接生成随机的二维数组,其中包括random()相关的各种方法,都没有得到想要的结果.最后在一篇博客中受到启发,通过列 ...
- Python学习 Day31 JS类数组对象
JS类数组对象 一.三元运算符 概述:三元运算符由三部分组成,使用语法如下: A ? B : C 三元运算符A:它需要的是一个布尔值(其他类型数值也可以,但是需要隐式转换为布尔值) 如果A部分为布尔值 ...
- computed用发_Vue.js中computed使用详解
这次给大家带来Vue.js中computed使用详解,Vue.js中computed使用的注意事项有哪些,下面就是实战案例,一起来看一下. JS属性: JavaScript有一个特性是Object.d ...
- 普歌-码灵团队-System类,StringBuilder类的常用方法详解
System类,StringBuilder类的常用方法详解(java基础必掌握)java面试必问) System类的介绍: System类中常用方法: 1.System.currentTimeMill ...
- 对python3中pathlib库的Path类的使用详解
原文连接 https://www.jb51.net/article/148789.htm 1.调用库 ? 1 from pathlib import 2.创建Path对象 ? 1 2 3 4 5 ...
最新文章
- 但并不从包含函数声明的接口派生_C++的虚函数和纯虚函数
- (转载)IIS安装配置全过程
- [数据结构与算法]平衡二叉树实现
- java jaspersoft,Jaspersoft Studio
- 摆脱加卡他卡_如何通过三个简单的步骤摆脱“故事卡地狱”。
- linux sleeping进程多_你知道Linux进程的睡眠和唤醒操作?
- 串口调试助手CRC16_MODBUS校验码计算
- appium for java教程_Java教程:Appium环境搭建
- python美团外卖_美团外卖不满意分析_Python和Excel
- 什么是主数据?有什么作用?
- RDS - 远程桌面服务
- wireshark排查网络延迟问题
- V831——脱机实现通信行程卡识别
- 人人都可以用的项目管理工具,5分钟告诉你如何做好活动策划
- 【Electron-Vue】构建桌面应用(40)- Electron程序未响应
- 地塞米松/多柔比星/胡桃醌/丹皮酚-PLGA聚乳酸-羟基乙酸纳米粒
- 掘金 Web 沸点优化 1.1 版本上线啦~
- 浏览器下载软件时,默认是用迅雷下载,如何取消?
- 神经网络类型介绍 ANN FNN RNN LSTM GAN DQN
- flink1.12.0学习笔记第2篇-流批一体API
热门文章
- Week1 Team Homework #2 Introduction of team member with photos
- Navigation Drawer介绍
- 浅谈PVID和VID区别
- AS3 调用外部SWF中元件库中的元件 【转】
- 《当程序员的那些狗日日子》(六十一)美丽的天际
- SQL Server 2005参考:Apply运算符
- 图解LinkedHashMap原理
- javascript --- 瀑布流的实现
- Android绘制(一):来用shape绘出想要的图形吧!
- 深入理解Elasticsearch(原书第2版)》一1.2 何为Elasticsearch