slice()作用类似于substring() ,但有一些不同的行为。 
Syntax: string.slice(start, stop);
Syntax: string.substring(start, stop);他们有什么共同点:
start等于stop :返回一个空字符串stop :将字符提取到字符串的末尾 substring() 区别 : 
start > stop ,那么substring将交换这两个参数。 NaN ,则将其视为0 。  slice() 区别 : 
start > stop , slice()将返回空字符串。 ( "" ) start为负:从字符串的末尾设置 char,就像 Firefox 中的substr()一样。在 Firefox 和 IE 中都观察到此行为。 stop为负:将 stop 设置为: string.length – Math.abs(stop) (原始值),但以ECMA 规范中的范围为 0(因此, Math.max(0, string.length + stop) )为界。 注意:如果您急于和 / 或正在寻找简短答案,请滚动到答案的底部,然后阅读最后两行。 
让我首先说明事实: 
句法: 
 string.slice(start,end) 
 string.substr(start,length) 
 string.substring(start,end) 
注意#1: slice()==substring() 
它能做什么? 
 slice()方法提取字符串的一部分,并将提取的部分返回到新字符串中。 
 substr()方法提取字符串的一部分,从指定位置的字符开始,并返回指定数量的字符。 
 substring()方法提取字符串的一部分,并将提取的部分返回到新字符串中。 
注意#2: slice()==substring() 
更改原始字符串? 
 slice()不
 substr()不会
 substring()不会
注意#3: slice()==substring() 
使用负数作为参数: 
 slice()选择从字符串末尾开始的字符
 substr()选择从字符串末尾开始的字符
 substring()不执行
注意#3: slice()==substr() 
如果第一个参数大于第二个参数: 
 slice()不执行
 substr()因为第二个参数不是位置,而是长度值,它将照常执行,没有问题
 substring()将交换两个参数,并照常执行
第一个论点: 
 slice()必需,指示:起始索引
 substr()必需,指示:起始索引
 substring()必需,指示:起始索引
注意#4: slice()==substr()==substring() 
第二个论点: 
 slice()可选,终止提取的位置(最多但不包括) 
 substr()可选,要提取的字符数
 substring()可选,终止提取的位置(最多但不包括) 
注意#5: slice()==substring() 
如果省略第二个参数怎么办? 
 slice()从字符串的开始位置到结尾选择所有字符
 substr()从字符串的开始位置到结尾选择所有字符
 substring()从substring()的开始位置到结尾选择所有字符
注意#6: slice()==substr()==substring() 
因此,可以说slice()和substr()之间有区别,而substring()基本上是slice()的副本。 
综上所述: 
如果知道要停止的索引(位置)(但不包括在内),请使用slice() 
如果您知道要提取的字符长度,请使用substr() 。 
Ben Nadel 撰写了一篇很好的文章,指出了这些函数的参数差异:
String.slice( begin [, end ] )
String.substring( from [, to ] )
String.substr( start [, length ] )他还指出,如果 slice 的参数为负,则它们将从结尾引用字符串。 Substring 和 substr 不会。
这是他关于此的文章http://www.bennadel.com/blog/2159-using-slice-substring-and-substr-in-javascript.htm