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

tmi*_*mim 766 javascript substring substr slice

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

String.prototype.slice
String.prototype.substring
Run Code Online (Sandbox Code Playgroud)

Dan*_*llo 796

slice()substring()一些不同的行为一样工作.

Syntax: string.slice(start, stop);
Syntax: string.substring(start, stop);
Run Code Online (Sandbox Code Playgroud)

他们有什么共同点:

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

区别 :substring()

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

区别 :slice()

  1. 如果start > stop,slice()将返回空字符串.("")
  2. 如果start是否定的:从字符串的末尾设置char,就像substr()在Firefox中一样.在Firefox和IE中都观察到此行为.
  3. 如果stop是否定的:将stop设置为:( string.length – Math.abs(stop)原始值),除非限制在0(因此,Math.max(0, string.length + stop)),如ECMA规范中所述.

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

  • 在你关于`slice()`的最后一个注释中,我认为它应该是`(string.length - 1)+ stop`或者,为了清楚它是否定的,`(string.length - 1) - Math.abs(停止)` (15认同)
  • @Longpoke:添加了`String.slice`,以便有一个与'Array.slice`一致的字符串方法.`substring`永远存在,所以他们没有破坏它并添加了另一种方法.几乎没有一个糟糕的决定1.一致性很好2.它允许CoffeeScript的切片语法处理数组和字符串.@Oriol:编辑它. (9认同)
  • 在你关于`slice()`的最后一个注释中,它应该是`string.length - stop` (8认同)
  • Firefox 22中的子串和切片之间似乎存在性能差异.http://jsperf.com/string-slice-vs-substring (6认同)
  • 安迪是对的.如果`stop`为负数,`stop`将被设置为`string.length + stop`.记住`stop`是最后一个字符提取后的索引! (3认同)
  • 截至2014年5月,它们在Chrome中的速度非常快. (2认同)

小智 87

注意:如果你赶时间,和​​/或寻找简短的答案滚动到答案的底部,并阅读最后两行.如果不赶时间,请阅读整篇文章.


首先让我陈述一下事实:

语法:
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()所有字符选择从字符串的起始位置到结尾的所有字符
注意#6:slice()==substr()==substring()

所以,你可以说slice()和之间存在差异substr(),而substring()基本上是副本slice().

在摘要中:
如果您知道要停止的索引(位置)(但不包括),请slice()
在知道要提取的字符长度时使用substr().

  • 您通过“substring() 基本上是 slice() 的副本”来总结您的冗长答案,但问题恰恰是关于这两者之间的区别。除了隐藏在中间某处的“唯一”相关信息“切片将交换参数”之外,您的其余答案错过了主题。 (7认同)
  • substr()不应使用https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/substr (4认同)

小智 22

Ben Nadel撰写了一篇关于此的好文章,他指出了这些函数的参数差异:

String.slice( begin [, end ] )
String.substring( from [, to ] )
String.substr( start [, length ] )
Run Code Online (Sandbox Code Playgroud)

他还指出,如果要切片的参数为负数,它们会从末尾引用该字符串.子串和子串不.

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

  • 这是不正确的,substr确实处理负参数.`'0123456789'.substr(-3,2) - >'78' (3认同)

Ger*_*ill 11

答案很好,但需要一点阅读.特别是新术语"停止".

我的去 - 由差异组织,除了上面的丹尼尔的第一个答案之外,它还有用:

1)负面指数.子串需要正索引,并将负索引设置为0.切片的负索引表示从字符串末尾开始的位置.

"1234".substring(-2, -1) == "1234".substring(0,0) == ""
"1234".slice(-2, -1) == "1234".slice(2, 3) == "3"
Run Code Online (Sandbox Code Playgroud)

2)交换索引.子字符串将重新排序索引以使第一个索引小于或等于第二个索引.

"1234".substring(3,2) == "1234".substring(2,3) == "3"
"1234".slice(3,2) == ""
Run Code Online (Sandbox Code Playgroud)

--------------------------

一般注释 - 我发现第二个索引是切片或子字符串的最后一个字符之后的位置,我觉得很奇怪.我希望"1234".slice(2,2)返回"3".这使得安迪的混淆在上面是合理的 - 我希望"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.
Run Code Online (Sandbox Code Playgroud)

我的2c.


Ale*_*ndr 10

子串和切片之间的区别 - 它们如何与负面和俯视线的国外参数一起工作:

substring(开始,结束)

否定参数被解释为零.太大的值被截断为字符串的长度:alert("testme".substring(-2)); //"testme",-2变为0

此外,如果start> end,则参数互换,即在开始和结束之间返回绘图线:

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"
Run Code Online (Sandbox Code Playgroud)

切片

负值是从行尾测量的:

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.
Run Code Online (Sandbox Code Playgroud)

它比奇怪的逻辑子串更方便.

除IE8-之外的所有浏览器中支持的第一个参数的负值.

如果选择这三种方法中的一种,在大多数情况下使用 - 它将是切片:否定参数,它维护和操作最明显.