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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OSPF协议概述(一)

1. 根据来源不同&#xff0c;路由表中的路由通常可以分为以下三类: 链路层协议发现的路由&#xff08;也称为接口路由或直连路由&#xff09;。 由网络管理员手工配置的静态路由 动态路由协议发现的路由。&#xff08;RIP,OSPF,IS-IS&#xff09; 2. 距离矢量算法和…

深度工作:充分使用每一份脑力

浮躁已经成了普遍的社会现象。判断一个人是否浮躁非常容易&#xff0c;看他一天主动拿起手机的次数就可以了。据TED的演讲者说&#xff0c;这个值一般是50次&#xff0c;除了8小时的睡觉之外&#xff0c;基本上每20分钟就要去翻翻手机。 你会去用手机做什么&#xff1f;看微信&…

mysql表碎片空间计算_一篇介绍表空间碎片产生,计算和解决的文章。

一篇介绍表空间碎片产生&#xff0c;计算和解决的文章。我们知道&#xff0c;oracle作为一种大型数据库&#xff0c;广泛应用于金融、邮电、电力、民航等数据吞吐量巨大&#xff0c;计算机网络广泛普及的重要部门。对于系统管理员来讲&#xff0c;如何保证网络稳定运行&#xf…

Python自动化--语言基础5--面向对象、迭代器、range和切片的区分

面向对象 一、面向对象代码示例&#xff1a; 1 class Test(): #类的定义2 car "buick" #类变量&#xff0c;定义在类里方法外&#xff0c;可被对象直接调用&#xff0c;具有全局效果3 def __init__(self): #构造方法4 self.na…

CCIR601和CCIR656标准的区别

关于这两种信号的区别&#xff1a; ITU-R BT 601:16位数据传输&#xff1b;21芯&#xff1b;Y、U、V信号同时传输。 ITU-R BT 656:9芯&#xff0c;不需要同步信号&#xff1b;8位数据传输&#xff1b;串行视频传输&#xff1b;传输速率是601的2倍&#xff1b;先传Y&#xff0c;…

ssis mysql to server_SSIS:将表从MySQL复制到SQL Server 2008

SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Errorcode: 0x80040E21. An OLE DB record is available. Source: “MicrosoftSQL Server Native Client 10.0” Hresult: 0x80040E21 Description:“Multiple-step OLE DB operation generated errors. Chec…

Spring Boot 入门之缓存和 NoSQL 篇(四)

原文地址&#xff1a;Spring Boot 入门之缓存和 NoSQL 篇&#xff08;四&#xff09; 博客地址&#xff1a;http://www.extlight.com 一、前言 当系统的访问量增大时&#xff0c;相应的数据库的性能就逐渐下降。但是&#xff0c;大多数请求都是在重复的获取相同的数据&#xff…

Silverlight 2.5D RPG游戏技巧与特效处理:(七)动画特写

Silverlight中的HLSL不仅适用于场景与动画渲染&#xff0c;对于游戏中的角色&#xff0c;我们同样可以利用它制作动画特写。较常见的比如角色传送时的淡入淡出、扭曲变形、幻化呈现等切换动画&#xff0c;当然还有例如角色被DeBuff时所表现出来的放大缩小以及虚弱时的不规则体形…

mysql myisampack_每天进步一点达——MySQL——myisampack

一、简单介绍myisampack是一个压缩使用MyISAM引擎表的工具&#xff0c;通常会压缩40%~70%,当须要訪问数据。server会将所须要的信息读入到内存中。所以当訪问详细记录时&#xff0c;性能会更好&#xff0c;由于仅仅须要解压一条记录MySQL使用mmap()对变哦进行压缩映射&#xff…

实现搜索功能

准备视图函数search()修改base.html 中搜索输入框所在的<form action"{{ url_for(search) }}" method"get"> <input name"q" type"text" placeholder"请输入关键字">完成视图函数search()获取搜索关键字q re…

日本核辐射究竟有多可怕?

