1020

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

String.prototype.slice
String.prototype.substring
4

8 回答 8

1027

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

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

他们的共同点:

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

的区别 substring()

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

的区别 slice()

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

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

于 2010-02-11T10:36:25.193 回答
138

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().

于 2015-08-10T01:58:12.777 回答
37

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

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

他还指出,如果 slice 的参数是负数,它们会从末尾引用字符串。子字符串和子字符串没有。

这是他关于这个的文章。

于 2014-12-05T16:11:30.927 回答
15

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

我的 Go - 除了上面丹尼尔的第一个答案之外,按差异组织以使其有用:

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

"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。

于 2014-06-04T14:32:09.043 回答
13

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

子字符串(开始,结束)

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

alert("testme".substring(-2)); // "testme", -2 becomes 0

此外,如果start > end,则参数互换,即绘图线在 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:否定论点,并且它保持和运行最明显。

于 2016-02-05T14:32:11.710 回答
3

substr:它让我们可以根据指定的索引获取部分字符串。substr-string.substr(start,end) 的语法 start - 开始索引告诉获取开始的位置。end - 结束索引告诉字符串获取的位置。这是可选的。

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

字符串中“切片”的示例代码

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

output: crip

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

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

output: avas

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

于 2019-03-24T13:30:34.920 回答
3

The only difference between slice and substring method is of arguments

Both take two arguments e.g. start/from and end/to.

You cannot pass a negative value as first argument for substring method but for slice method to traverse it from end.

Slice method argument details:

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

Arguments

start_index Index from where slice should begin. If value is provided in negative it means start from last. e.g. -1 for last character. end_index Index after end of slice. If not provided slice will be taken from start_index to end of string. In case of negative value index will be measured from end of string.

Substring method argument details:

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

Arguments

from It should be a non negative integer to specify index from where sub-string should start. to An optional non negative integer to provide index before which sub-string should be finished.

于 2016-05-24T13:37:01.760 回答
0

对于slice(start, stop),如果stop为负,stop将设置为:

string.length – Math.abs(stop)

而不是:

string.length – 1 – Math.abs(stop)
于 2017-03-29T05:32:09.367 回答