资讯专栏INFORMATION COLUMN

slice方法重写及常见应用

vvpvvp / 3148人阅读

摘要:数组的原型上有一个方法叫做给不同的参数组合会返回不同的结果,由于组合非常多,这里研究一下不同组合的结果并基于原型链对该方法进行仿写考虑情况为负数,为负数,超出有效长度了,非有效数字源码如下不想看源码的请直接看最下面的结果处理没有参数的情况处

数组的原型上有一个方法叫做slice,给不同的参数组合会返回不同的结果,由于组合非常多,这里研究一下不同组合的结果并基于原型链对该方法进行仿写
考虑情况:

slice(a,b) slice(a) slice(undefined,b) slice()
a=b,a为负数(0),b为负数(0),b超出有效长度了,a,b非有效数字

源码如下: 不想看源码的请直接看最下面的结果...

Array.prototype.mySlice = function (a, b) {
        var newArr = [];
        //处理没有参数的情况
        if (a === undefined && b === undefined) {
            return this
        }
        //处理只有一个参数,或者是第二个参数大于数组长度的情况
        if (b === undefined || b > this.length) {
            b = this.length
        }
        if (a === undefined) {
            a = 0
        }
        //处理参数不是数字的情况(上面代码已经将undefined参数转化为非undefined参数并且保证参数为两个了)
        if (typeof a !== "number"  || typeof b !== "number" ) {
            console.log("参数必须是数字")
        }
        //处理第一个参数为负数以及第一个参数大与第二个参数以及第二个参数是负数的情况的情况

        if (b < 0) {
            b = this.length + b
        }
        if (a < 0) {
            a = this.length + a
        }
        //先将a,b恢复成正数再比较
        if (a >= b || b === 0) {
            return []
        }
        //正常 slice(a,b)
        for (var i = a; i < b; i++) {
            newArr.push(this[i])
        }
        return newArr
    }

考虑到验证正确性,增加一个验证函数

function check(testArr, n, m) {
        console.log(`[${testArr}].slice(${n},${m})--->[${testArr.slice(n, m)}]`, testArr.slice(n, m).toString() === testArr.mySlice(n, m).toString());
    }
     
    check([1, 2, 3, 4, 5], 1, 3);
    check([1, 2, 3, 4, 5], 1);
    check([1, 2, 3, 4, 5], undefined, 3);
    check([1, 2, 3, 4, 5], 1, 7);
    check([1, 2, 3, 4, 5]);
    check([1, 2, 3, 4, 5], -1, 3);
    check([1, 2, 3, 4, 5], -3, 3);
    check([1, 2, 3, 4, 5], 1, 0);
    check([1, 2, 3, 4, 5], 1, -1);
    check([1, 2, 3, 4, 5], 1, -2);
    check([1, 2, 3, 4, 5], 1, -3);
    check([1, 2, 3, 4, 5], 3, 1);

结果如下:

比较常见的应用:

数组的复制

   arr.slice()

类数组转化为数组(dom类数组不兼容IE6,7,可以用ES6中arr.from()替换)

Array.prototype.slice(类数组)

子数组的获取
3.1 正常的自数组获取

   arr.slice(m,n) (0

3.2 模拟多次pop() shift()

   比如n次pop   arr = arr.slice(undefined,-n)
   比如n次shift   arr = arr.slice(n)

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

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

相关文章

  • 【进阶 6-2 期】深入高阶函数应用之柯里化

    摘要:引言上一节介绍了高阶函数的定义,并结合实例说明了使用高阶函数和不使用高阶函数的情况。我们期望函数输出,但是实际上调用柯里化函数时,所以调用时就已经执行并输出了,而不是理想中的返回闭包函数,所以后续调用将会报错。引言 上一节介绍了高阶函数的定义,并结合实例说明了使用高阶函数和不使用高阶函数的情况。后面几部分将结合实际应用场景介绍高阶函数的应用,本节先来聊聊函数柯里化,通过介绍其定义、比较常见的...

    stackvoid 评论0 收藏0
  • 《JavaScript 闯关记》之基本包装类型

    摘要:对基本包装类型的实例调用会返回,而且所有基本包装类型的对象都会被转换为布尔值。构造函数也会像工厂方法一样,根据传入值的类型返回相应基本包装类型的实例。要注意的是,使用调用基本包装类型的构造函数,与直接调用同名的转型函数是不一样的。 为了便于操作基本类型值,JavaScript 还提供了3个特殊的引用类型:Boolean、Number 和 String。实际上,每当读取一个基本类型值的时...

    xiaolinbang 评论0 收藏0
  • javascript 基本包装类型总结

    摘要:实际上,每当读取一个基本类型值时,后台就会创建一个对应的基本包装类型的对象。参数表示数值的所有数字的位数不包括指数部分。原因与显示创建对象一样类型重写了,都返回对象表示的基本字符串值。转换为针对地区的小写方式。 读《javasrcipt 高级程序设计》笔记。ECMAScript提供了3种特殊的引用类型:Boolean,Number,String。实际上,每当读取一个基本类型值时,后台就...

    explorer_ddf 评论0 收藏0
  • JavaScript:侃侃Array的应用场景

    摘要:目的相信在网上都有很多的的介绍,这里就应用场景举例说明前提了解和一句话概括用别人的方法,完成自己的功能。总结介绍了和的用法正文部分根据需求列举的应用场景注意事项优化方案 目的 相信在网上都有很多的Array的api介绍 , 这里就应用场景举例说明 前提 了解apply和call 一句话概括:用别人的方法,完成自己的功能。 function Student(na...

    tommego 评论0 收藏0
  • Vue.js 实践(2):实现多条件筛选、搜索、排序分页的表格功能

    摘要:基础布局的中主要为部分,分别是用于搜索筛选和分页的表单控件用于排序表格的表头以及用于展示数据的。这也是前瞻发布之后,提出废弃部分功能后许多人反应较为强烈的原因。 与上周的第一篇实践教程一样,在这篇文章中,我将继续从一种常见的功能——表格入手,展示Vue.js中的一些优雅特性。同时也将对filter功能与computed属性进行对比,说明各自的适用场景,也为vue2.0版本中即将删除的部...

    Profeel 评论0 收藏0

发表评论

0条评论

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