是否有任何 JavaScript 数组库可以规范化数组返回值和突变?我认为 JavaScript Array API 非常不一致。
一些方法会改变数组:
var A = [0,1,2];
A.splice(0,1); // reduces A and returns a new array containing the deleted elements
有些不:
A.slice(0,1); // leaves A untouched and returns a new array
有些返回对变异数组的引用:
A = A.reverse().reverse(); // reverses and then reverses back
有些只是返回未定义:
B = A.forEach(function(){});
我想要的是总是改变数组并总是返回相同的数组,所以我可以有某种一致性,也可以链接。例如:
A.slice(0,1).reverse().forEach(function(){}).concat(['a','b']);
我尝试了一些简单的片段,例如:
var superArray = function() {
this.length = 0;
}
superArray.prototype = {
constructor: superArray,
// custom mass-push method
add: function(arr) {
return this.push.apply(this, arr);
}
}
// native mutations
'join pop push reverse shift sort splice unshift map forEach'.split(' ').forEach(function(name) {
superArray.prototype[name] = (function(name) {
return function() {
Array.prototype[name].apply(this, arguments);
// always return this for chaining
return this;
};
}(name));
});
// try it
var a = new superArray();
a.push(3).push(4).reverse();
这适用于大多数突变方法,但存在问题。例如,我需要为每个不改变原始数组的方法编写自定义原型。
所以当我这样做的时候,我一直在想,也许这以前已经做过了?是否已经有任何轻量级数组库可以做到这一点?如果该库还为旧浏览器的新 JavaScript 1.6 方法添加填充程序,那就太好了。