如果Array.prototype.filter返回一个数组,为什么我不能立即在这个返回值上调用push()?
例:
var arr = ["a", "ab", "c", "ad"];
var arr2 = arr.filter(function(elmnt) { return elmnt.indexOf("a") > -1; });
// result: ["a", "ab", "ad"]
arr2.push("aaa");
// result: ["a", "ab", "ad", "aaa"]
好到目前为止.
但是如果将push()调用链接到filter()调用呢?
var arr = ["a", "ab", "c", "ad"];
var arr2 = arr.filter(function(elmnt) { return elmnt.indexOf("a") > -1; }).push("aaa");
// result: 4
为什么链接filter()和push()会导致我期望的元素数量,而不是这些元素的数组?
解决方法:
问题不在于filter()返回什么,而是与push()返回的内容有关.
push()
返回数组的新长度,而不是数组本身.
所以当你这样做时:
var arr2 = arr.filter(function(elmnt) { return elmnt.indexOf("a") > -1; }).push("aaa");
将为arr2分配数组的新长度(在您的情况下恰好为4),而不是新数组.
一个可以做你想做的修改版本:
var arr = ["a", "ab", "c", "ad"], arr2;
(arr2 = arr.filter(function(elmnt) { return elmnt.indexOf("a") > -1; })).push("aaa");
// now arr2 is ["a", "ab", "ad", "aaa"]