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

IT技术 javascript substring slice substr
2021-01-17 00:20:22

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

String.prototype.slice
String.prototype.substring
6个回答

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

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

他们的共同点:

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

的区别 substring()

  1. 如果start > stopsubstring则将交换这两个参数。
  2. 如果任一参数为负或为NaN,则将其视为0

的区别 slice()

  1. 如果start > stop,slice()将返回空字符串。( "")
  2. 如果start为负:从字符串的末尾设置字符,就像substr()在 Firefox 中一样。在 Firefox 和 IE 中都可以观察到这种行为。
  3. 如果stop为负:将停止设置为:(string.length – Math.abs(stop)原始值),除非ECMA 规范中Math.max(0, string.length + stop)涵盖的以 0界(因此,

资料来源:编程与开发的基本艺术:Javascript:substr() 与 substring()

@Longpoke:String.slice已添加,以便有一个与Array.slice. substring一直在那里,所以他们没有打破它并添加了另一种方法。几乎不是一个糟糕的决定,因为 1. 一致性很好 2. 它允许 CoffeeScript 的切片语法在数组和字符串上工作。@Oriol:编辑它。
2021-03-18 00:20:22
Firefox 22 中的子字符串和切片之间似乎存在性能差异。jsperf.com/string- slice- vs-substring
2021-03-19 00:20:22
在你关于 的最后一个注释中slice(),我认为应该是,(string.length – 1) + stop或者,明确地说它是负面的,(string.length – 1) – Math.abs(stop)
2021-04-03 00:20:22
在你关于 的最后一个注释中slice(),它应该是string.length - stop
2021-04-07 00:20:22
安迪是对的。stop将设置为string.length + stopifstop为负数。记住stop是提取到最后一个字符后的索引!
2021-04-09 00:20:22

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()==substring()

使用负数作为参数

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

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

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

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

第一个论点

  • slice() 必需,表示:起始索引
  • substr() 必需,表示:起始索引
  • substring() 必需,表示:起始索引

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

第二个论点

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

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

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

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

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

因此,您可以说slice()之间存在差异substr(),而substring()基本上是 的副本slice()

@CodeFinity 当我写这篇文章时有一条评论,但有人在 2020 年 7 月删除了它web.archive.org/web/20200704195437/https://...
2021-03-15 00:20:22
@Killy Source 关于它是一个遗留功能在您的链接中未提及。
2021-03-21 00:20:22
@Killy:它仍然在兼容性表和侧边栏中。横幅中存在不一致。不知道为什么有人从一个中删除它而不是其他人,反之亦然。不一致有点不幸。横幅出现在所有其他人身上。简而言之,它substr是 ECMA 标准附录 B 的一部分,因此不是核心。它给出了它的用法说明:262.ecma-international.org/9.0/... - MDN 说明:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-03-21 00:20:22
2021-03-28 00:20:22
您通过“substring() 基本上是 slice() 的副本”总结了您冗长的答案,但问题恰恰在于这两者之间的区别。除了隐藏在中间某处唯一相关信息“切片将交换参数”之外,您的其余答案都忽略了该主题
2021-04-02 00:20:22

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

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

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

这是他关于此的文章

关于 mdn 中的 substr “已弃用。不适用于新网站。”
2021-03-18 00:20:22
这是不正确的, substr 确实处理负参数。 '0123456789'.substr(-3, 2) -> '78'
2021-04-08 00:20:22

一个答案很好,但需要一点点阅读。尤其是新术语“停止”。

我的 Go - 除了上面 Daniel 的第一个答案之外,还按差异进行组织以使其有用:

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

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

2)交换索引。Substring 将对索引重新排序,使第一个索引小于或等于第二个索引。

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

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

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

我的 2c

substringslice-之间的区别在于它们如何处理国外的负面和忽视线:

子串(开始,结束)

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

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

负值从行尾开始测量:

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:否定参数并且它保持和操作最明显。