arguments
2019-06-29 本文已影响0人
anddju
为啥会写这个,前几天面试的时候,面试官问我,arguments 是数组么,我说是的。因为在使用的过程中,都是直接用下标和length 去取值,未曾想过调用一些数组的方法。面试官说,arguments是一个伪数组。印象深刻。所以今天看一下。
总结:
- arguments 不是一个数组,是一个对象 ,可以使用 .length属性,索引
- 可以转换成数组 (为啥要转,为啥要修改本不应该修改的值)
- 有 .callee() 方法执行函数 (严格模式下删除) 。 .caller() 获取当前的调用位置 (浏览器中输出为 undefined)
一些小测试
function test(){
console.log(arguments ); //Arguments [123, callee: ƒ, Symbol(Symbol.iterator): ƒ] 0: 123 ,callee: ƒ test() ,length: 1 ,Symbol(Symbol.iterator): ƒ values(), __proto__: Object
console.log( typeof arguments ); // object (string类型的)
console.log( Array.isArray(arguments) ); // false
console.log( arguments.__proto__.constructor()); // 空对象 {} ,有对象的原型链
console.log(arguments.caller) // 获取当前的调用函数 , 浏览器调试工具中输出:undefined
}
描述
arguments对象是所有 (非箭头) 函数中都可用的局部变量。你可以使用arguments对象在函数中引用函数的参数。此对象包含传递给函数的每个参数,第一个参数在索引0处。参数也可以被设置。
arguments
对象不是一个 Array
。它类似于Array
,但除了length属性和索引元素之外没有任何Array
属性。例如,它没有 pop 方法。
但是它可以被转换为一个真正的Array:
var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);
// ES2015
const args = Array.from(arguments);
const args = [...arguments];
/*
对参数使用slice会阻止某些JavaScript引擎中的优化 (比如 V8 - [更多信息](https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#3-managing-arguments))。如果你关心性能,尝试通过遍历arguments对象来构造一个新的数组。另一种方法是使用被忽视的`Array`构造函数作为一个函数
*/
var args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments));
arguments 属性
-
arguments.callee
- 指向当前执行的函数。
-
arguments.caller
- 指向调用当前函数的函数。
-
arguments.length
- 指向传递给当前函数的参数数量。
注意:现在在严格模式下,arguments
对象已与过往不同。[arguments[@@iterator]](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments/@@iterator)
不再与函数的实际形参之间共享,同时caller属性也被移除