类数组 arguments
// 情况1 (正常形参和实参) let fun1 = function(param) { // console.log(arguments); // 打印出[Arguments] { '0': 12 } { '0': 12 } // 可以用 Array.from() 转换成数组 或者for in 或者 扩展运算 ... console.log(Array.from(arguments)); // 打印出 [12] };
fun1(12);
// 情况2(实参大于形参) let fun2 = function(param) { console.log(arguments); // [Arguments] { '0': 12, '1': 1, '2': 2 } console.log([...arguments]); // [ 12, 1, 2 ] }; fun2(12, 1, 2);
// 情况3(刻意改变length) let fun3 = function(param) { arguments.length = 3; console.log(arguments); // [Arguments] { '0': 12 } console.log([...arguments]); // [ 12, undefined, undefined ] }; fun3(12);
/* 说明 */ // arguments 内部接收到了参数后 实际是这样的数据结构 { 0: '12', 1: '1', 2: '2', length: 3 }
栗子1
var length = 4; function callback() { console.log(this.length); } const object = { length: 5, method() { arguments[0](); }, }; object.method(callback, 1, 2); /* 结果 */ arguments[0]()是arguments对象上的回调的方法调用,所以回调内部的参数等于arguments。 所以 callback()中的this.length与arguments.length相同,即3
栗子2
我们使用 getElementsByTagName() 方法获取这些列表元素。 document.getElementsByTagName('li'); 它返回 HTMLCollection 是类数组对象 它和数组类似,我们试着使用 forEach 来遍历它: document.getElementsByTagName('li').forEach(() => { // Do something here.. }) 在类数组对象上调用 forEach 发生错误 为什么会这样?这是因为 HTMLCollection 并不是数组,而是 类数组 对象,所以不能使用 forEach 来遍历它。 其原型(proto)是 Object 这里就需要用到 Array.from() 方法了,Array.from() 能将类数组对象转换为数组,进而能够在它上面执行所有数组操作。(你new Array(6)这样创建的也需要from下 不然不能直接遍历) const collection = Array.from(document.getElementsByTagName('li')) 这时的 collection 是一个数组
简写
不要在函数体内使用 arguments 变量,使用 rest 运算符(...)代替。因为 rest 运算符显式表明你想要获取参数,
而且 arguments 是一个类似数组的对象,而 rest 运算符可以提供一个真正的数组。 // bad function concatenateAll() { const args = Array.prototype.slice.call(arguments); return args.join(''); } // good function concatenateAll(...args) { return args.join(''); } —— 来自阮一峰 ECMAScript 6 入门
分类:
JavaScript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示