【问题标题】:When to use call or what is the benefit to use call in Javscript?何时使用 call 或在 Javascript 中使用 call 有什么好处?
【发布时间】:2020-11-18 14:10:05
【问题描述】:

我正在浏览 Ramda.JS 的源代码,它是一个面向 Javascript 开发人员的函数库。这几行代码让我有点困惑。

var sort = _curry2(function sort(comparator, list) {
  return Array.prototype.slice.call(list, 0).sort(comparator);
});

我的问题是

  • Array.prototype.slice.call(list, 0) 应该与list.slice(0) 完全相同,但第二种方式要短得多
  • 为什么在这里使用.call,为什么不使用第二种方式呢?
    • 在这里使用 call 有什么好处吗?

参考文献


更新

非常感谢@VLAZ

此截图来自他/她在评论中的建议。

a.slice(0)Array.prototype.slice.call(a, 0) 在非数组对象上非常不同。

【问题讨论】:

  • 我试过谷歌,但没有结果可以帮助解决这个问题
  • 尝试使用list = {0: "foo", 1: "bar", 2: "baz", length: 3} 调用它,并尝试使用您建议的实现。如果您认为该示例是人为的,请尝试使用document.querySelectorAll("div")
  • 另一种说法是,这里使用的实现适用于数组,但也适用于足够像数组的值,具有length 属性和低整数键属性的东西。除了描述的任意对象和 NodeList,这还包括 arguments 对象和字符串。 Ramda 是在 ES5 普及之前启动的。当用现代 JS 重写 Ramda 时,它可能会跳过这一点并使用类似 [...val]Array.from(val) 的语法。
  • @VLAZ: 没有人花时间为一个好的 1.0 版本做个总结。但是一旦我们这样做了,我们的计划就是迁移到 ES6,这应该会简化大部分实现。
  • @ScottSauyet 谢谢。我真的很喜欢 Ramda,我期待更多。我可能会开始更密切地跟踪发展,因为我很好奇这将如何发展。我认为你们都做得很棒,所以感谢你们的工作:)

标签: javascript arrays functional-programming prototype ramda.js


【解决方案1】:

在我看来,Array.prototype.slice.call 支持 Array-Like Objects,例如 NodeList 集合。

const divs = document.querySelectorAll('div')
divs.slice(0)
//Uncaught TypeError: divs.slice is not a function
Array.prototype.slice.call(divs, 0)
//(222) [div.ng-toast.ng-toast--right.ng-toast--bottom.ng-toast--animate-fade, ……

【讨论】:

  • 谢谢,点赞,说的有道理,只是好奇有没有其他原因?
  • slice 方法也可以被调用来将类似数组的对象/集合转换为一个新的数组。您只需将方法绑定到对象。函数内部的参数是“类数组对象”的一个示例。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
【解决方案2】:

从签名我可以说 list.slice()[0] 与 Array.prototype.slice.call(list, 0) 完全不同,在前一个语句中,您首先调用 list.slice 并访问它的第 0 个索引元素,在后面的语句中,您调用 Array.slice 将上下文作为列表的值和 0 作为切片函数的参数。

【讨论】:

  • 谢谢,这是我的错误,我只是更新问题。
  • 我的意思是Array.prototype.slice.call(divs, 0) vs divs.slice(0)
【解决方案3】:

值得注意的是,当arr 不是数组/字符串且arr 没有slice 方法时,使用Array.prototype.slice.call(arr, 0) 而不是arr.slice() 不会引发错误。

也许他们想要一个更健壮的实现,因此使用第一种方法。

【讨论】:

  • 谢谢。 Array.prototype.slice.call(undefined, 0) 但它喜欢这也会引发错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
相关资源
最近更新 更多