js原生api之String的slice方法
我们在工作中可能会很少进行这样的思考,对于一些常用的原生api它是如何实现的呢,如果让我们去用js实现一个与原生api功能相同的函数我们该如何设计算法去实现呢?
为了巩固自己的编程技术和提高自己的编程技巧,也为了让自己对js这门语言有更深刻的理解,我将会把平时开发常用到的各种原生api用自己的方式去实现,如果有错误的地方或者代码运行效率有更好的实现方案欢迎大神指正和批评
本次将要实现的第一个方法是Javascript的String基本类型和String对象的常用方法 slice
slice的定义和用法 (红色文字部分摘自菜鸟教程,slice方法)
使用 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) //运行结果为 "梦为码"
我们可以在第一次对全局变量进行属性访问时将其地址存到一个局部变量中,这样的话只会在第一次进行操作时会对全局变量做属性搜素,往后只需对局部变量进行访问,这时算法复杂度只有 O(1),正所谓的即用即取。有兴趣的小伙伴可以自己做做类似的练习。本文为作者 倚梦为码 原创,欢迎大家观看和转载,若有其他用途请注明出处!谢谢合作!
js原生api之String的slice方法的更多相关文章
- ES7前端异步玩法:async/await理解 js原生API妙用(一)
ES7前端异步玩法:async/await理解 在最新的ES7(ES2017)中提出的前端异步特性:async.await. 什么是async.await? async顾名思义是“异步”的意思,a ...
- 使用Node.js原生API写一个web服务器
Node.js是JavaScript基础上发展起来的语言,所以前端开发者应该天生就会一点.一般我们会用它来做CLI工具或者Web服务器,做Web服务器也有很多成熟的框架,比如Express和Koa.但 ...
- js中的splice方法和slice方法简单总结
slice:是截取用的 splice:是做删除 插入 替换用的 slice(start,end): 参数: start:开始位置的索引 end:结束位置的索引(但不包含该索引位置的元素) 例如: va ...
- js原生API妙用(一)
复制数组 我们都知道数组是引用类型数据.这里使用slice复制一个数组,原数组不受影响. let list1 = [1, 2, 3, 4]; let newList = list1.slice(); ...
- SpringMVC(八):使用Servlet原生API作为Spring MVC hanlder方法的参数
在SpringMVC开发中,是有场景需要在Handler方法中直接使用ServletAPI. 在Spring MVC Handler的方法中都支持哪些Servlet API作为参数呢? --Respo ...
- js在IE8+兼容String没有trim方法,写一个兼容ie8一下的浏览器的trim()方法
方法一: String.prototype.trim = function(){ return Trim(this);}; function LTrim(str) { var i; fo ...
- JS支持正则表达式的 String 对象的方法
注意:本文中所有方法的 RegExp 类型的参数,其实都支持传入 String 类型的参数,JS会直接进行字符串匹配. (相当于用一个简单的非全局正则表达式进行匹配,但字符串并没有转换成 RegExp ...
- js原生设计模式——4安全的工厂方法模式之Factory方法模式
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- JS 的 Array 和String 常混淆方法
知识一: 1.slice() 提取字符串 slice[ start, end) 如果参数为负数,表示从尾部开始算起. 2.subString() 提取字符串 3.subStr() 提取字符串 subS ...
随机推荐
- 【原创】Vue.js 中 axios 跨域访问错误
1.假如访问的接口地址为 http://www.test.com/apis/index.php (php api 接口) 2.而开发地址为http://127.0.0.1:8080,当axios发起 ...
- 在 vue-test-utils 中 mock 全局对象
vue-test-utils 提供了一种 mock 掉 Vue.prototype 的简单方式,不但对测试用例适用,也可以为所有测试设置默认的 mock. mocks 加载选项 mocks 加载选项 ...
- 2018年九个很受欢迎的vue前端UI框架
最近在逛各大网站,论坛,SegmentFault等编程问答社区,发现Vue.js异常火爆,重复性的提问和内容也很多,小编自己也趁着这个大前端的热潮,着手学习了一段时间的Vue.js,目前用它正在做自己 ...
- 《使用CSLA 2019:CSLA .NET概述》原版和机译文档下载
自己从作者官方网站上(http://www.cslanet.com/)下载的免费版.PDF文档,又使用有道付款翻译的,供大家下载学习,文档中是对CSLA.NET4.9版本的介绍. 下载链接:http: ...
- win7下virtualbox遇到的问题
问题1:无法创建unbuntu 64bit 虚拟机 安装完virtualbox后,新建虚拟机.类型选择为Linux时,版本下拉选项只有ubuntu 32bit,无ubuntu 64 ...
- poi判断一行是隐藏的getZeroHeight()
poi判断一行是隐藏的 getZeroHeight() boolean isZeroHeight = row.getZeroHeight(); if(isZeroHeight){ // 如果为隐藏行就 ...
- 请用Java设计一个Least Recently Used (LRU) 缓存
LRU介绍:LRU是Least Recently Used的缩写,即最少使用页面置换算法,是为虚拟页式存储管理服务的, 思路介绍: 能够使用两个标准的数据结构来实现.Map和Queue.由于须要支持多 ...
- Android调用第三方App
private List<Map<String, Object>> list = null; private PackageManager mPackageManager; p ...
- android:QQ多种側滑菜单的实现
在这篇文章中写了 自己定义HorizontalScrollView实现qq側滑菜单 然而这个菜单效果仅仅是普通的側拉效果 我们还能够实现抽屉式側滑菜单 就像这样 第一种效果 另外一种效果 第三种效果 ...
- UVA - 10043 Chainsaw Massacre
Description Problem E: Chainsaw Massacre Background As every year the Canadian Lumberjack Society ...