美文网首页
JavaScript 函数中的 arguments 对象

JavaScript 函数中的 arguments 对象

作者: 枫_d646 | 来源:发表于2018-01-19 15:37 被阅读0次
1. arguments 是一个类似数组的对象, 和传递给函数的参数相对应。
2. arguments 对象是所有函数(箭头函数除外)中可用的局部变量。
3. 可以使用 arguments 对象在函数中引用传入函数的参数。此对象包含传递给函数的每个参数,第一个参数的索引从0开始。
function  func1() {
      console.log(arguments[0]);
      console.log(arguments[1]);  
}

func1('a','b');       //输出      a            b
func1('c')            //输出      c         undefined
func1()              //输出   undefined      undefined     

注意:
(1) 获取函数参数时,下标从 0 开始,例如 arguments[0] 获取传入函数的第一个参数,arguments[1] 获取传入函数的第二个参数
(2) 函数不传入参数时 arguments[i] 均为 undefined
(3) 使用 arguments[i] 获取传入函数的参数时, i 大于等于传入函数参数的个数时,也是 undefined。例如传入函数三个参数, 获取 argument[4], arguments[5] 都为 undefined
(4) arguments 对象的值可以设置, 如 arguments[1]='new value';

4. arguments 对象转化为真正的数组
ES5 的方法:
var  args = Array.prototype.slice.call(arguments);
var  args = [].slice.call(arguments);
var args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null,arguments));

ES6 的方法:
var  args= Array.from(arguments);       
var  args = [...arguments];                     

数据类型判断: arguments 对象数据类型是 object, 不是array

function func2() {
    console.log(arguments.length);
    console.log(typeof arguments);
    console.log(typeof arguments[0]);
}

func2()                   //输出 0 'object'  undefined
func2('a',3,4)          //输出 3 'object'  'string'
func2(2,3)              //输出 2 'object'  'number'
5. 剩余参数、默认参数以及结构赋值参数对 arguments 对象的影响

(1). 严格模式 ('strict mode'): 剩余参数,默认参数,结构赋值参数的存在不会改变 arguments 对象的行为

(2). 非严格模式 (non-strict code)

当非严格模式的函数不包含剩余参数,默认参数,或结构赋值参数时, arguments 对象将跟踪参数的变化

例子1:
function func(a)  {
        arguments[0] = 99;      // 修改了 arguments[0] 的同时也更新了 a
        console.log(a);
}

func(10);      // 99

例子2:
function func(a)  {
        a = 200;                       // 修改了 a 的同时也更新了 arguments[0]
        console.log(arguments[0]);
}

func(10);      // 200
当非严格模式的函数包含有剩余参数,默认参数,或结构赋值参数时, arguments 对象将不会跟踪参数的变化

例子1:
function func(a=55)  {
      arguments[0] = 99;      // 有默认参数,修改 arguments[0] 不会影响 a
      console.log(a);
}

func(10);      // 10

例子2:
function func(a=55)  {
         a = 200;                    // 有默认参数,修改 a 不会影响 arguments[0]
         console.log(arguments[0]);
}

func(10);      // 10

例子3:
function  func(a=55)  {
        console.log(a);
        console.log(arguments[0]);
}

func();      // 55  undefined        
//函数调用的时候没有传递参数,所以 arguments[0] 为 undefined,而当发现没有传值的时候 a 就会取默认值 55
6.arguments 对象的 ES6 替代 ...rest (剩余参数)
function foo(...args) {
    console.log(Array.isArray(args));
    return  args;
}

foo();           //  true  []
foo(24,66);      //  true  [24,66]
7. arguments 对象在箭头函数 (arrow function) 中不可用
var f = () => {
      console.log(arguments);
}

f();        // 报错:ReferenceError: arguments is not defined

//箭头函数
var f1 = () => {
     console.log(typeof arguments);
}

f1();        // undefined

//普通函数
function f2() {
      console.log(typeof arguments);
}

f2();          // object

箭头函数中的 arguments 其实是获取的外层非箭头函数的 arguments 对象,如果不存在则是 undefined

function  f3(){
  //返回一个箭头函数,函数中引用了 arguments 对象,其实是引用的外层 f3 函数的 arguments 对象
  return (p) =>  {  
                   console.log(arguments[0]);
                   console.log(p);
             };
}

var a = f3();
var b = a(566);        // undefined 566 


var a = f3(123);
var b = a(566);        // 123  566
8.arguments 对象的一些属性

arguments.length 传递给当前函数的参数数量
arguments.callee 当前执行的函数 (非标准,不建议使用)
arguments.caller 指调用当前函数的函数(废弃api,不建议使用)

//函数 f1  利用 arguments 和 arguments.callee 写了一个求阶乘的函数
function f1() {
         if (arguments[0] === 1) return 1;
         return arguments[0] * arguments.callee(arguments[0]-1)
}

f1(5);      //120  

function f2() {
  return arguments.length;
}

f2() === 0;
f2('a') === 1;
f2('a',23,55,'c') === 4;

参考链接

相关文章

网友评论

      本文标题:JavaScript 函数中的 arguments 对象

      本文链接:https://www.haomeiwen.com/subject/ipnooxtx.html