跟着月影学JavaScript(2) | 青训营笔记

93 阅读1分钟

跟着月影学JavaScript(2) | 青训营笔记

这是我参与「第四届青训营 」笔记创作活动的的第5天

写代码最应该关注什么?

  • 风格?
  • 效率?
  • 约定?
  • 使用场景?
  • 设计?

总结来说,对于一些代码来说,要根据使用场景,进行性能优化,相比较代码可读性更为重要

例如之前的Leftpad事件

  • 版本一

    • NPM 模块粒度
    • 在代码风格
    • 在代码质量/效率 时间复杂度o(n)
  function leftpad(str, len, ch) {
      str = String(str);
      var i = -1;
      if (!ch && ch !== 0) ch = ' ';
      len = len - str.length;
      while (++i < len) {
          str = ch + str;
      }
      return str;
  } 
  • 版本二

    • 代码更简洁
    • 效率提升 时间复杂度o(m)n
  function leftpad(str, len, ch) {
      str = "" + str;
      const padLen = len - str.length;
      if(padLen <= 0) {
        return str;
      }
      return (""+ch).repeat(padLen)+str;
  } 
  • 版本三

    • 性能更好 时间复杂度 o(log n)
 /*! https://mths.be/repeat v1.0.0 by @mathias */
​
  'use strict';
​
  var RequireObjectCoercible = require('es-abstract/2019/RequireObjectCoercible');
  var ToString = require('es-abstract/2019/ToString');
  var ToInteger = require('es-abstract/2019/ToInteger');
​
  module.exports = function repeat(count) {
    var O = RequireObjectCoercible(this);
    var string = ToString(O);
    var n = ToInteger(count);
    // Account for out-of-bounds indices
    if (n < 0 || n == Infinity) {
      throw RangeError('String.prototype.repeat argument must be greater than or equal to 0 and not be Infinity');
    }
​
    var result = '';
    while (n) {
      if (n % 2 == 1) {
        result += string;
      }
      if (n > 1) {
        string += string;
      }
      n >>= 1;
    }
    return result;
  };
  • 版本四

    • 性能更好
 /**
   * String.prototype.repeat() polyfill
   https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat#Polyfill
  */
  if (!String.prototype.repeat) {
    String.prototype.repeat = function(count) {
      'use strict';
      if (this == null)
        throw new TypeError('can't convert ' + this + ' to object');
​
      var str = '' + this;
      // To convert string to integer.
      count = +count;
      // Check NaN
      if (count != count)
        count = 0;
​
      if (count < 0)
        throw new RangeError('repeat count must be non-negative');
​
      if (count == Infinity)
        throw new RangeError('repeat count must be less than infinity');
​
      count = Math.floor(count);
      if (str.length == 0 || count == 0)
        return '';
​
      // Ensuring count is a 31-bit integer allows us to heavily optimize the
      // main part. But anyway, most current (August 2014) browsers can't handle
      // strings 1 << 28 chars or longer, so:
      if (str.length * count >= 1 << 28)
        throw new RangeError('repeat count must not overflow maximum string size');
​
      var maxCount = str.length * count;
      count = Math.floor(Math.log(count) / Math.log(2));
      while (count) {
        str += str;
        count--;
      }
      str += str.substring(0, maxCount - str.length);
      return str;
    }
  }

优化代码的几种方式

  • 数据抽象

    • 抽象使代码分离成接口和实现。所以在设计组件的时候,必须保持接口独立于实现,因此,你才能做到在改变底层实现时,界面将保持不变。

      在这种情况下,无论任何程序使用这些接口,它们不会受到影响,只需要重新编译最新的实现。

  • 过程抽象

    • 忽略任务具体完成的过程,只精确描述该任务所要完成的功能
  • 异步+函数式

总结

要想深入计算机领域,要培养工程师意识

要打好数学基础,要培养好算法意识,

要根据不同的场景,选对方法才能更好的解决问题

\