字符串之间的区别是什么。slice和String.substring?

有人知道这两种方法的区别吗?

String.prototype.sliceString.prototype.substring
370041 次浏览

slice()的工作方式与substring()类似,只是有一些不同的行为。

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

他们的共同点是:

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

# 1 # 2 # 3

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

# 1 # 2 # 3

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

来源:# 0

唯一的答案是好的,但需要一些解读。尤其是有了“停止”这个新术语。

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"。这使得安迪的困惑是合理的——我认为是“1234”。切片(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.

我的2摄氏度。

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

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

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

这是他的文章

TL;博士:

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

否则,请继续阅读完整的比较

语法

  • # 0
  • # 0
  • # 0

# 1: # 0

它能做什么?

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

# 1: # 0

改变原来的字符串?

  • # 0不
  • # 0不
  • # 0不

# 1: # 0

使用负数作为参数

  • slice()选择从字符串末尾开始的字符
  • substr()选择从字符串末尾开始的字符
  • substring()不起作用

# 1: # 0

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

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

第一个论证

  • # 0要求;开始指数
  • # 0要求;开始指数
  • # 0要求;开始指数

# 1: # 0

第二个论证

  • # 0可选;位置(直到但不包括)结束抽取的位置
  • # 0可选;要提取的字符数
  • # 0可选;位置(直到但不包括)结束抽取的位置

# 1: # 0

如果省略了第二个参数会怎样?

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

# 1: # 0

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

如果你想要substr的功能:

"foobarbaz".substr(index, length);

不使用已弃用的功能,你可以这样做:

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

在所有的边情况下得到完全相同的结果,比如负索引/长度。

substringslice -之间的区别是他们如何处理否定和忽略行参数:

substring(开始、结束)

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

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 2alert("testme".slice(1, -1)); // "estm", from the first position to the one at the end.

它比奇怪的逻辑substring要方便得多。

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

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

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

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

你不能给子字符串方法传递一个负值作为第一个参数,但是给方法从end遍历它。

切片方法参数细节:

参数

< >强start_index从切片开始的位置索引。如果value为负,则表示从最后开始。例如,最后一个字符是-1。end_index切片结束后的索引。如果没有提供切片将从start_index到字符串的末尾。在负值的情况下,指数将从字符串的末尾开始测量

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

参数

< >强从它应该是一个非负整数,以指定子字符串应该从哪里开始。一个可选的非负整数,提供子字符串结束前的索引

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

string.length – Math.abs(stop)

而不是:

string.length – 1 – Math.abs(stop)

substr:它为我们提供了基于指定索引获取部分字符串的方法。substr-的语法string.substr(开始、结束)Start - Start索引说明从哪里开始抓取。End - End索引告诉upto字符串的读取位置。它是可选的。< / p >

slice:它提供基于指定索引获取部分字符串。它允许我们指定正数和下标。slice - string.slice(start,end)的语法Start - Start索引说明从哪里开始抓取。这是End - End索引告诉upto字符串的读取位置。它是可选的。在'splice'中,开始索引和结束索引都有助于取正索引和负索引

字符串中'slice'的示例代码

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

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

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

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