JavaScript中的arguments对象

arguments 是一个类似数组的对象, 对应于传递给函数的参数。

语法

arguments

描述

arguments对象是所有函数中可用的局部变量。你可以使用arguments对象在函数中引用函数的参数。此对象包含传递给函数的每个参数的条目,第一个条目的索引从0开始。例如,如果一个函数传递了三个参数,你可以参考它们如下:

arguments[0]
arguments[1]
arguments[2]
参数也可以被设置:

arguments[1] = 'new value';

arguments对象不是一个 Array 。它类似于数组,但除了 长度之外没有任何数组属性。例如,它没有 pop 方法。但是它可以被转换为一个真正的数组::

let args = Array.prototype.slice.call(arguments);
let args = [].slice.call(arguments);

你还可以使用 Array.from()方法或 spread 运算符将 arguments 转换为真正的数组:

let args = Array.from(arguments);
let args = [...arguments];

对参数使用slice会阻止某些JavaScript引擎中的优化 (比如 V8 引擎)。

如果你关心它们,尝试通过遍历arguments对象来构造一个新的数组。

另一种方法是使用 被忽视的/鄙视/轻视,/看不起 Array构造函数作为一个函数:

let args = (
arguments.length === 1 ?
[arguments[0]] :
Array.apply(null, arguments)
);

如果 Array generics 可用的话,下面的代码可以作为替代:

var args = Array.slice(arguments);
  • arguments 对象仅在函数内部有效,在函数外部调用 arguments 对象会出现一个错误。

  • arguments的typeof返回’object‘。

  • console.log(typeof arguments); // 'object'

  • 可以使用索引来确定各个arguments的类型。

console.log(typeof arguments[0]);
//这将返回单个参数的typeof。

如果你调用一个函数,当这个函数的参数数量比它显式声明的参数数量更多的时候,你就可以使用 arguments 对象。这个技术对于参数数量是一个可变量的函数来说比较有用。 你可以用 arguments.length 来得到参数的数量,然后可以用 arguments object 来对每个参数进行处理。 (想要得到函数签名的参数数量, 请使用 Function.length 属性。)

属性

arguments.callee
// 指向当前执行的函数。
arguments.caller
// 指向调用当前函数的函数。
arguments.length
// 指向传递给当前函数的参数数量。

例子

定义一个连接几个字符串的函数

这个例子定义了一个函数来连接字符串。这个函数唯一正式声明了的参数是一个字符串,该参数指定一个字符作为衔接点来连接字符串。该函数定义如下:

function myConcat(separator) {
var args = Array.prototype.slice.call(arguments, 1);
return args.join(separator);
}

你可以传递任意数量的参数到该函数,然后该函数会将每个参数作为一个条目来创建一个列表。

myConcat(", ", "red", "orange", "blue");
// returns "red, orange, blue"
myConcat("; ", "elephant", "giraffe", "lion", "cheetah");
// returns "elephant; giraffe; lion; cheetah"
myConcat(". ", "sage", "basil", "oregano", "pepper", "parsley");
// returns "sage. basil. oregano. pepper. parsley"

定义一个创建HTML列表的方法

这个例子定义了一个函数通过一个字符串来创建HTML列表。这个函数唯一正式声明了的参数是一个字符。当该参数为 “u” 时,创建一个无序列表 (项目列表);当该参数为 “o” 时,则创建一个有序列表 (编号列表)。该函数定义如下:

function list(type) {
var result = "<" + type + "l><li>";
var args = Array.prototype.slice.call(arguments, 1);
result += args.join("</li><li>");
result += "</li></" + type + "l>"; // end list
return result;
}

你可以传递任意数量的参数到该函数,然后该函数会将每个参数作为一个条目添加到第一个参数指定类型的列表当中。

var listHTML = list("u", "One", "Two", "Three");
/* listHTML is:
"<ul><li>One</li><li>Two</li><li>Three</li></ul>"
*/

注意

ES6中的箭头函数没有自己的 arguments 对象,不过在大多数情形下,rest参数可以给出一个解决方案:

let a;
const fn = (...rest) => Array.prototype.slice.call(rest, 1);
a = fn(1, 2); // [2]

