Array.prototype.fill
ES6 (ECMAScript 2015), 新增的方法。
根据下标范围给范围内的元素填充新的值。
value,start,end [start, end)
常规用法
const arr = [1, 2, 3, 4, 5];
arr.fill('a', 2, 4); // [1, 2, "a", "a", 5]
arr.fill('b', 2, 5); // [1, 2, "b", "b", "b"]
新数组是原数组引用
const newArr = arr.fill('a', 2, 4);
console.log(newArr === arr);
start 存在,end 不存在
arr.fill('c', 2); // [1, 2, "c", "c", "c"]
start,end 都不存在
arr.fill('d'); // ["d", "d", "d", "d", "d"]
start,end 为负数
arr.fill('e', -4, -2); // [1, "e", "e", 4, 5]
所有参数都不存在
arr.fill(); // [undefined, undefined, undefined, undefined, undefined]
start、end 一致
arr.fill('f', 1, 1); // [1, 2, 3, 4, 5]
start 非数,end 非数
arr.fill('g', 'a', 'b'); // [1, 2, 3, 4, 5]
start 非数,end 为数字
arr.fill('g', 'a', 4); // ["g", "g", "g", "g", 5]
start、end 都为 NaN
arr.fill('h', NaN, NaN); // [1, 2, 3, 4, 5];
start NaN,end 数字
arr.fill('i', NaN, 4); // ["i", "i", "i", "i", 5]
start、end 都为 Null
arr.fill('j', null, null); // [1, 2, 3, 4, 5];
start Null,end 数字
arr.fill('j', null, 4); // ["j", "j", "j", "j", 5]
start,end 都为 undefined,全部覆盖
arr.fill('k', undefined, undefined); // ["k", "k", "k", "k", "k"]
start 数字,end undefined
arr.fill('k', 1, undefined); // [1, "k", "k", "k", "k"]
无论是非数字、NaN、null 结果都是一致的,undefined 与之不同,undefined 可以看作没有填写。
- 参数 value 可选,默认全部填充 undefined
- 参数 start 可选,默认为 0
- 参数 end 可选,默认为数组长度
对象调用 fill
[].fill.call({
length: 3
}, 4);
// {0: 4, 1: 4, 2: 4, length: 3}
创建类数组的方法
function makeArrLike (arr) {
var arrLike = {
length: arr.length,
push: [].push,
splice: [].splice
};
arr.forEach(function (item, index) {
[].fill.call(arrLike, item, index, index + 1);
});
return arrLike;
}
makeArrLike(['a', 'b', 'c', 'd', 'e']);
fill 方法实现
Array.prototype.$fill = function () {
var value = arguments[0] || undefined,
start = arguments[1] >> 0,
end = arguments[2];
if (this == null) {
throw new TypeError('This is null or not defined.');
}
var obj = Object(this),
len = obj.length >> 0;
start = start < 0 ? Math.max(len + start, 0) : Math.min(start, len);
end = end === undefined ? len : end >> 0;
end = end < 0 ? Math.max(len + end, 0) : Math.min(end, len);
while (start < end) {
obj[start++] = value;
}
return obj;
}
const arr = [1, 2, 3, 4, 5];
arr.$fill('a', 2, 4); // [1, 2, "a", "a", 5]