arguments就是传递进函数的参数列表,它是一个类数组对象-Array-Like Object.
类数组对象,简单来说就是拥有length属性,如我们常用的NodeList,arguments,但却不能使用数组方法,如forEach,map

1. length

var foo = function () {console.log(arguments.length)
}
foo() // 0
foo(1, 2) // 2

2. Function.arguments永远不要使用,已被废除,直接使用arguemnts对象

3. arguments对象会被参数或变量arguments覆盖

var foo = function () {console.log(arguments) // [10]
}
foo(10)var bar = function (arguments) {console.log(arguments) // 10
}
bar(10)var foo = function () {console.log(arguments) // [10]
}
foo(10)
var bar = function (arguments) {arguments = 20console.log(arguments) // 20
}
bar(20)

4.将arguments对象转化为数组对象

  • arguments = [].slice.call(arguments)

  • arguments = Array.from(arguments)

  • 待补充(暂时没想到其余简洁的写法.)

5. arguments.callee指向当前正在被执行的函数 -- 应当停止使用

最常见的一个例子
阶乘

var foo = function (x) {return x >= 1 ? x * arguments.callee(x-1) : 1
}
console.log(foo(3)) // 6

关于它更详尽的解释,我更愿意给你推荐下面这个链接。
link-可能需要自备梯子
值得注意的一点是,在下面我们提到的ES5 use strict模式下,使用arguments.callee会报错.

5. arguments数量 >= parameters数量 -- 双向绑定

var foo = function (x, y) {arguments[0] = 10console.log(arguments[0], x) //10, 10x = 20console.log(arguments[0], x) //20, 20arguments[1] = 30console.log(arguments[1], y) //30, 30y = 40console.log(arguments[1], y) //40, 40
}
foo(1, 2)

6. arguments数量 < parameters数量 -- 缺省参数未双向绑定

var foo = function (x, y) {arguments[0] = 10console.log(arguments[0], x) //10, 10x = 20console.log(arguments[0], x) //20, 20arguments[1] = 30console.log(arguments[1], y) //30, undefinedy = 40console.log(arguments[1], y) //40, 40
}
foo(1)

7. use strict

以上2种情况,会给我们在使用时稍不注意,不去区分,就会犯错。
不过还好,我们可以通过ES 5use strict特性进行统一.

//对应上面第一种情况
var foo = function (x, y) {'use strict'arguments[0] = 10console.log(arguments[0], x) //10, 1x = 20console.log(arguments[0], x) //10, 20arguments[1] = 30console.log(arguments[1], y) //30, 2y = 40console.log(arguments[1], y) //30, 40
}
foo(1, 2)
//对应上面第二种情况
var foo = function (x, y) {'use strict'arguments[0] = 10console.log(arguments[0], x) //10, 1x = 20console.log(arguments[0], x) //10, 20arguments[1] = 30console.log(arguments[1], y) //30, undefinedy = 40console.log(arguments[1], y) //30, 40
}
foo(1)

因为在严格模式下,arguments对象被禁止为函数参数创建gettersetter方法。

8. 使用...Rest代替

...Rest只能被定义在函数参数的最后一个位置,传进函数的多余参数都将传进这个数组

var foo = function (x, y, ...z) {console.log(z) // [3, 4, 5]console.log(Array.isArray(z)) // true
}
foo(1, 2, 3, 4, 5)

结束语

欢迎指正错误和提出更多的关于`arguments`的内容~

