我们在工作中可能会很少进行这样的思考,对于一些常用的原生api它是如何实现的呢,如果让我们去用js实现一个与原生api功能相同的函数我们该如何设计算法去实现呢?

  为了巩固自己的编程技术和提高自己的编程技巧,也为了让自己对js这门语言有更深刻的理解,我将会把平时开发常用到的各种原生api用自己的方式去实现,如果有错误的地方或者代码运行效率有更好的实现方案欢迎大神指正和批评

  本次将要实现的第一个方法是Javascript的String基本类型和String对象的常用方法 slice

  slice的定义和用法 (红色文字部分摘自菜鸟教程,slice方法)

slice(start, end) 方法可提取字符串的某个部分,并以新的字符串返回被提取的部分。

使用 start(包含) 和 end(不包含) 参数来指定字符串提取的部分。

字符串中第一个字符位置为 0, 第二个字符位置为 1, 以此类推。

提示: 如果是负数,则该参数规定的是从字符串的尾部开始算起的位置。也就是说,-1 指字符串的最后一个字符,-2 指倒数第二个字符,以此类推。

start:必须. 要抽取的片断的起始下标。第一个字符位置为 0

end:可选。 紧接着要截取的片段结尾的下标。若未指定此参数,则要提取的子串包括 start 到原字符串结尾的字符串。

  如果该参数是负数,那么它规定的是从字符串的尾部开始算起的位置。

  slice()方法在第一个参数为负数时不管第二个参数为正数还是负数都会返回"";第二个参数为负数时会将负的参数加上字符串的长度。

 var sliceYMWM=function(s,start,end){
// 首先我们的方法得满足大前提,s必须为String类型或者是String对象的实例
if(typeof(s) == 'string' || s instanceof String){
var slen=s.length;
var aglen=arguments.length;
var res="";
// 我们先处理只用两个参数 s 和 start 的情况
if(aglen==2){
if(start>slen){ //此时起始索引大于串长返回空串
return res;
}else if(start>0&&start<slen){
for(let i = start; i<slen; i++){
res+=s[i];
}
return res;
}else{
for(let q = slen+start; q<slen; q++){
res+=s[q];
}
return res;
}
}else if(aglen==3){//当三个参数都有的情况
if(start<0){//第一个参数 start 为负数时,都会返回 ""
return res;
}else{
if(end<0){ //当第三个参数 end 为负数时,需要加串长转换成正序的索引
if(start<end+slen){
for(let j= start; j<end+slen;j++){
res+=s[j];
}
return res;
}else{ //此时起始索引大于等于结束索引返回空串
return res;
}
}else{
if(start<end){ //当结束索引大于串长时,须改良循环结构的退出条件,否则当结束索引远大于串长时会做无用的性能消耗
if(end<slen){
for(let k=start; k<end;k++){
res+=s[k];
}
return res;
}else{
for(let k=start; k<slen;k++){
res+=s[k];
}
return res;
}
}else{ //此时起始索引大于等于结束索引返回空串
return res;
}
}
}
}else{
throw "参数个数不满足要求!";
}
}else{
throw "传入的s并非是字符串类型或者是字符串对象!"; }
}
var s1=new String('倚梦为码!');
var s1_=sliceYMWM(s1,0); //运行结果为 String {"倚梦为码!"}
var s2='倚梦为码!';
64 var s2_=sliceYMWM(s2,0); //运行结果为 "倚梦为码!"
65  var s3_=sliceYMWM(s2,-2); // 运行结果为 "码!"
66   var s4_=sliceYMWM(s2,1,-1) //运行结果为 "梦为码"
 
总结:在用js进行实现slice方法时尤其要注意临界值的判断条件,不能少判断也不能做多余的判断防止算法出现与原生slice方法有结果不一致的情况,而且在进行循环条件时应尽量做到不对全局变量的属性查找之类的操作,因为这种操作的时间复杂度为 O(n) 。

我们可以在第一次对全局变量进行属性访问时将其地址存到一个局部变量中,这样的话只会在第一次进行操作时会对全局变量做属性搜素,往后只需对局部变量进行访问,这时算法复杂度只有 O(1),正所谓的即用即取。有兴趣的小伙伴可以自己做做类似的练习。本文为作者  倚梦为码  原创,欢迎大家观看和转载,若有其他用途请注明出处!谢谢合作!