你应该已经知道了由于日本海啸引起的核电站事故。大量无辜的人在得知放射性原料&#xff08;物质&#xff09;泄露的消息之后&#xff0c;都感到害怕和恐慌。 而让你保持冷静的唯一方法&#xff0c;就是掌握正确的科学知识。 有关核辐射的知识 这里有一些信息&#xff1a;   …

mysql下载安装及配置_mysql的下载,安装和配置

顺道向大家介绍一下mysql的安装和配置&#xff0c;mysql数据库应该说是现在整个互联网行业最流行的数据库了&#xff0c;简单易用1.下载&#xff0c;大家可以去官网下载最新的mysql版本&#xff0c;地址&#xff1a;http://dev.mysql.com/downloads/mysql/5.6.html&#xff0c;…

[svc]gns3模拟器及探讨几个bgp问题

模拟器 链接&#xff1a;https://pan.baidu.com/s/1geMcmND 密码&#xff1a;7iir gns0.8.6的版本好用 思科的这个iso好用: c3660-js2-mz.124-21a.bin C2691-AD.BIN(这个也很ok,但是这两个支持的hash算法较少) ctrlshit6 停止命令 R1(config)#crypto isakmp policy 10 R1(confi…

算法导论8.3-4习题解答(基数排序)

CLRS 8.3-4 : 说明如何在O(n)时间内&#xff0c;对0到n^2 - 1之间的n个整数进行排序。 算法思想&#xff1a; 1.把这n个数看成n进制数&#xff0c;那么每个数只有两位&#xff0c;因而循环只需两次 2.调用通用的基数排序(在这写着&#xff0c;留着以后用) 在此题中&#xff0c…

mysql open-files-limit_在mysql 5.5中更改open-files-limit

我在使用open-files-limit参数在Ubuntu 12.04上运行mysql 5.5时遇到问题.我最近注意到由于1024限制导致的一些问题,实际上主系统限制设置为1024,所以我使用以下内容修改了/etc/security/limits.conf&#xff1a;* soft nofile 32000* hard nofile 32000root soft nofile 32000r…

Lucas定理

定义 对于任意质数p $\Huge C_m^n\equiv C_{\biggl\lfloor\frac{m}{p}\biggr\rfloor}^{\biggl\lfloor\frac{n}{p}\biggr\rfloor}*C_{m\ mod\ p}^{n\ mod\ p}\ \ (MOD\ p)$ 证明 对于任意质数p都有 $\huge C_p^i\equiv0\ MOD\ p(i\not 0\&\&i\notp)$ 通过二项式定理&…

Reverse-engineer Source Code into UML Diagrams

今天同事需要反向生成类图&#xff0c;用PowerDesigner 转了一份&#xff0c;不甚满意&#xff0c;在网上逛了逛&#xff0c;发现在这篇文章挺不错。 I have been on several teams where we studiously designed UML diagrams at the beginning of the project. As the projec…

mysql数据库优先_MySQL数据库配置文件之优先级

1.数据库配置方式1)预编译cmake . -DCMAKE_INSTALL_PREFIX/application/mysql-5.7.20 -DMYSQL_DATADIR/application/mysql-5.7.20/data -DMYSQL_UNIX_ADDR/application/mysql-5.7.20/tmp/mysql.sock -DDEFAULT_CHARSETutf8 -DDEFAULT_COLLATIONutf8_general_ci -DWITH_EXTRA_CH…

What's the best way to get rid of get parameters from url string?

https://stackoverflow.com/questions/27267111/whats-the-best-way-to-get-rid-of-get-parameters-from-url-string转载于:https://www.cnblogs.com/jianglijs/p/8081564.html

wince版本ffmpeg的编译 第四篇

4. 编译faac#cd faac-1.28#dos2unix bootstrap //这里是要转换编码格式的&#xff0c;不然configure过不去#dos2unix configure.in#dos2unix Makefile.in#chmod x bootstrap#./bootstrap#./configure –prefix/wm –enable-static –hostarm-mingw32ce –without-mp4v2#make …