String.slice和String.substring有什么区别?

有谁知道这两种方法之间有什么区别:

String.slice String.substring 

slice()substring()一样工作,具有一些不同的行为。

 Syntax: string.slice(start, stop); Syntax: string.substring(start, stop); 

他们有什么共同点:

  1. 如果start等于stop :返回一个空string
  2. 如果省略stop :将字符提取到string的末尾
  3. 如果任一个参数大于string的长度,则会使用该string的长度。

substring() 区别

  1. 如果start > stop ,那么substring将交换这两个参数。
  2. 如果任一个参数是负数或者是NaN ,那么它被视为0

slice() 区别

  1. 如果start > stopslice()将不交换2个参数。
  2. 如果start是负数:从string的末尾设置char,就像在Firefox中的substr()一样。 在Firefox和IE中都可以看到这种行为。
  3. 如果stop为负:将停止设置为: string.length – Math.abs(stop) (原始值)。

来源: 编程和开发的基本艺术:Javascript:substr()vs substring()

注意:如果你急着,和/或寻找简短的答案滚动到答案的底部,并阅读最后两行。如果不急于阅读整个事情。

让我先说事实:

句法:
string.slice(start,end)
string.substr(start,length)
string.substring(start,end)
注#1: slice()==substring()

它能做什么?
slice()方法提取一个string的一部分,并以一个新的string返回提取的部分。
substr()方法从指定位置的字符开始提取string的一部分,并返回指定数量的字符。
substring()方法提取一个string的部分,并返回提取的部分在一个新的string。
注#2: slice()==substring()

更改原始string?
slice()
substr()
substring()
注#3: slice()==substring()

用负数作为参数:
slice()select从string结尾开始的字符
substr()从string的末尾开始select字符
substring()不执行
注#3: slice()==substr()==substr()

如果第一个论据大于第二个论据:
slice()不执行
substr()由于第二个参数不是一个位置,而是长度值,它将像往常一样执行,没有问题
substring()将交换两个参数,并照常执行

第一个论点:
slice()必需,表示:启动索引
substr()必需,表示:起始索引
substring()必需,表示:起始索引
注#4: slice()==substr()==substring()

第二个论据:
slice()可选,位置(直到但不包括)结束提取的位置
substr()可选,要提取的字符数
substring()可选,位置(最多但不包括)结束提取的位置
注#5: slice()==substring()

如果第二个论据被忽略呢?
slice()select从开始位置到结束string的所有字符
substr()select从开始位置到结束string的所有字符
substring()select从开始位置到结束string的所有字符
注#6: slice()==substr()==substring()

所以,可以说slice()substr()之间有区别,而substring()基本上是slice()的副本。

综上所述:
如果你知道你将停止(但不包括)的索引(位置),使用slice()
如果知道要提取的字符的长度,则使用substr()

Ben Nadel写了一篇很好的文章,他指出了这些函数在参数上的差异:

 String.slice( begin [, end ] ) String.substring( from [, to ] ) String.substr( start [, length ] ) 

他还指出,如果要切片的参数是负数,则从末尾引用string。 子串和substr不是。

这里是他的这篇文章http://www.bennadel.com/blog/2159-using-slice-substring-and-substr-in-javascript.htm

一个答案是好的,但需要一点点阅读。 特别是用新的术语“停止”。

我的围棋 – 除了上面丹尼尔的第一个答案之外,由差异组织起来,

1)负面指标。 子串需要正的索引,并将负索引设置为0.切片的索引意味着从string末尾开始的位置。

 "1234".substring(-2, -1) == "1234".substring(0,0) == "" "1234".slice(-2, -1) == "1234".slice(2, 3) == "3" 

2)交换索引。 子串将对索引重新sorting以使第一个索引小于或等于第二个索引。

 "1234".substring(3,2) == "1234".substring(2,3) == "3" "1234".slice(3,2) == "" 

————————–

一般评论 – 我觉得奇怪的是,第二个索引是在切片或子string的最后一个字符之后的位置。 我期望“1234”.slice(2,2)返回“3”。 这使得Andy的困惑超出了理由 – 我期望“1234”.slice(2,-1)返回“34”。 是的,这意味着我是新来的Javascript。 这也意味着这种行为:

 "1234".slice(-2, -2) == "", "1234".slice(-2, -1) == "3", "1234".slice(-2, -0) == "" <-- you have to use length or omit the argument to get the 4. "1234".slice(3, -2) == "", "1234".slice(3, -1) == "", "1234".slice(3, -0) == "" <-- same issue, but seems weirder. 

