当前位置: 首页 > news >正文

字符串截取函数slice, substring, substr

  在日常项目需求中,常常会遇到需要截取字符串操作的工作,而ECMAScript为我们提供了原生的截取字符串的函数,而且提供了三个:slice, substring, substr。我们怎么判断在什么时候使用哪个字符串截取函数呢?

  其实,只要搞清楚这三者的区别,就比较容易能够判断什么情况下,使用哪个字符串截取的函数了。

  三者都是接受两个可选参数。

 

  最简单的情况下,没有传入任何参数,则这三者没有任何区别,类似于=操作符,直接复制了一个字符串出来。

  如果之传入一个参数,则直接取从参数开始到字符串结尾的字符串。遇到非正整数的参数,与两个参数的处理情况相同。

  str.slice(start, end)

  slice的参数start和end可接受任意非NaN数值的参数,取start到end之间的字符,不包含end。如果参数为负,则会自动加上str.length进行纠正,如果依然为负值,则修正为0。如果end值小于start则返回空字符串。

console.log("abcdefghij".slice(3,1))            //      ''
console.log("abcdefghij".slice(-3,-1))          //     'hi'
console.log("abcdefghij".slice(1, 3))           //     'bc'
console.log("abcdefghij".slice(-20, -8))        //     'ab'

 记住一个原则:如果end小于start,则返回空字符串。如果值为负数,加str.length纠正,依然为负,则调整为0。 

 

  str.substring(start, end)

  也是接受任意数值的参数,如果参数为0或者NaN的话,会自动修正为0;如果end小于start的话,两者位置颠倒。取start到end之间的字符,不包含end。  

console.log("abcdefghij".substring(3,1))            //     'bc'
console.log("abcdefghij".substring(-3,-1))          //     ''
console.log("abcdefghij".substring(1, 3))           //     'bc'
console.log("abcdefghij".substring(-20, -8))     //   '' 

  也有一个原则:就是两个参数当中较小的会自动调整当做start参数,任何非正整数,都会当做0处理。

 

  str.substr(start, length)

  从形参名称应该可以看出一点不同。substr第一个参数也是起始位置,但是第二个参数不是结束位置,而是需要截取多少个字符串。

  start如果为负数,则与slice传入负数参数一样处理,让其自身加str.length进行纠正,如果还小于0,则当做0处理。  

  length如果为0或者负数,则直接返回一个空字符串。  

console.log("abcdefghij".substr(-13))            //  'abcdefghij'
console.log("abcdefghij".substr(-13, 1))         //  'a'
console.log("abcdefghij".substr(0, -1))          //  ''
console.log("abcdefghij".substr(-1, 3))          //  'j'

  如此来看,就能够比较清楚的分辨出来三者之间的用法和区别了。

 

  

  

转载于:https://www.cnblogs.com/zhuhuoxingguang/p/6269958.html

相关文章:

  • ARM+LINUX移植攻略(十二)U-boot-2009.08利用tftp服务下载内核和利用nfs服务挂载nfs文件系统...
  • 快速排序(转)
  • Windows Phone 7 不温不火学习之《Expression Blend 创建渐变效果和创建Storyboard动画》...
  • DelphiXE8FMX工程实现无边框托动(发送消息)
  • Vue 响应式总结
  • Iphone开发中的两个小bug,1.调用camera时的内存警告导致view自动upload,2,Not enough frames in stack....
  • 自己动手做计算机-计算机科学的本质
  • angularjs 中使用 service 在controller 之间 share 对象和数据
  • 流媒体技术学习笔记之(八)海康、大华IpCamera RTSP地址和格式
  • Linux也需要GALGAME:wine跑GALGAME测试
  • 用CSS3创建旋转载入器
  • SpringMvc @InitBinder 表单多对象精准绑定接收
  • 与cache相关的一些问题和思考
  • Hibernate-延迟加载和立即加载
  • Learning Notes: Morvan - Reinforcement Learning, Part 4: Deep Q Network
  • 【前端学习】-粗谈选择器
  • 10个确保微服务与容器安全的最佳实践
  • CSS魔法堂:Absolute Positioning就这个样
  • Java IO学习笔记一
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • JS+CSS实现数字滚动
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • 回顾2016
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 手写双向链表LinkedList的几个常用功能
  • 用 Swift 编写面向协议的视图
  • 原生 js 实现移动端 Touch 滑动反弹
  • PostgreSQL之连接数修改
  • #include到底该写在哪
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (南京观海微电子)——COF介绍
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (原創) 物件導向與老子思想 (OO)
  • (转) ns2/nam与nam实现相关的文件
  • (转)ORM
  • (转)用.Net的File控件上传文件的解决方案
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET gRPC 和RESTful简单对比
  • .NET建议使用的大小写命名原则
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • /etc/fstab 只读无法修改的解决办法
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @Builder用法
  • @Documented注解的作用
  • [ Linux ] Linux信号概述 信号的产生
  • [23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution
  • [Apio2012]dispatching 左偏树
  • [BZOJ]4817: [Sdoi2017]树点涂色
  • [C# 基础知识系列]专题十六:Linq介绍
  • [C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计
  • [C++]命名空间等——喵喵要吃C嘎嘎