JavaScript中的arguments对象相关推荐

  1. 你知道 JavaScript 中的 Arguments 对象都有哪些用途吗?

    JavaScript 中 Arguments 对象的用途总结. 前言 相信我们很多人在代码开发的过程中都使用到过一个特殊的对象 -- Arguments 对象. 在实际开发中,Arguments 对象 ...

  2. 【从0到1学Web前端】javascript中的ajax对象(一)

    [从0到1学Web前端]javascript中的ajax对象(一) 如今最流行的获取后端的(浏览器从server)数据的方式就是通过Ajax了吧.今天就来具体的来学习下这个知识吧.假设使用ajax来訪 ...

  3. Javascript基础与面向对象基础~第四讲 Javascript中的类对象

    今天来说JS中如何实现类(class),事实上本应该昨天晚上写的,可我失言了,在些说一声"抱歉"!JS中的类是JS面向对象的基础,也是我最拿手的东西,你写的代码能否提高一个层次,一 ...

  4. php节点对象,JavaScript_JavaScript中访问节点对象的方法有哪些如何使用,JavaScript中访问节点对象的方法 - phpStudy...

    JavaScript中访问节点对象的方法有哪些如何使用 JavaScript中访问节点对象的方法有哪些? var obj = document.getElementById('fdafda'); va ...

  5. JavaScript id_好程序员web前端分享Javascript中函数作为对象

    好程序员web前端分享Javascript中函数作为对象,Javascript赋予了函数非常多的特性,其中最重要的特性之一就是将函数作为第一型的对象.那就意味着在javascript中函数可以有属性, ...

  6. 在 JavaScript 中创建 JSON 对象

    <html> <body> <h2>在 JavaScript 中创建 JSON 对象</h2><p> Name: <span id=& ...

  7. 选择嵌套_如何优雅地在JavaScript中访问嵌套对象

    在JavaScript中访问嵌套对象 以超酷的方式安全地访问JavaScript中的嵌套对象 JavaScript是惊人的,我们都知道.但是JavaScript中的一些东西真的很奇怪,它们让我们大开眼 ...

  8. JavaScript中的XMLHttpRequest对象

    1.什么是 XMLHttpRequest 对象? XMLHttpRequest 对象用于在后台与服务器交换数据. XMLHttpRequest 对象提供了对 HTTP 协议的完全的访问,包括做出 PO ...

  9. 广州蓝景分享—前端开发JavaScript中的Array对象与其他数组

    各位小伙伴好,今天我们广州蓝景与大家分享一些前端技术知识. JavaScript中的Array对象与其他编程语言中的数组一样,可以将多个项目的集合存储在单个变量名下,并具有用于执行常见数组操作的成员. ...

最新文章

  1. 【C语言入门教程】2.7 表达式
  2. 如何优雅地在公众号输入数学公式?推荐几款神器
  3. c语言定义数组变量初始化为0,c语言数组初始化——int a[N] = {0};
  4. 鲲鹏920 centos7 postgresql12 postgis2.5.4编译
  5. python对非it上班族有用吗_非专业人士学Python有用吗?
  6. DOS批处理高级教程精选(二)
  7. .net操作读取word中的图像并保存
  8. 软件工程中需要学习和掌握的软件都有哪些_高三孩子:你想学软件工程,要先知道这些...
  9. android反射改theme,全局修改默认字体,通过反射也能做到
  10. matlab exprnd函数,Matlab 用 exprnd 函数生成符合指数分布的随机数
  11. 【Java 8 in Action】Stream
  12. 系统架构设计-计算机网络知识点
  13. VMware网络设置详解 打造超级虚拟网络
  14. mfc动态改变clip风格_游戏背景音乐的种类—动态音效
  15. Windows10驱动签名禁用教程
  16. 【实战】替代Flash的,基于JQuery、HTML5文件上传插件
  17. 我的世界服务器如何做无限箱子,我的世界无限箱子制作方法图文攻略
  18. 读王弼之《老子道德經注校釋》
  19. TCHAR字符串的操作
  20. 【FFmpeg】avg_frame_rate 计算 及在TS 中使用

热门文章

  1. 魔方阵(奇数,单偶,双偶)
  2. 创建mysql数据库图解_mysql数据库怎么创建外键?(图文+视频)
  3. matlab字符和字符串,MATLAB字符和字符串
  4. js制定一个单选按钮_【下】每个月整理发票太头疼?手把手教你快速开发一个工具解决!...
  5. C语言实践作业报告,c语言社会实践报告
  6. python 字符串处理 字典_python 字符串和字典
  7. ad域管理与维护_在NAS SMB卷上使用VisualSVN Server维护代码库
  8. php接口 含义,php晋级必备:一文读懂php接口特点和使用!
  9. gradle引入子module配置_原创 | 看完此文,你对Gradle的理解又升级了
  10. n个结点,不同形态的二叉树(数目+生成)