在程序语言中,字符串可以说是最常用的一种类型,而在程序中对字符串的操作也是十分频繁。当程序语言自带多种字符串操作的方法时,用该语言编程程序时就有很多的便利性,提高开发的效率。但是当方法过多,甚至目的相似、参数雷同的时候,就容易造成迷惑难以选择的窘境。

在JavaScript中就有这样的情况出现,对于取字符串的子串的操作,JavaScript提供了三种不同的方法:slicesubstrsubstring。虽然在网上随便搜索一下,就可以找到介绍三者区别的文章,但是每次使用的时候,依然会迷糊无从选择。因此结合网上介绍的区别,在本文中将它们的异同之处罗列在表中,方便参照和区分。

测试字符串: "0123456789"
浏览器:Chrome Version 29.0.1547.76
操作系统:Mac OS X Version 10.8.5

 

 

  参数 方法
参数1 参数2 slice(begin[, end]) substr(start[, length]) substring(from[, to])
参数/结果 7   789 789 789
说明 只有参数1,省略参数2 参数1指定的坐标截取到字符串结尾
参数/结果 -3   789 789 0123456789
说明 参数1为负数 从字符串末尾开始计算位置* 视为0
参数/结果 21        
说明 参数1大于或等于字符串长度 视为字符串长度,即返回空字符串
参数/结果 “3.21″   3456789 3456789 3456789
说明 参数1为浮点数或只含数字的字符串 类似parseInt()将数值转换成整形
参数/结果 NaN   0123456789 0123456789 0123456789
说明 参数1非为有效数值 非有效数值视为视为0
参数/结果 3 7 3456 3456789 3456
说明 既有参数1,又有参数2 参数1的位置截取到参数2的位置 参数1的位置截取长度参数2的字符 同slice()
参数/结果 7 3   789 3456
说明 参数1大于参数2 返回空字符串 参数1的位置截取长度参数2的字符 交换参数1参数2再进行截取
参数/结果 3 -3 3456   012
说明 参数2为负数 负数从字符末尾开始计算位置 视为长度0,返回空字符串 交换参数,负数视为0
参数/结果 3 21 3456789 3456789 3456789
说明 参数2大于或等于字符串长度 视为字符串长度,结果同省略参数2
参数/结果 3 NaN     012
说明 参数2非为有效数值 非有效数值视为0,返回空字符串 非有效数值视为0,因长度为0返回空字符串 非有效数值视为0,交换参数进行截取
参数/结果 -7 -3 3456    
说明 参数1参数2都为负数 从字符串末尾开始计算位置 长度为负数,返回空字符串 负数视为0,返回空字符串
参数/结果 -7 7 3456 3456789 0123456
说明 参数1为正数,参数2为负数 (自动套用上边的规则,不解释)

*从字符串末尾开始计算位置:-1 指字符串中最后一个字符,-2 指倒数第二个字符,以此类推;也可视为字符串长度与负数之和的位置,若结果小于0,则视为0。

从上述表格对比中不难看出,三个方法之间的主要区别如下:

  • 三个方法的参数1都代表子串开始位置,参数2在slice和substring中表示结束位置,而在substr中代表的则是子串长度;
  • 对于负数态度,当出现在参数1的位置时,slice和substr从末尾开始计算,而substring不支持末尾计数法直接视为0;当出现在参数2位置时,slice和substring的处理同参数1:前者从末尾开始计算,后者转换成0,而substr则视负数长度为0返回空串;
  • 对于参数1小于参数2的情况,substring最大的不同在于它会交换两个参数再截取子串,substr因第二参数表示的是长度因此并无异常,slice曽依然正常搜寻子串始末位置,若开始位置在结尾后边则返回空串。

根据MDN对substr的描述,在IE下可能并不支持负数从末尾计算的方式。

最后,自己来试试三个方法的效果吧:

字符串 参数1 参数2 运行 slice substr substring
iderzheng iderzheng.com iderzheng
//

References:

  1. String – JavaScript | MDN
  2. What is the difference between String.slice and String.substring in JavaScript? – Stack Overflow
  3. Slice vs Substr vs Substring vs [ ] Methods · jsPerf

 

