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

What is the difference between String.slice and String.substring?

提问人:tmim 提问时间:2/11/2010 最后编辑:Arsen Khachaturyantmim 更新时间:4/25/2022 访问量:414142

问:

有谁知道这两种方法有什么区别?

String.prototype.slice
String.prototype.substring
JavaScript 字符串 切片

评论

304赞 bobince 2/11/2010
这是 JavaScript 糟糕设计的一个例子,我们最终得到了三个方法,它们都做同样的事情,但有不同的怪癖。IMO是具有最少意外行为的机构。slice
2赞 mplungjan 7/6/2011
IMO 子字符串用于从 idx 到结束获取子字符串时,一目了然更容易理解。特别是对菜鸟
3赞 Derek 朕會功夫 7/9/2012
根据这个网站,实际上可以更换,没有理由使用它。slicesubstring
9赞 Ian 7/18/2013
@AmolMKulkarni 根本不是真的。如果尝试 ,则将其视为 。没有抛出任何异常。如果你使用 ,它会代替(就像以前一样),并交换参数,使其像 .我什至在 IE 8 上尝试了这些,并得到了无一例外的结果var a = "asdf".substring(-1);var a = "asdf".substring(0);var a = "asdf".substring(2, -1);0-1var a = "asdf".substring(0, 2);
60赞 quemeful 3/14/2015
“我什至在 IE 8 上尝试过这些”——我喜欢编程。

答:

1164赞 Daniel Vassallo 2/11/2010 #1

slice()就像几种不同的行为一样。substring()

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

他们的共同点:

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

substring()的区别

  1. 如果 ,则将交换这两个参数。start > stopsubstring
  2. 如果任何一个参数是否定的,或者是,则将其视为 。NaN0

slice()的区别

  1. 如果 ,将返回空字符串。(start > stopslice()"")
  2. If is negative:从字符串末尾设置 char,与 Firefox 中完全相同。在 Firefox 和 IE 中都观察到此行为。startsubstr()
  3. 如果为负数:将停止设置为:(原始值),但以 0 为界(因此,)除外,如 ECMA 规范中所述。stopstring.length – Math.abs(stop)Math.max(0, string.length + stop)

来源: 初级编程与开发艺术: Javascript: substr() vs.s. substring()

评论

9赞 Andy 2/14/2012
在你关于的最后一条注释中,它应该是slice()string.length - stop
20赞 Oriol 9/2/2012
在你关于的最后一点中,我认为它应该是 OR,为了明确它是负面的,slice()(string.length – 1) + stop(string.length – 1) – Math.abs(stop)
14赞 flying sheep 1/14/2013
@Longpoke:的添加,以便有一个与 一致的字符串方法。 一直在那里,所以他们没有打破它并添加了另一种方法。几乎不是一个糟糕的决定,因为 1.一致性很好,2.它允许 CoffeeScript 的切片语法处理数组和字符串。@Oriol:编辑了它。String.sliceArray.slicesubstring
6赞 Rick 7/18/2013
Firefox 22 中的子字符串和切片之间似乎存在性能差异。jsperf.com/string-slice-vs-substring
4赞 user1537366 12/9/2014
安迪是对的。 将设置为 if 为负数。请记住,这是提取的最后一个字符之后的索引!stopstring.length + stopstopstop
17赞 Gerard ONeill 6/4/2014 #2

一个答案很好,但需要稍微阅读一下。特别是新术语“停止”。

My Go -- 按差异组织,除了上面 Daniel 的第一个答案之外,它也很有用:

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

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

2)交换索引。子字符串将对索引进行重新排序,使第一个索引小于或等于第二个索引。

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

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

一般评论 -- 我觉得很奇怪,第二个索引是切片或子字符串的最后一个字符之后的位置。我希望“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。

42赞 Jón Viðar Þorsteinsson 12/6/2014 #3

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

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

他还指出,如果要切片的参数为负数,则它们从末尾引用字符串。substring 和 substr 没有。

这是他关于这个的文章

评论

11赞 Neil Fraser 5/25/2017
这是不正确的,substr 确实处理负参数。'0123456789'.substr(-3, 2) -> '78'
1赞 hafiz ali 5/8/2021
关于 mdn 的 substr “已弃用。不适用于新网站。
180赞 Waddah 8/10/2015 #4

TL的;博士:

  • 如果您知道将停止(但不包括)的索引(位置),请使用 。slice()
  • 如果您知道要提取的字符的长度,则可以使用 ,但不建议这样做,因为它已被弃用。substr()

否则,请继续阅读以获得完整比较

语法

  • string.slice(start,end)
  • string.substr(start,length)
  • string.substring(start,end)

注意#1slice()==substring()

它有什么作用?

  • slice()提取字符串的各个部分,并在新字符串中返回提取的部分。
  • substr()提取字符串的各个部分,从指定位置的字符开始,并返回指定数量的字符。
  • substring()提取字符串的各个部分,并在新字符串中返回提取的部分。

