slice

选取数组一部分返回新的数组 改变原数组

//slice 选取数组一部分 返回新的数组 不改变原数组
    let fruits1 = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
    console.log(fruits1.slice()); //['Banana', 'Orange', 'Lemon', 'Apple', 'Mango']
    console.log(fruits1.slice(1, 3)); //['Orange', 'Lemon']
    console.log(fruits1.slice(-2, -1)); //['Apple']
    console.log(fruits1.slice(-3)); //['Lemon', 'Apple', 'Mango']

实现

  • 没有参数也就是(arguments.length === 0)返回原数组
  • 变量startend表示要截取的元素的起始位置和终点位置 a表示要返回的新数组
  • 这里的判断都用if因为参数是否存在判断完还会继续判断传入的参数
  • 第一个参数处理负索引 就转换为正数的索引 是截取的起点位置
  • 如果传入了第二个参数 判断第二个参数的正负 进行处理 如果没传入第二个参数 截取终点就是到数组最后

注意这里传入第二个参数的判断是undefined 如果直接用aeguments[1]来判断 0 也返回false 此时的截取终点会变成数组最后第二个参数判断条件

  • 然后循环将截取范围的元素push到新数组
  • 最后返回新数组
    //不包含最后一个索引
    Array.prototype.mySlice = function () {
      //如果没有参数返回原数组
      if (arguments.length === 0) {
        return this
      }
      let a = []
      let start = 0, end = 0
      if (arguments[0] < 0) {
        start = this.length + arguments[0]
      } else {
        start = arguments[0]
      }

      if (arguments[1] !== undefined) {
        if (arguments[1] < 0) {
          end = this.length + arguments[1]
        }
        else {
          end = arguments[1]
        }
      } else {
        end = this.length
      }
      for (let i = start; i < end; i++) {
        a.myPush(this[i])
      }
      return a
    }
  • 以下是测试用例
	console.log(fruits1.mySlice(1, 3)); // ['Orange', 'Lemon']
    console.log(fruits1.mySlice(-2, -1)); //['Apple']
    console.log(fruits1.mySlice(-3));//['Lemon', 'Apple', 'Mango']
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