逐日一面——仿写reverse要领

弁言

本日小K问了我一个面试题,怎样完成一个实reverse要领,在完成的过程当中我照样犯了一些错,完成完今后,对一些学问点的明白又加深了。

毛病的写法

最最先我是这么写的

var arr = [1,2,3,4,5]
    var reverse1 = function (arr) {
      let newArr = []
      while (arr.length>0){
        newArr.push(arr.pop())
      }
      console.log(arr,newArr) // [],[5,4,3,2,1]
      arr = newArr //让arr即是反转后的新数组
      console.log(arr) // [5,4,3,2,1]
      return arr
    }
    reverse1(arr)

效果有点打脸

console.log(arr) // []

函数参数的通报体式格局

上面的征象显现:我将arr当参数传入reverse1内里,我能够转变arr内里的内容然则我却没法转变arr(arr由[1,2,3,4,5]pop()五次变成[ ],然则随后的赋值操纵却没有胜利)
为何会涌现这个问题,我们得从函数的参数通报体式格局提及

函数的参数都是值通报

怎样明白这句话,根据高程的说法,假如这里是援用通报,那末我在代码第8行已让arr变成了[5,4,3,2,1],那末表面的arr也应当变,然则如今表面arr倒是[ ],所以函数的参数的通报要领都是值通报

假如你以为这么说照样比较笼统,你能够听听鄙人陋见,我们完全能够把js内里数组名当做一个指针变量,贮存的是现实的数组对象的地点。指针意味着我们经由过程它能够接见它指向的对象。变量意味者我能够转变这个变量。

在函数参数内里当我们传入一个arr的时刻,现实通报的是一个形参address1,贮存arr这个对象在内存里的地点,address1=xxxx xxxxx xxxx xxx1。经由过程address1能够对arr举行任何操纵,一旦如今我为address1赋上新的地点值,也就是address1=xxxx xxxxx xxxx xxx2。address1就和arr失去了联络。此时arr照样在xxxx xxxxx xxxx xxx1上,而且至少在当前的reverse1要领中不会再被转变了,由于没有哪一个指针能指向它了。

准确的写法

ok说了这么多,现实想说的是,你在要领中能够经由过程索引,经由过程原生要领操纵一个当参数传进来的数组,然则相对不允许对数组名直接举行赋值
那末这个问题我们就能够尝试运用原生要领来操纵传进来的数组,这里供应一种思绪

var arr = [1,2,3,4,5]
var reverse1 = function () {
      for(var i = 0; i < arr.length; i ++){
        arr.splice(i,0,arr.pop())
      }
    }
reverse1(arr)
console.log(arr) // [5,4,3,2,1]

然则我们能够看到上面的要领照样不是很好,这是由于这个reverse1貌似只能对arr举行操纵,耦合性太强,我们须要解耦,让reverse1对一切的数组都实用,这里实用this和原型方面的学问

//一个圆满的写法:
Array.prototype.reverse1 = function () {
      for(var i = 0; i < this.length; i ++){ //this 解耦
        this.splice(i,0,this.pop())
      }
      return this
    }

总结

本日引见了一下reverse的完成思绪,this解耦,以及函数参数是值通报这么一个观点,
发起在要领中经由过程索引,经由过程原生要领转变一个当参数传进来的数组,然则相对不允许对数组名直接举行赋值
愿望对人人有所协助。

    原文作者:Runningfyy
    原文地址: https://segmentfault.com/a/1190000018916375
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