注意#2slice()==substring()

更改原始字符串?

  • slice()
  • substr()
  • substring()

注意#3slice()==substr()==substring()

使用负数作为参数

  • slice()选择从字符串末尾开始的字符
  • substr()选择从字符串末尾开始的字符
  • substring()不执行

注意#4slice()==substr()

如果第一个参数大于第二个参数

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

第一个论点

  • slice()必填;起始索引
  • substr()必填;起始索引
  • substring()必填;起始索引

注意#5slice()==substr()==substring()

第二个论点

  • slice()自选;结束提取的位置(最多,但不包括)
  • substr()自选;要提取的字符数
  • substring()自选;结束提取的位置(最多,但不包括)

注意#6slice()==substring()

如果省略第二个参数怎么办?

  • slice()选择从字符串的起始位置到结尾的所有字符
  • substr()选择从字符串的起始位置到结尾的所有字符
  • substring()选择从字符串的起始位置到结尾的所有字符

注意#7slice()==substr()==substring()

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

如果你想要 的功能:substr

"foobarbaz".substr(index, length);

在不使用已弃用功能的情况下,您可以执行以下操作:

"foobarbaz".substring(index, length + index);

并获得与所有边缘情况完全相同的结果,例如负索引/长度。

评论

49赞 Killy 7/11/2019
substr() 不应该用 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
1赞 CodeFinity 8/11/2020
@Killy 关于它是遗留功能的来源 您的链接中未提及。
6赞 Max 12/9/2020
你用“substring() 基本上是 slice() 的副本”来总结你的冗长答案,但问题恰恰是关于这两者之间的区别。你的答案的其余部分错过了主题,除了唯一相关的部分信息“切片将交换论点”隐藏在中间的某个地方。
1赞 Killy 2/10/2021
@CodeFinity当我写这篇文章时,有一条评论,但有人在 2020 年 7 月删除了它 web.archive.org/web/20200704195437/https://...
0赞 user3342816 3/6/2021
@Killy:它仍然在兼容性表和侧边栏中。横幅中存在不一致之处。不知道为什么有人把它从一个中删除,而不是从其他人中删除,反之亦然。这种不一致有点令人遗憾。横幅出现在所有其他设备上。简而言之,它是ECMA标准附录B的一部分,因此不是核心市场。它给出了一个用法说明:262.ecma-international.org/9.0/... - MDN 注释:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...substr
15赞 Alexandr 2/5/2016 #5

和 - 之间的区别在于它们如何处理国外的否定和忽视线参数:substringslice

子字符串(开始、结束)

否定参数被解释为零。过大的值被截断为字符串的长度:

alert("testme".substring(-2)); // "testme", -2 becomes 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.

这比奇怪的逻辑要方便得多.substring

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

如果选择这三种方法之一,在大多数情况下使用 - 它将是:否定论点,它保持和操作最明显。slice

3赞 Sohail Arif 5/24/2016 #6

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

两者都采用两个参数,例如 start/from 和 end/to。

您不能将负值作为子字符串方法的第一个参数传递,而是将 slice 方法从末尾遍历它。

切片方法参数详细信息:

参数

start_index切片应从何处开始编制索引。如果 value 为负数,则表示从最后开始。例如,-1 表示最后一个字符。end_index切片末尾的索引。如果未提供,则切片将从字符串的start_index到末尾。如果为负值,指数将从字符串末尾开始测量。

子字符串方法参数详细信息:

参数

它应该是一个非负整数,用于指定子字符串应从何处开始的索引。一个可选的非负整数,用于提供应在子字符串之前完成的索引。

0赞 tingxuanz 3/29/2017 #7

对于 ,如果为负数,则设置为:slice(start, stop)stopstop

string.length – Math.abs(stop)

而不是:

string.length – 1 – Math.abs(stop)
3赞 subham ruj 3/24/2019 #8

substr:它为我们提供了基于指定索引获取部分字符串的功能。 substr- 的语法 string.substr(开始,结束) start - 开始索引告诉获取的开始位置。 end - 结束索引告诉字符串获取的位置。这是可选的。

slice:它提供根据指定索引获取字符串的一部分。它允许我们指定正数和索引。 slice 的语法 - string.slice(start,end) start - 开始索引告诉获取的开始位置。它 end - 结束索引告诉字符串获取的位置。这是可选的。 在“拼接”中,开始和结束指数都有助于获取正指数和负指数。

字符串中“slice”的示例代码

var str="Javascript";
console.log(str.slice(-5,-1));

output: crip

字符串中“substring”的示例代码

var str="Javascript";
console.log(str.substring(1,5));

output: avas

[*注意:负索引从字符串的末尾开始。

评论

0赞 Max 12/9/2020
你写的是错误的,与问题无关。substr() 是一个不同的函数,它没有参数“start, stop”,正如您在答案中错误地指出的那样:它有参数“start, length”。但问题根本不在于substr()!幸运的是,9年前就已经给出了正确而完整的答案......