Array.prototype.fill()
fill()方法用一个固定值填充一个数组中从起始索引到终止索引内的全部元素。
此方法会改变数组自身。
这是一个ES6方法。
第一个参数value是用来填充数组元素的值;第二个参数start是起始索引,默认是0;第三个参数end是结束索引,默认是this.length。
返回值是修改后的数组。
如果start和end是负数,会被计算成this.length + start和this.length + end。
this也可以是对象类型。
[1, 2, 3].fill(4); // [4, 4, 4] [1, 2, 3].fill(4, 1); // [1, 4, 4] [1, 2, 3].fill(4, 1, 2); // [1, 4, 3] [1, 2, 3].fill(4, 1, 1); // [1, 2, 3] [1, 2, 3].fill(4, 3, 3); // [1, 2, 3] [1, 2, 3].fill(4, -3, -2); // [4, 2, 3] [1, 2, 3].fill(4, NaN, NaN); // [1, 2, 3] [1, 2, 3].fill(4, 3, 5); // [1, 2, 3] Array(3).fill(4); // [4, 4, 4] [].fill.call({ length: 3 }, 4); // {0: 4, 1: 4, 2: 4, length: 3} // Objects by reference. var arr = Array(3).fill({}) // [{}, {}, {}]; arr[0].hi = "hi"; // [{ hi: "hi" }, { hi: "hi" }, { hi: "hi" }]
polyfill
if (!Array.prototype.fill) { Object.defineProperty(Array.prototype, 'fill', { value: function(value) { // Steps 1-2. if (this == null) {//如果this是null,抛错误 throw new TypeError('this is null or not defined'); } var O = Object(this);//将this转换成对象 // Steps 3-5. var len = O.length >>> 0;//???不知为何要无符号右移0位,可能是避免object类型的length是undefined // Steps 6-7. var start = arguments[1];//起始索引 var relativeStart = start >> 0;//起始索引右移0位,也就是做取整,相当于parseInt(Number(start) || 0) // Step 8. var k = relativeStart < 0 ? Math.max(len + relativeStart, 0) : Math.min(relativeStart, len); //预处理起始索引,如果其实索引是负数,就变成正数,this.length + start,如果大于length就变成length // Steps 9-10. var end = arguments[2];//结束索引 var relativeEnd = end === undefined ? len : end >> 0;//结束索引不存在就等于length // Step 11. var final = relativeEnd < 0 ? Math.max(len + relativeEnd, 0) : Math.min(relativeEnd, len); //预处理结束索引 // Step 12. while (k < final) {//循环,为start到end之间的位置赋值 O[k] = value; k++; } // Step 13. return O; } }); }