为什么Javascript库具有对数组方法的本地引用(推送,切片等等)?

Art*_*anV 21 javascript backbone.js angularjs

我一直在阅读一些JavaScript库的代码.我注意到AngularJS和Backbone.js都保留了对数组函数的本地引用.例如:

var push = [].push  // or array.push
Run Code Online (Sandbox Code Playgroud)

当数组是语言的结构并且应该可以全局访问时,这样做的重点是什么?

Fab*_*tté 11

因为Array原型的函数可以应用于非数组.

例如,将push项目放入类似数组的对象:

var o  = { length: 0 };
[].push.call(o, 'hi');
o; //Object {0: "hi", length: 1}
Run Code Online (Sandbox Code Playgroud)

另一种常见做法是slicearguments对象转换为本机数组:

(function() {
   return [].slice.call(arguments); //[1, 2]
}(1, 2));
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,保存对这些函数的引用可以减少查找开销,使代码更小并且更加简洁.

在我看来,这主要是为了方便和可读性,因为反复写作[].arrayMethod看起来相当笨重.性能和缩小提升是额外的.


通过Angular的来源,以下是我发现的案例:

  • push用于JQLite原型.请注意,jQuery对象具有类似于数组的结构,类似于本答案中的第一个示例;
  • slice使用内部sliceArgs,concatbind功能.

骨干也slice论点对象(在事件触发#下划线方法代理),它也使用slice集合#片.