浅析js中的arguments相关推荐

  1. js中的arguments

    arguments是JavaScript里的一个内置对象,是指向实参对象的引用,它很古怪,也经常被人所忽视,但实际上是很重要的.所有主要的js函数库都利用了arguments对象,所以agrument ...

  2. python变量存储 堆与栈内存内存_浅析JS中的堆内存与栈内存

    最近跟着组里的大佬面试碰到这么一个问题, Q:说说var.let.const的区别 A:balabalabalabla... Q:const定义的值能改么? A:你逗我?不能吧 不知道各位看官怎么想? ...

  3. uniapp 获取到js文件var一个变量怎么获取到这个变量值_浅析Js中const,let,var的区别及作用域...

    理解:let变量的作用域只能在当前函数中 js中const,let,var的区别及作用域_lianzhang861的博客-CSDN博客​blog.csdn.net 全局作用域中,用 const 和 l ...

  4. java js中 function函数报错_浅析JS中对函数function的理解(基础篇)

    正文:我们知道,在js中,函数实际上是一个对象,每个函数都是Function类型的实例,并且都与其他引用类型一样具有属性和方法.因此,函数名实际上是指向函数对象的指针,不与某个函数绑定.在常见的两种定 ...

  5. 中getname_浅析JS中的class

    前言 在 ES6 规范中,引入了 class 的概念.使得 JS 开发者终于告别了,直接使用原型对象模仿面向对象中的类和类继承时代. 但是JS 中并没有一个真正的 class 原始类型, class ...

  6. 浅析Js中${}字符串拼接

    字符串拼接 Es6中的${}新语法 这是es6中新增的字符串方法 配合反单引号完成拼接字符串的功能 反单引号怎么打出来? 将输入法调整为英文输入法,单击键盘上数字键1左边的按键. 用法: step1: ...

  7. javascript系统系列:浅析js中的浏览器循环事件(eventLoop)

    大家好,我是前端岚枫,今天主要跟大家分享我整理的浏览器事件循环eventLoop相关:eventloop, 微任务.宏任务等,此方面内容在我们的工作中常用到, 也是大厂面试经常提问的问题,希望下面文章 ...

  8. 浅析Js中对象与数组的深拷贝

    一级属性深拷贝,形如这样的对象我们可以使用Object.assign()对其进行深拷贝. let obj = {a:'123'} let copy = Object.assign({},a) cons ...

  9. js中的arguments 参数

    function sum (a,b) {} //1,2 为实参 3,4 为形参 sum(1,2,3,4)打印参数长度 arguments.length 函数实参长度 函数名.length 转载于:ht ...

最新文章

  1. C++ 笔记(31)— 类继承
  2. 使用深度学习方法实现面部表情包识别
  3. Win64 驱动内核编程-22.SHADOW SSDT HOOK(宋孖健)
  4. crontab 详细用法 定时任务
  5. android Rect类的使用
  6. [转]SSH反向连接及Autossh
  7. pe怎么删除linux文件夹,PE环境下,面对无法删除的文件夹怎么办?
  8. FMEA-MSR步骤五:风险分析(三)
  9. MFC CString互转LPVOID
  10. 人工智能之模式识别(二)
  11. JS实现图片不存在时显示默认图片
  12. linux下的超级服务器inetd
  13. #学习方法 linux的教程推荐
  14. 处理 unity崩溃日志
  15. 华为路由器怎么看是不是公网_华为路由器怎么判断有没有被蹭网
  16. hbase(十)merge region
  17. opencv:对`cv :: DescriptorMatcher‘的未定义引用
  18. 存储基础知识 - 传统存储 NAS SAN 和 分布式存储对比
  19. 使用Typora设置图片自动上传至gitee仓库
  20. 问卷网金数据可行性分析

热门文章

  1. MyBatis-Plus,搭配 Spring Boot 使用,一篇就够了
  2. Nginx 常用配置清单
  3. 为什么 HashMap 加载因子一定是0.75?而不是0.8,0.6?
  4. Java 性能优化:教你提高代码运行的效率
  5. 从绩点 1.8 逆袭的复旦博士,华为天才少年!
  6. 一文详尽系列之EM算法
  7. 【廖雪峰python入门笔记】set
  8. 于正AI换脸火上热搜,差点骗了全网!古风民族风也能任意切换
  9. 精选一套火爆B站的硬核资源,请笑纳!
  10. 用树莓派DIY车钥匙,开锁仅需90秒