我的2c。

子串和切片之间的区别 – 他们是如何与消极和忽略国外线路的工作参数:

子串(开始,结束)

否定论据被解释为零。 太大的值被截断为string的长度:alert(“testme”.substring(-2)); //“testme”,-2变成0

而且,如果开始>结束,则参数互换,即在开始和结束之间绘制曲线返回:

 alert ( "testme" .substring (4, -1)); // "test" // -1 Becomes 0 -> got substring (4, 0) // 4> 0, so that the arguments are swapped -> substring (0, 4) = "test" 

负值是从行末测量的:

 alert ( "testme" .slice (-2)); // "me", from the end position 2 alert ( "testme" .slice (1, -1)); // "estm", from the first position to the one at the end. 

这比奇怪的逻辑子string要方便得多。

除IE8以外,所有浏览器都支持substr的第一个参数的负值。

如果select这三种方法中的一种,在大多数情况下使用 – 这将是切片 :负面的论点,它保持和操作最明显。

slice和substring方法之间唯一的区别是参数

两个都有两个参数,例如开始/结束/结束。

你不能传递一个负值作为substring方法的第一个参数,而是slice方法从最后遍历它。

切片方法参数详细信息:

REF: http : //www.thesstech.com/javascript/string_slice_method

参数

start_index从哪里开始的索引。 如果价值提供否定意味着从上次开始。 例如最后一个字符为-1。 end_index切片结束后的索引。 如果没有提供slice将从start_index到string的结尾。 在负值的情况下,索引将从string的末尾开始计算。

子串方法参数详细信息:

REF: http : //www.thesstech.com/javascript/string_substring_method

参数

它应该是一个非负整数来指定子string应该从哪里开始的索引。 一个可选的非负整数,以提供索引之前应该完成子string。

差异

String.prototype.slice

处理负面指数

  • 如果[ 任何一个参数都是 ]为负值,则将其视为strLength + [ index ],其中strLength是string的长度(例如,如果[ index ]是-3则将其视为strLength - 3 )。

开始索引大于结束索引

  • 如果[ 起始索引 ]大于或等于 [ string片段 ]的[ 处理结束索引 ],则slice()返回一个空string。

    – MDN

String.prototype.substring

处理负面指数

  • 如果任一论点是[ 否定的 ] [ ],那么它被视为0

开始索引大于结束索引

  • 如果[ 起始索引 ]大于[ 结束索引 ],那么
    substring()效果就好像两个参数被交换一样; 例如, str.substring(1, 0) == str.substring(0, 1)

    – MDN

相似

其他一切都是一样的,我想,包括:

  • 如果一个结束索引参数是undefined ,它将变成string的长度。
  • 不是数字且不能转换为数字的参数变为0

* substr()方法也是如此,除了substr()没有结尾索引参数( 参见String.prototype.substr下的注释 )。

笔记

String.prototype.substring

  • 其中string.substring(startIndex, endIndex)

    • 参数交换限制 – 如果endIndex作为parameter passing时不是数字,则substring()方法在内部变为0 (对slice()也是这样)。 然而,它不会与startIndex交换它的价值 一个人认为它可能是合理的,但我离题了 。 因此,如果endIndex = NaN ,那么string.substring(startIndex, endIndex) === ""是真的(就像slice()一样),不pipe提供的起始索引如何。

    • 关于参数交换的想法 – 如果endIndex undefined则变为string.length ; 如果startIndex大于string的长度,你可能会推断它用endIndex交换了它的值,但是由于这样会产生一个空string(因为这两个值都超出了string的索引),所以,这样做。 相反,它可能只是一个内部检查来查看startIndex > string.length是否为true,如果是则返回空string。

String.prototype.substr
[ 稍微超出了问题的范围 ]

  • String.prototype.substr非常像slice ,特别是关于索引值的负数的处理。 然而,关键的区别是substr()的第二个参数没有指定结束索引,而是调用者想要返回的字符长度。 只要说substr()行为就像slice的作用超出了这个关键的区别一样。

对于切片(开始,停止),如果停止为负,停止将被设置为:string.length – Math.abs(stop),而(string.length – 1) – Math.abs(stop)。