资讯专栏INFORMATION COLUMN

每日一面——仿写reverse方法

未东兴 / 2733人阅读

摘要:引言今天小问了我一个面试题,怎么实现一个实方法,在实现的过程中我还是犯了一些错,实现完以后,对一些知识点的理解又加深了。此时还是在上,并且至少在当前的方法中不会再被改变了,因为没有哪个指针能指向它了。

引言

今天小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解耦,以及函数参数是值传递这么一个概念,
建议在方法中通过索引,通过原生方法改变一个当参数传进来的数组,但是绝对不允许对数组名直接进行赋值
希望对大家有所帮助。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/103666.html

相关文章

  • 每日一面——深入理解reduce方法

    摘要:引言有一段时间没更新了,最近挺忙的懒病犯了。例数组累加例计算总价苹果桃子西瓜自己实现一个方法知道了的两种模式利用递归实现它并不复杂参数有个。数据从这些方法组成的管道中流淌一遍出来就得到想要的结果了。 showImg(https://segmentfault.com/img/bVbuHVn?w=598&h=419); 引言 有一段时间没更新了,最近挺忙的(懒病犯了)。今天偶然想到之前去去...

    Paul_King 评论0 收藏0
  • 每日一道算法题 - 反转字符串(easy-3)

    摘要:规则使用语言,让函数获取传递的参数,并以相反的顺序返回字符串。测试用例思路方法通过把字符串转换成数组,并使用数组的反转数组,然后使用重新拼接成字符串方法向后循环字符串或字符数组以生成新字符串 虽然都是很简单的算法,每个都只需5分钟左右,但写起来总会遇到不同的小问题,希望大家能跟我一起每天进步一点点。更多的小算法练习,可以查看我的文章。 规则 Using the JavaScript l...

    xfee 评论0 收藏0
  • LeetCode每日一题: 旋转数组(No.189)

    摘要:题目旋转数组给定一个数组,将数组中的元素向右移动个位置,其中是非负数。例如将到反转将到反转全部翻转得到最后结果。这里要注意下还有这样的情况即大于数组长度的情况。次旋转次旋转转回来了次旋转次旋转转回来了次旋转所以这里的有效等于对数组长度求余。 题目: 旋转数组 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 示例: 输入: [1,2,3,4,5,6,7] 和 k...

    FreeZinG 评论0 收藏0
  • 前端每日实战:149# 视频演示如何用纯 CSS 创作一个宝路薄荷糖的动画

    摘要:可交互视频此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。源代码下载每日前端实战系列的全部源代码请从下载代码解读定义,只有个元素居中显示定义容器尺寸用伪元素画出个像宝路薄荷糖状的黑色圆环接下来制作动画效果。 showImg(https://segmentfault.com/img/bVbhIKv?w=400&h=300); 效果预览 按下右侧的点击预览按钮可以在当前页面预览,...

    SolomonXie 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<