原生js之字符串截取[通俗易懂]

原生js之字符串截取[通俗易懂]字符串截取的方法有三种:slice(start,end+1),substring(start,end+1),substr(start,n).slice(start,end+1):两个参数时,参数指截取位置,截取含头不含尾;一个参数时,默认截取到字符串结尾。参数可以为负数,负数就倒着数位置。substring(start,end+1):两个参数时,参数指截取位置,截取含头不含…

大家好,又见面了,我是你们的朋友全栈君。

字符串截取的方法有三种:

slice(start, end+1), substring(start, end+1), substr(start, n).
slice(start, end+1): 两个参数时,参数指截取位置,截取含头不含尾;一个参数时,默认截取到字符串结尾。参数可以为负数,负数就倒着数位置。
substring(start, end+1): 两个参数时,参数指截取位置,截取含头不含尾;一个参数时,默认及渠道字符串结尾。参数不可以为负数。
substr(start, n): 两个参数时,第一个参数指截取起始位置,第二个参数指截取字符个数;一个参数时,默认截取到字符串结尾。第一个参数可为负数,第二个不可为负数。
example:
var str = “今天是星期二”;
console.log(str.slice(3, 6)); // 截取“星期二”并打印
console.log(str.slice(3, -1)); // 截取“星期”并打印
console.log(str.slice(3,-3)); // 未截取任何信息,因为正着数第三位是“星”,倒着数第三位也是“星”,截取取头不取尾,头和尾重了,所以没有截取到任何信息。
console.log(str.slice(-2, -3)); // 同理因为倒数第二位是“期”,倒数第三位是“星”,不能反着截取,所以没有截取到任何信息。
console.log(str.substring(3,6)); // 截取“星期二”并打印
console.log(str.substr(3, 3)); // 截取“星期二”并打印
console.log(str.substr(-1, 3)); //截取“二”并打印。因为倒着数第一位是“二”,虽然此时要截取的长度是3,但是因为只有一位,所以只能截取一位。

但是如果不知道要截取的字符在字符串中的位置,可以使用indexOf()方法搜索到字符在字符串的起始位置,如果省略第二个参数,默认起始位置为下标0。
var str = “今天是星期二”;
var i = str.indexOf(“星”);
console.log(str.substring(i, i+4)); // 截取“星期二”并打印

原生js的字符串截取

可是原生js中并不是一般直接用slice、substring、substr就可以了,先看一下原生js实现字符串长度截取的代码:

function cutstr(str, len) { 
   
     var temp;  // 定义新的字符来存放每次截取的字符
     var icount = 0; // 定义变量来记录已经截取的字符串的长度
     var patrn = /[^\x00-\xff]/; // 正则判断字符是否匹配非单字节的字符(例如汉字、汉字符号,单字节字符包含英文字母、数字、英文符号等。)
     var strre = " ";
     for(var i = 0; i < str.length; i++) { 
   
        if(icount < len) { 
    //看了很多博客写的这里是icount < len - 1, 但是觉得是不对的,应该是icount < len, 如不正确,请指正!
            temp = str.substr(i, 1);
            if(patrn.exec(temp) == null) { 
   
                icount += 1; //如果是单字节字符,则长度+1;
            } else { 
   
                icount += 2; //如果是双字节字符,则长度+2;
            }
            strre += temp;
        } else { 
   
            break;
        }
     }
     return strre;   
}

可以看到代码中通过正则匹配来判断字符是否匹配非单字节的字符,这是因为并不是所有的字符串都只包含单字节字符,也会包含汉字等双字节字符。
如果没有正则匹配,
cutstr("我ABC汉DEF", 6); //输出的是“我ABC+汉的半个”
加上正则匹配后,
cutstr("我ABC汉DEF", 6); //输出的是“我ABC”

参考
前端学习笔记之九——原生JavaScript实现字符串截取
分享原生JavaScript技巧大收集(1~10)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141833.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Hex dump_dump数据

    Hex dump_dump数据HexdumpFromWikipedia,thefreeencyclopediaAhexdumpofthe318byteWikipediafaviconIncomputing,ahexdumpisahexadecimalview(onscreenorpaper)ofcomputerdata…

    2022年9月21日
    2
  • 安全帽识别 安全帽佩戴效果 安全帽检测 yolov4安全帽识别 yolov3

    安全帽识别 安全帽佩戴效果 安全帽检测 yolov4安全帽识别 yolov3施工场景下的行为识别领域。该应用领域在技术上可拆分为两部分:视频跟踪和行为识别。这一周密集调研了文献,发现着实是一个大坑。其中的视频跟踪最近的各頂会论文出现最多的是单目标跟踪,而我们要解决的确是多目标跟踪,最近出的较好的能实用性的是deepSort;真实的施工场景中摄像头的远近,拍摄的遮挡,工人服装的统一,重叠,违规动作幅度的大小等都是巨大的挑战;行为识别方面最近出的论文较多,能实用性的目前敲定ECO模型;在跟踪过程中某一个工人的时空管道数据的抽取也是一个难题等等。无论如何,这块硬骨头得啃下来。行为识别模

    2022年5月19日
    30
  • SQl中的左连接,右连接,内连接,全连接,自连接的理解。

    SQl中的左连接,右连接,内连接,全连接,自连接的理解。

    2021年7月29日
    54
  • goland 激活码2021.3月最新在线激活[通俗易懂]

    goland 激活码20213月最新在线激活,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    69
  • faster-rcnn 之 RPN网络的结构解析

    faster-rcnn 之 RPN网络的结构解析【说明】:我想很多人在看faster-rcnn的时候,都会被RPN的网络结构和连接方式纠结,作者在文中说的不是很清晰,这里给出解析;【首先】:大家应该要了解卷积神经网络的连接方式,卷积核的维度,反向传播时是如何灵活的插入一层,这些要了解;这里我推荐一份资料,真是写的非常清晰,就是MatConvet的用户手册,这个框架底层借用的是caffe的算法,所以数据结构,

    2022年6月23日
    21
  • mybatis 原理[通俗易懂]

    mybatis 原理[通俗易懂]问题:mybatis是基于mapper接口开发的,mapper接口是执行SQL语句的呢?mybatis对mapper代码的包装主要包含了4个类。1.首先mapper需要将接口进行注册,并且需要获得mapper代理工厂(mapperregistry)mapperregistry类将mapper接口进行注册,并获取mapper代理工厂的工具类(mapperproxyfactory)2.加载mapp…

    2025年6月23日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号