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 ...
随机推荐
- Django的时间字段DateTimeField
一. Django的时间字段DateTimeField 创建django的model时,有DateTimeField.DateField和TimeField三种类型可以用来创建日期字段,其值分别对应着 ...
- 我的第一个 Windows 窗口程序(1)
一般来说,构建一个 Windows 程序可以分为如下几个步骤: 定义窗口类(WNDCLASS) 注册窗口类(RegisterClass) 创建窗口(CreateWindow) 更新显示窗口(Updat ...
- 训练1-P
一个矩形的面积为S,已知该矩形的边长都是整数,求所有满足条件的矩形中,周长的最小值. 例如:S = 24,那么有{1 24} {2 12} {3 8} {4 6}这4种矩形,其中{4 6}的周长最小, ...
- php中文乱码处理方法
昨天在本地环境创建了一个文件,文件编码是UTF-8格式,打印一个简单的语句竟然出现了中文乱码,折腾了很久,才找到了原因. 乱码问题 昨天写了一个很简单的php输出中文页面,但是出现了乱码问题,第一反应 ...
- acgis地图初始化并根据经纬度进行标注
根据项目要求,需要对指定的位置进行标注. 1.初始化地图服务 2.根据地图服务接口信息进行标注 3.根据经纬度信息进行标注 展示接口截图: 以下代码并不能直接粘贴跑起来,因为代码所涉及的文件地址都是内 ...
- [LeetCode] 347. 前K个高频元素
python 版方法1:链表 class Solution(object): def topKFrequent(self, nums, k): """ :type num ...
- Jenkins持续构建打包后端服务流程详解
背景运用场景及思路 1.为响应后端开发人员需求,提升项目开发过程效率,选择Jenkins持续构建,进行导包启动一键持续集成 思路: 使用jenkins自带,立即构建->SVN拉取代码,通过Jen ...
- 原生js,一些小应用(逢10进一,生成V字,多个div抖动)
第一题:每隔10个div换一行.并且鼠标移入 改变opacity. <!DOCTYPE html> <html lang="en"> <head> ...
- github发布博客
创建github项目: 名字为:{{你的帐号}}.github.io clone项目,创建并提交推送一个index页面 如: <!DOCTYPE html> <html> & ...
- 修改struts2自定义标签的源代码,在原有基础上增加功能(用于OA项目权限判断,是否显示某个权限)
OA项目在做权限判断时 原始方式: 现在完成的功能 :通过改变struts2自定标签源代码 在原有的基础上 增加判断权限的功能 而页面上使用标签的方式 还是下图 步骤: 打开文件 搜索< ...