JavaScript取子串方法slice,substr,substring对比表的更多相关文章

  1. JavaScript中,提取子字符串方法:Slice、Substring、Substr的比较。

    在JavaScript中,提取子字符串主要是通过 Slice.Substring.Substr 三个方法之一. // slice // 语法: string.slice(beginSlice [, e ...

  2. slice splice(数组) 和 slice substr substring split (字符串)的区别

    array.slice(start,end)slice()如果不传入参数二,那么将从参数一的索引位置开始截取,一直到数组尾如果两个参数中的任何一个是负数,array.length会和它们相加 stri ...

  3. JS-字符串截取方法slice、substring、substr的区别

    一.使用 slice() 截取 1,函数说明 slice() 方法可通过指定的开始和结束位置,提取字符串的某个部分,并以新的字符串返回被提取的部分.语法如下: stringObject.slice(s ...

  4. [javascript string] slice();substr();substring();之间的区别

    今天遇到这个问题,发现ぜんぜんわすねまます3个方法,直接上代码吧,[网络版本较多就不注明参考过哪些了 -0- ] var test = 'hello world'; //均一位参数测试 console ...

  5. JavaScript截取字符串的Slice、Substring、Substr函数简单比较还有indexof函数应用

    //截取字符,一看就明白!!! var str = "0123456789"; alert(str.substring(5)); 弹出 //56789 alert(str.subs ...

  6. js截取字符串方法整理slice(), substr(), substring(), split()

      substr(start,length) stringObject.substr(start,length) //start,截取起始下标,-1 指字符串最后一个字符,-2 指倒数第二个字符开始 ...

  7. javascript中String 对象slice 和substring 区别

      1.slice(start,stop)和substring(start,stop)  方法都是用于提取字符串中从start开始到stop-1间的字符(因为字符串索引是从0开始).其中 start必 ...

  8. slice,substr,substring

    var s = '0123456789';   //slice 遇负数,则此负数值等同于 s.length + (负数) s.slice(3,6); //"345", 从位置3开始 ...

  9. slice,substr,substring的区别

    <!DOCTYPE html> <!-- To change this license header, choose License Headers in Project Prope ...

随机推荐

  1. NSDate获取当前时区的时间

    [NSDate date]获取的是GMT时间,要想获得某个时区的时间,以下代码可以解决这个问题 NSDate *date = [NSDate date]; NSTimeZone *zone = [NS ...

  2. laravel框架总结(三) -- 路径分析

    1.直接写绝对路径,这样会用在/goods/show前面加上域名 <a href="/goods/show?id=<?php echo $item['id']; ?>&qu ...

  3. python学习之while语句

    while循环 1.简单的while循环while True: ")#这是一个简单的while循环,当等于True时会一直打印1 2.while执行多少次后退出 coun=0while Tr ...

  4. UVA10561 Treblecross 组合游戏/SG定理

    Treblecross is a two player gamewhere the goal is to get three X in a row on a one-dimensional board ...

  5. hihoCoder太阁最新面经算法竞赛18

    比赛链接:http://hihocoder.com/contest/hihointerview27/problems A.Big Plus 模拟水 #include <bits/stdc++.h ...

  6. ConsensusClusterPlus根据基因表达量对样品进行分类

    #http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2881355/ 一致聚类方法,采用重抽样方法来验证聚类合理性. library(ALL)data(ALL)d ...

  7. zabbix脚本报警

    zabbix问端设置: 1,设置报警类型 2.设置用户及媒体类型 send_to 就是zabbix输出的$1,脚本中药发给谁 3.设置触发器和动作 触发器 test.temp_conn (自己写一个简 ...

  8. aws在线技术峰会笔记-主会场

    容器服务:Elastic container service IoT可以采用无服务器架构.

  9. SQL LOADER 的用法 TXT文件导入非常之快

    前提,需要本地安装ORACLE 客户端 控制文件 cms.ctl load dataCHARACTERSET UTF8infile 'oracle.txt'APPEND INTO TABLE JR f ...

  10. c++虚函数的作用是什么?

    <深入浅出MFC>中形容虚函数是执行一般化操作,一直没有领悟要点.现在的体悟是抽象,先前考虑问题都是由抽象到具象,比如下文中的示例,由上(虚基类的「怪物」)至下(派生类的三个子类「狼」「蜘 ...