【问题标题】:Converting function's arguments to array-like object将函数的参数转换为类似数组的对象
【发布时间】:2013-07-25 19:52:42
【问题描述】:

有人告诉我,它对于使“参数”对象成为真正的数组以及创建现有数组的副本很有用。但是,是否有必要转换为类似数组的对象?这样做有什么好处?

function toArray(obj) {
    return Array.prototype.slice.call(obj);
}

function bind(scope, fn) {
    return function() {
         // why not just return fn.apply(scope, arguments);  ?
         return fn.apply(scope, toArray(arguments));
    };
}

我知道'arguments'对象的好处是它包含'length'属性,因此我们可以转换为类似数组的对象,但是当我通过传入类似的对象来测试它时

x = { 
     'a': 'a', 
     'tt': 'tt', 
     '2':'2', 
      length:3 
};

toArray(x); // [undefined x 2, 2]

它返回一个包含undefined 元素的数组,是不是因为它们的键不是数字的?

【问题讨论】:

  • "为什么不只是return fn.apply(scope, arguments);" ...鉴于你的例子,这正是你应该做的。没有理由在那里做toArray(arguments),除非你想传递参数的一个子集。
  • ...看起来您的示例有点像 "mini-bind" 函数。在典型的.bind() 中,可以将.concat() 传递给arguments 到绑定arguments 的末尾,这需要一个数组才能将两者展平为一个平面数组。喜欢:return fn.apply(scope, orig_args.concat(toArray(arguments)));
  • @CrazyTrain orig_args 是什么?可以举个例子吗
  • 基本上,传递给bind()函数的任何参数都在scopefn之后。所以在bind() 函数的顶部,你会做var orig_args = Array.prototype.slice.call(arguments, 2);。现在第二个之后的任何参数都将保存在orig_args 中,因此当调用返回的函数时,这些参数将首先传递,而任何直接传递给返回函数的参数都将添加到绑定的参数之后。跨度>
  • ...基本上像这样:jsfiddle.net/bwMbE/1 我更改了toArray() 函数以接收设置切片起始索引的第二个参数。

标签: javascript function prototype bind slice


【解决方案1】:

如果你这样做了:

x={1:1,2:1,0:55,length:3};
toArray(x);

// result [55, 1, 1]

一个数组会期望键是数字。 所以它通过查看 0... undefined 看着 1... 未定义 看着 2...'2'

所以是的,这是因为它们的键不是数字。

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2017-02-24
    • 1970-01-01
    • 2017-06-08
    • 2019-04-14
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多