Lodash笔记 slice

2019-11-10 admin

loadsh slice方法 类似于数组的slice方法

var baseSlice = require('./_baseSlice'),
    isIterateeCall = require('./_isIterateeCall'),
    toInteger = require('./toInteger');
function slice(array, start, end) {
  var length = array == null ? 0 : array.length;
  if (!length) {
    return [];
  }
  if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
        start = 0;
        end = length;
      }
      else {
        start = start == null ? 0 : toInteger(start);
        end = end === undefined ? length : toInteger(end);
      }
      return baseSlice(array, start, end);
    }

    module.exports = slice;

slice方法做了些start end有效值判断 最终还是调用了baseSlice方法实现 所以重点看下baseSlice方法

baseSlice方法

function baseSlice(array, start, end) {
  //length默认为数组长度
  var index = -1,
      length = array.length;
  //start为负数的情况 start取反比数组长度大 start为0 否则为start+length 就是从后倒数
  if (start < 0) {
    start = -start > length ? 0 : (length + start);
  }
  //end越界情况
  end = end > length ? length : end;
  //end为负数 
  if (end < 0) {
    end += length;
  }
  //length转为正整数 >>>为无符号右移0位 保证是非负整数
  length = start > end ? 0 : ((end - start) >>> 0);
  //start=start>>>0 同样保证start的为非负整数
  start >>>= 0;
  //数组的长度已经确定下来
  var result = Array(length);
  //index从-1开始 自增 小于数组length就按索引赋值 很精简
  while (++index < length) {
    result[index] = array[index + start];
  }
  return result;
}

module.exports = baseSlice;

关于>>>0无符号右移 可以看下这篇文章 [js中表达式 >>> 0 浅析]

试想一下 如果让我们写一个类似于数组的slice方法 会怎么实现?loadsh实现的很精简巧妙 还可以对类数组进行slice 比如arguments NodeList

[转载]原文链接:https://segmentfault.com/a/1190000020957730

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处。

转载请注明:文章转载自 JavaScript中文网 [https://www.javascriptcn.com]

本文地址:https://www.javascriptcn.com/read-78914.html

文章标题:Lodash笔记 slice

相关文章
Nodejs学习笔记之测试驱动
分享第二章,关于测试驱动。这里的测试主要针对Web后端的测试 —— 你为什么要写测试用例(即测试用例的完善是否是浪费时间),如何完善你的测试用例,代码设计如何简化测试用例的书写,以及一些后期的构想。 1. 你为什么要写测试用例 这个习惯通常...
2017-03-22
AngularJS学习笔记之基本指令(init、repeat)
AngularJS学习笔记之基本指令(init、repeat) &lt;h3&gt;ng-init初始化变量&lt;&#x2F;h3&gt; &lt;div ng-init=&quot;name=&#x27;aurora&#x27;;age...
2017-03-24
JavaScript学习笔记之DOM基础 2.4
DOM的发展,与WEB标准化的大趋势相关甚密。只有基于正确的语义逻辑,DOM才能正确地发挥其功用。如今,正确的语义结构、表现与内容分离等要求,都已经成为网页设计中的基本要求。因此,在网页前端开发中,DOM的存在,无疑是为表现层、行为层甚至内...
2017-03-29
AngularJS学习笔记之ng-options指令
1.基本下拉效果(lable for value in array) 其中select标签中的ng-model属性必须有,其值为选中的对象或属性值。 &lt;div ng-controller=&quot;ngselect&quot;&gt...
2017-03-24
AngularJS基础学习笔记之表达式
AngularJS通过表达式将数据绑定到HTML。 AngularJS表达式 AngularJS表达式写在双大括号中:{{ 表达式语句 }}。 AngularJS表达式绑定数据到HTML的方式与ng-bind指令的方式相同。 Angular...
2017-03-23
vue2笔记 — vue-router路由懒加载的实现
在Web应用程序中,系统的瓶颈常在于系统的响应速度。如果系统响应速度过慢,用户就会出现埋怨情绪,系统的价值也因此会大打折扣。因此,提高系统响应速度,是非常重要的。 懒加载(Load On Demand)是一种独特而又强大的数据获取方法,它能...
2017-03-14
Nodejs学习笔记之入门篇
分享第一篇,关于 NodeJS —— Javascript 的常用知识以及如何从 Javascript 开发者过渡到 NodeJS 开发者(不会介绍具体的框架)。在读本文前,希望你对 javascript 有一些初步的认识。 Javascr...
2017-03-22
javaScript中slice函数用法实例分析
本文实例讲述了javaScript中slice函数用法。分享给大家供大家参考。具体分析如下: javaScript 中的 slice 函数,对于array对象的slice函数,返回一个数组的一段。(仍为数组) arrayObj.slice(...
2017-03-24
JavaScript DOM事件(笔记)
第1章 事件流 1-1.事件冒泡:事件最开始由最具体的元素(文档中嵌套层次最深的那个节点)接收; 然后逐级向上传播至最不具体的那个节点(文档); 1-2.事件捕获:不太具体的节点应该更早接收到事件,而最具体的节点最后接收到事件; 第2章 事...
2017-03-22
Bootstrap选项卡学习笔记分享
本文实例为大家分享了Bootstrap选项卡的学习笔记,供大家参考,具体内容如下 tab选项卡 &lt;body&gt; &lt;div class=&quot;container&quot;&gt; &lt;!-- tab选...
2017-03-14
回到顶部