工作生活

arguments

2019-06-29  本文已影响0人  anddju

为啥会写这个,前几天面试的时候,面试官问我,arguments 是数组么,我说是的。因为在使用的过程中,都是直接用下标和length 去取值,未曾想过调用一些数组的方法。面试官说,arguments是一个伪数组。印象深刻。所以今天看一下。

MDN链接

总结:

一些小测试

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对象已与过往不同。[arguments[@@iterator]](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments/@@iterator)不再与函数的实际形参之间共享,同时caller属性也被移除

上一篇下一篇

猜你喜欢

热点阅读