js原生api之String的slice方法的更多相关文章

  1. ES7前端异步玩法:async/await理解 js原生API妙用(一)

    ES7前端异步玩法:async/await理解   在最新的ES7(ES2017)中提出的前端异步特性:async.await. 什么是async.await? async顾名思义是“异步”的意思,a ...

  2. 使用Node.js原生API写一个web服务器

    Node.js是JavaScript基础上发展起来的语言,所以前端开发者应该天生就会一点.一般我们会用它来做CLI工具或者Web服务器,做Web服务器也有很多成熟的框架,比如Express和Koa.但 ...

  3. js中的splice方法和slice方法简单总结

    slice:是截取用的 splice:是做删除 插入 替换用的 slice(start,end): 参数: start:开始位置的索引 end:结束位置的索引(但不包含该索引位置的元素) 例如: va ...

  4. js原生API妙用(一)

    复制数组 我们都知道数组是引用类型数据.这里使用slice复制一个数组,原数组不受影响. let list1 = [1, 2, 3, 4]; let newList = list1.slice(); ...

  5. SpringMVC(八):使用Servlet原生API作为Spring MVC hanlder方法的参数

    在SpringMVC开发中,是有场景需要在Handler方法中直接使用ServletAPI. 在Spring MVC Handler的方法中都支持哪些Servlet API作为参数呢? --Respo ...

  6. js在IE8+兼容String没有trim方法,写一个兼容ie8一下的浏览器的trim()方法

    方法一: String.prototype.trim = function(){ return Trim(this);}; function LTrim(str) {    var i;     fo ...

  7. JS支持正则表达式的 String 对象的方法

    注意:本文中所有方法的 RegExp 类型的参数,其实都支持传入 String 类型的参数,JS会直接进行字符串匹配. (相当于用一个简单的非全局正则表达式进行匹配,但字符串并没有转换成 RegExp ...

  8. js原生设计模式——4安全的工厂方法模式之Factory方法模式

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  9. JS 的 Array 和String 常混淆方法

    知识一: 1.slice() 提取字符串 slice[ start, end) 如果参数为负数,表示从尾部开始算起. 2.subString() 提取字符串 3.subStr() 提取字符串 subS ...

随机推荐

  1. JavaScript学习笔记(第一天)

    javascript个人笔记 JavaScript的组成 JavaScript是一种运行在客户端的脚本语言 ​ ECMAScript 标准----js的基本的语法 DOM------Document ...

  2. Codeforces 787B Not Afraid( 水 )

    链接:传送门 题意:判断 m 组数,如果某一组中出现负数就判断这一组中是否存在与之相反的数,如果每一组中都满足要求则输出 "NO" 反之输出 "YES" 思路: ...

  3. [luogu2052 NOI2011] 道路修建 (树形dp)

    传送门 Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1 ...

  4. OpenStack 发行版本

    2010年7月,Rackspace和美国宇航局联合其他25家公司启动了OpenStack项目 OpenStack的发行版本时间表和核心项目 OpenStack发行版本 名称 日期           ...

  5. java8新特性:利用Lambda处理List集合

    Java 8新增的Lambda表达式,我们可以用简洁高效的代码来处理List. 1.遍历 public static void main(String[] args) { List<User&g ...

  6. POJ 2157 How many ways??

    How many ways?? Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Origina ...

  7. WinSCP介绍、安装、使用

    前言 如果说XManager通过Xshell.Xftp可以很方便的进行远程管理,那么PuTTY显然不能满足我们的需求,所以这也是今天要介绍的另外一个工具-WinSCP. 简介 WinSCP是一个Win ...

  8. JAVAEE之--------过滤器设置是否缓存(Filter)

    在网页中.每次的client訪问server.有部分不用反复请求.如有些图片,视频等就没有必要每次都请求,这样会让server增大工作量.为了防止这样.我们採用过滤器来设置client是都缓存. 參考 ...

  9. Codeforces Round #257(Div. 2) B. Jzzhu and Sequences(矩阵高速幂)

    题目链接:http://codeforces.com/problemset/problem/450/B B. Jzzhu and Sequences time limit per test 1 sec ...

  10. 《大话操作系统——做坚实的project实践派》(2)

      <大话操作系统--做坚实的project实践派>(2)