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

时间:2010-02-11 10:34:04

标签: javascript substring slice substr

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

String.protorype.slice
String.protorype.substring

8 个答案:

答案 0 :(得分:730)

slice()的作用类似于substring(),但有一些不同的行为。

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

他们有什么共同点:

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

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

      1. 如果start > stopslice()将返回空字符串。 (""
      2. 如果start为负:从字符串末尾设置char,与Firefox中的substr()完全相同。在Firefox和IE中均可观察到此行为。
      3. 如果stop为否定值:将stop设置为:string.length – Math.abs(stop)(原始值),除了ECMA specification所涵盖的0(因此,Math.max(0, string.length + stop))。 / LI>

        来源:Rudimentary Art of Programming & Development: Javascript: substr() v.s. substring()

答案 1 :(得分:80)

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


让我先说明事实:

语法:
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()的副本。
< / p>

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

答案 2 :(得分:18)

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

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

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

以下是他关于此http://www.bennadel.com/blog/2159-using-slice-substring-and-substr-in-javascript.htm

的文章

答案 3 :(得分:10)

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

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

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。

答案 4 :(得分:9)

子字符串和切片之间的区别 - 它们是如何使用负数和俯视国外的参数:

子串(开始,结束)

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

此外,如果开始&gt;结束时,参数互换,即在开始和结束之间返回绘图线:

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.

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

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

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

答案 5 :(得分:2)

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

两者都有两个论点,例如:开始/结束/结束。

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

切片方法参数详情:

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

<强>参数

<强> START_INDEX 切片应从哪里开始的索引。如果以负数提供值,则表示从最后开始。例如-1表示最后一个字符。 的 END_INDEX 切片结束后的索引。如果未提供,则将从start_index获取切片到字符串的结尾。在负值的情况下,索引将从字符串的末尾开始计算。

子串方法参数详细信息:

参考:http://www.thesstech.com/javascript/string_substring_method

<强>参数

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

答案 6 :(得分:1)

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

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

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

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

output: crip

字符串“ substring”的示例代码

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

output: avat

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

答案 7 :(得分:0)

对于切片(开始,停止),如果stop为负,则stop将设置为:string.length - Math.abs(停止),而不是(string.length - 1) - Math.abs(停止)。< / p>