在JavaScript中实现Array.prototype.reduce()方法的polyfill
polyfill是一种使用用户定义的方法来扩展浏览器功能的概念。如果用户的浏览器没有更新,那么可能浏览器不支持任何编程语言(如JavaScript)的新特性。
作为开发人员,我们需要检查浏览器是否支持该功能,如果不支持,我们需要调用用户定义的方法。
在本教程中,我们将讨论实现array.reduce()方法的polyfill。如果任何浏览器不支持array.reduce()方法,我们将调用用户定义的reduce()方法。
在开始教程之前,让我们先了解reduce()方法的作用。reduce()方法将数组减少为单个元素。例如,我们可以使用array.reduce()方法来找到数组中所有元素的总和,因为我们将所有数组元素减少为单个总和变量。此外,我们还可以使用reduce()方法将数组的所有字符串连接成一个字符串。
语法
用户可以按照下面的语法实现array.reduce()方法的polyfill。
Array.prototype.reduce = function (callbackFunc, initial) {
// implement logic for reduce() method
}
在上面的语法中,我们将reduce()方法添加到Array对象的原型对象中。我们需要在函数中实现reduce()方法的逻辑。
示例(使用内置的reduce()方法)
在下面的示例中,我们创建了一个数字数组,并使用reduce()方法来获取数组所有元素的总和。用户可以观察到我们如何将数组减少为一个单一元素。
<html>
<body>
<h2>Using the <i> reduce() method without polyfill </i> in JavaScript</h2>
<div id = "content"> </div>
<script>
let content = document.getElementById('content');
function callback(sum, value) {
return sum + value;
}
let array = [30, 50, 6, 7, 8, 9, 50, 3, 2, 3, 43, 5, 4, 3, 23, 32, 456];
let sum = array.reduce(callback, 0);
content.innerHTML += "The array values are " + array + "<br>";
content.innerHTML += "The sum of all array elements using the array.reduce() method is " + sum + "<br>";
</script>
</body>
</html>
实现reduce()方法的填充
用户应按照以下步骤来实现数组reduce()方法的逻辑。
步骤1 - 创建一个singleElement变量,并将其初始化为作为参数传递的初始值。初始值是一个可选参数,所以如果用户没有将初始值作为reduce()方法的参数传递,它可以是未定义的。
步骤2 - 使用for循环迭代数组。
步骤3 - 如果singleElement的值是未定义的,将其初始化为数组的第一个元素。
步骤4 - 使用call()方法执行回调函数,将回调函数的返回值替换为singleElement变量的值。
步骤5 - 一旦for循环的迭代完成,返回singleElement变量的值。
示例
在下面的示例中,我们使用reduce()方法对数组元素进行求和,就像上面的示例一样,但是这里我们使用了用户定义的reduce()方法。
我们已经按照上述步骤实现了用户定义的reduce()方法,并且用户可以观察到它产生了与前面示例相同的输出。
<html>
<body>
<h2>Using the <i> reduce() method with polyfill </i> in JavaScript</h2>
<div id = "content"> </div>
<script>
let content = document.getElementById('content');
function callback(sum, value) {
return sum + value;
}
let array = [30, 50, 6, 7, 8, 9, 50, 3, 2, 3, 43, 5, 4, 3, 23, 32, 456];
Array.prototype.reduce = function (callbackFunc, initial) {
// initial is an optional parameter.
// if initial passed as an argument, initialize the singleElement with the initial value.
// Otherwise, initialize the singleElement with the first value of the array.
let singleElement = initial;
for (let k = 0; k < this.length; k++) {
if (singleElement) {
singleElement = callbackFunc.call(null,
singleElement, this[k], k, this);
}
else {
singleElement = this[k];
}
}
// return the single element.
return singleElement;
}
let sum = array.reduce(callback)
content.innerHTML += "The array values are " + array + "<br>";
content.innerHTML += "The sum of all array elements using the array.reduce() method is " + sum + "<br>";
</script>
</body>
</html>
示例
我们已经优化了下面示例中的polyfill reduce()方法。我们在reduce()方法中使用了forEach()方法来提高迭代性能。此外,我们还使用了三元运算符来初始化start变量。
此外,我们定义了字符串数组,并使用array.reduce()方法将所有数组元素转换为单个字符串。
<html>
<body>
<h2>Using the <i> reduce() method with polyfill </i> in JavaScript</h2>
<div id = "content"> </div>
<script>
let content = document.getElementById('content');
Array.prototype.reduce = function (callbackFunc, start) {
let array = this;
array.forEach(value => {
start = start !== undefined ? callbackFunc(start, value) : value
})
return start;
}
function callback(finalStr, str) {
return finalStr + str;
}
let strings = [" Hi ", " Users ", "!", " Welcomes ", " to ", " the ", " tutorialspoint's ", " JavaScript ", " blog! "];
let finalStr = strings.reduce(callback, "")
content.innerHTML += "The array values: " + strings + "<br>";
content.innerHTML += "The final string after merging all array values using the array.reduce() method: " + finalStr + "<br>";
</script>
</body>
</html>
我们学习了如何为array.reduce()方法实现polyfill。我们看到了两种不同的方法来实现用户定义的reduce()方法。用户应该使用第二种方法,因为它更短、更可读、更干净。