Closed FontEndArt closed 5 years ago
@FontEndArt ,你好,这个考察的是基础,对 reduce api 的理解,在手写代码阶段,也在考察手写代码质量,代码边界处理等问题。
老哥说的很对,我这个解法是还有一些问题,标准答案可以参考mdn 上的 ployfill。
Object.defineProperty(Array.prototype, 'reduce', {
value: function(callback /*, initialValue*/) {
if (this === null) {
throw new TypeError( 'Array.prototype.reduce ' +
'called on null or undefined' );
}
if (typeof callback !== 'function') {
throw new TypeError( callback +
' is not a function');
}
// 1. Let O be ? ToObject(this value).
var o = Object(this);
// 2. Let len be ? ToLength(? Get(O, "length")).
var len = o.length >>> 0;
// Steps 3, 4, 5, 6, 7
var k = 0;
var value;
if (arguments.length >= 2) {
value = arguments[1];
} else {
while (k < len && !(k in o)) {
k++;
}
// 3. If len is 0 and initialValue is not present,
// throw a TypeError exception.
if (k >= len) {
throw new TypeError( 'Reduce of empty array ' +
'with no initial value' );
}
value = o[k++];
}
// 8. Repeat, while k < len
while (k < len) {
// a. Let Pk be ! ToString(k).
// b. Let kPresent be ? HasProperty(O, Pk).
// c. If kPresent is true, then
// i. Let kValue be ? Get(O, Pk).
// ii. Let accumulator be ? Call(
// callbackfn, undefined,
// « accumulator, kValue, k, O »).
if (k in o) {
value = callback(value, o[k], k, o);
}
// d. Increase k by 1.
k++;
}
// 9. Return accumulator.
return value;
}
});
见笑了 我还小 yd15的 97年 是你小老弟才对
自我感觉简化是有必要的,毕竟没有那么长的时间来手写(除非手写过N遍了) 只是有时候会摸不清面试官想要的点,就是怕面试官不认同自己简化的版本
如题:面试时候手写reduce的话 是否需要考虑第二个参数的默认值 以及参数的函数类型和this等 不按规范去写是否可以通过面试
https://github.com/yhlben/blog/blob/master/docs/interview/2019-9.md
const array1 = [1, 2, 3, 4]; const reducer = (accumulator, currentValue) => accumulator + currentValue; console.log(array1.reduce(reducer)); // NaN
这样的话initialValue是必传选项。是否与基本规范不符。 如果initialValue改为从arguments中取的话,当不传initialValue时候,需要判断当前的this。
然后就是想问一下,这个手写reduce的话,面试官想要得到的是哪些点呢?