我一直在阅读一些 javascript 库的代码。我注意到 AngularJS 和 Backbone.js 都保留对数组函数的本地引用。例如:
var push = [].push // or array.push
当数组是语言的构造并且应该可以全局访问时,这样做有什么意义?
最佳答案
因为Array原型(prototype)的函数可以应用于非数组。
例如,将项目插入
到类似数组的对象中:
var o = { length: 0 };
[].push.call(o, 'hi');
o; //Object {0: "hi", length: 1}
另一种常见做法是将 arguments
对象切片
放入 native 数组中:
(function() {
return [].slice.call(arguments); //[1, 2]
}(1, 2));
正如您所看到的,保存对这些函数的引用可以减少查找开销,使代码更小并且适合缩小。
在我看来,这主要是为了方便和可读性,因为重复编写 [].arrayMethod
看起来相当笨拙。性能和缩小程度的提升是额外的。
查看 Angular 的源代码,我发现了以下情况:
push
用于 JQLite prototype 。请注意,jQuery 对象具有类似数组的结构,类似于本答案中的第一个示例;slice
用于sliceArgs
内部,concat
和bind
功能。
Backbone 还使用 slice
参数对象(在 Events#trigger 和 Underscore methods proxying 处),它也在 Collection#slice 处使用 slice
.
关于javascript - 为什么 Javascript 库有对数组方法(push、slice 等)的本地引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20015535/