递归和循环是编程中重复执行时常见的一对兄弟,因是兄弟,所以也常让人混淆。

我是mipwan。这篇文章为大家分享一下递归和循环这对兄弟。

7c02e61ccc44521d90da6b2d22c984d9.png

递归

递归,又称为递回,在前端中,通常指在函数的定义中调用自身的方法。在前端编程中经常遇到。

例如下面的这个looseEqual函数,这个函数 是vue2 源码中判断两个对象或者数组是否粗略的认为相等。

/**   * Check if two values are loosely equal - that is,   * if they are plain objects, do they have the same shape?   */  function looseEqual (a, b) {    if (a === b) { return true }    var isObjectA = isObject(a);    var isObjectB = isObject(b);    if (isObjectA && isObjectB) {      try {        var isArrayA = Array.isArray(a);        var isArrayB = Array.isArray(b);        if (isArrayA && isArrayB) {          return a.length === b.length && a.every(function (e, i) {            return looseEqual(e, b[i])          })        } else if (a instanceof Date && b instanceof Date) {          return a.getTime() === b.getTime()        } else if (!isArrayA && !isArrayB) {          var keysA = Object.keys(a);          var keysB = Object.keys(b);          return keysA.length === keysB.length && keysA.every(function (key) {            return looseEqual(a[key], b[key])          })        } else {          /* istanbul ignore next */          return false        }      } catch (e) {        /* istanbul ignore next */        return false      }    } else if (!isObjectA && !isObjectB) {      return String(a) === String(b)    } else {      return false    }  }

递归的应用场景还是很多的,例如:寻找对象里的ID值,多个数求和等。总结起来大多数都具有以下特征:

  • 重复做一件事

  • 一个主体

  • 一般按照由外到内的顺序

  • 本次执行依赖上次结果

循环

循环是指重复的执行某个或特定的、有规律的一些操作。

例如 vue2 源码中 将类数组对象转化为真正的数组;将数组对象转换为对象,都用的是循环。

/**   * Convert an Array-like object to a real Array.   */  function toArray (list, start) {    start = start || 0;    var i = list.length - start;    var ret = new Array(i);    while (i--) {      ret[i] = list[i + start];    }    return ret  }
/**   * Mix properties into target object.   */  function extend (to, _from) {    for (var key in _from) {      to[key] = _from[key];    }    return to  }  /**   * Merge an Array of Objects into a single Object.   */  function toObject (arr) {    var res = {};    for (var i = 0; i < arr.length; i++) {      if (arr[i]) {        extend(res, arr[i]);      }    }    return res  }

循环是前端编程中最常见的一种方法,应用场景数不胜数。总结有以下几个特点:

  • 需要重复执行某个操作

  • 操作的是一个主体

  • 按照一定的顺序:倒序或者顺序

  • 本次结果不依赖上次

以上就是循环和递归的区别了。祝愿大家都能有所得。

Logo

前往低代码交流专区

更多推荐