mengsixing / blog

💡 个人博客,喜欢请点 star!
https://mengsixing.github.io
136 stars 68 forks source link

面试时候手写reduce的话 是否需要考虑第二个参数的默认值 以及参数的函数类型和this等 #11

Closed FontEndArt closed 5 years ago

FontEndArt commented 5 years ago

如题:面试时候手写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的话,面试官想要得到的是哪些点呢?

mengsixing commented 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;
    }
  });
FontEndArt commented 5 years ago

见笑了 我还小 yd15的 97年 是你小老弟才对

自我感觉简化是有必要的,毕竟没有那么长的时间来手写(除非手写过N遍了) 只是有时候会摸不清面试官想要的点,就是怕面试官不认同自己简化的版本