【发布时间】: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