arguments

作者: anddju | 来源:发表于2019-06-29 15:35 被阅读0次

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

    MDN链接

    总结:

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

    相关文章

      网友评论

        本文标题:arguments

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