问答中心分类: JAVASCRIPT字符串之间的区别是什么。切片和字符串。子字符串?
0
匿名用户 提问 7小时 前

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

String.prototype.slice
String.prototype.substring
8 Answers
0
Daniel Vassallo 回答 7小时 前

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. 如果start为负:从字符串末尾设置char,与substr()在Firefox中。这种行为在Firefox和IE中都可以观察到。
  3. 如果stop为负:将“停止”设置为:string.length – Math.abs(stop)(原始值),但以0为界(因此,Math.max(0, string.length + stop))如ECMA规范.

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

Andy 回复 7小时 前

在你最后的笔记中slice(),应该是string.length - stop

Oriol 回复 7小时 前

在你最后的笔记中slice(),我认为应该是(string.length – 1) + stop或者,为了明确这是负面的,(string.length – 1) – Math.abs(stop)

flying sheep 回复 7小时 前

@Longpoke:String.slice添加了,以便有一个与一致的字符串方法Array.slice.substring一直存在,所以他们没有打破它,并添加了另一种方法。在我看来,这不是一个糟糕的决定。一致性很好,2。它允许CoffeeScript的切片语法处理数组和字符串@奥利奥:在中编辑。

Rick 回复 7小时 前

在Firefox 22中,子字符串和切片之间似乎存在性能差异。jsperf。com/string切片与子字符串

Qwerty 回复 7小时 前

截至2014年5月,他们在Chrome上的速度相当快。

Max 回复 7小时 前

我喜欢这样substring允许互换参数。

user1537366 回复 7小时 前

安迪是对的。stop将设置为string.length + stop如果stop是负数。回想起stop是最后一个字符提取后的索引!

user1537366 回复 7小时 前

@DanielVassallo你真的应该编辑它。这是错误的。

IanVS 回复 7小时 前

看起来像是第5点substr不正确,根据MDN公司:“如果start为负,substr()将其用作字符串末尾的字符索引。如果start为负,并且abs(start)大于字符串的长度,substr()将0用作开始索引。”

Venryx 回复 7小时 前

以上答案中的最后一个3点是可以证实的错误,但作者并没有纠正它。证明:"abc".slice(0, -1)等于"ab",而不是"a"正如他的回答所表明的那样。

goodvibration 回复 7小时 前

哇,为什么到目前为止还没有人发现?声明“如果start > stop,slice()将返回空字符串“是错误的。例如:4 > -1但是"babayaga".slice(4, -1)退货"yag".

snuggles 回复 7小时 前

@所以答案的问题是,规则#3应该放在第一位,或者应该作为规则#1的例外。

0
Waddah 回答 7小时 前

TL;博士:

  • 如果您知道要停止(但不包括)的索引(位置),请使用slice().
  • 如果您知道要提取的字符长度,则可以能够使用substr(),但这是不鼓励的,因为它已被弃用。

否则,请继续阅读以进行全面比较
Syntax

  • 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()==substr()==substring()
使用负数作为参数

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

注#4:slice()==substr()
如果第一个参数大于第二个参数

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

第一个论点

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

注#5:slice()==substr()==substring()
第二个论点

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

注#6:slice()==substring()
如果省略第二个参数呢?

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

注#7:slice()==substr()==substring()
所以,你可以说slice()substr()虽然substring()基本上是slice().
如果你想的话substr的功能:

"foobarbaz".substr(index, length);

如果不使用已弃用的功能,您只需执行以下操作:

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

在所有边缘情况下得到完全相同的结果,如负指数/长度。

Killy 回复 7小时 前

不应使用substr()开发商mozilla。org/en-US/docs/Web/JavaScript/Reference/…

CodeFinity 回复 7小时 前

@基利关于它是传统功能的来源你的链接中没有提到。

Max 回复 7小时 前

你用“substring()基本上是slice()的副本”来总结你冗长的答案,但问题恰恰是关于这两者之间的区别。你剩下的答案没有抓住主题,除了只有相关工件信息“切片将交换参数”隐藏在在中间的某个地方。

Killy 回复 7小时 前

@CodeFinity当我写这篇文章时,有一条评论,但有人在2020年7月删除了它网状物档案文件org/web/20200704195437/https://…

user3342816 回复 7小时 前

@基利:它仍然在兼容性表和侧栏中。横幅上有不一致之处。不知道为什么有人从其中一个删除了它,但其他人没有,反之亦然。这种不一致有点令人遗憾。横幅出现在所有其他横幅上。简言之substr是ECMA标准附录B的一部分,因此不是核心。它给出了它的用法说明:262.ecma-国际。org/9.0/…-MDN注:开发商mozilla。org/en-US/docs/Web/JavaScript/Reference/…

0
Jón Viðar Þorsteinsson 回答 7小时 前

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

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

他还指出,如果要切片的参数为负,则它们从末尾引用字符串。Substring和substr没有。
这是他的文章关于这个。

Neil Fraser 回复 7小时 前

这是不正确的,substr确实处理负参数。'0123456789'.substr(-3, 2) -> '78'

hafiz ali 回复 7小时 前

关于mdn中的substr“已弃用。不用于新网站。”

0
Gerard ONeill 回答 7小时 前

一个答案很好,但需要仔细阅读。尤其是新术语“停止”。
我的围棋——除了上面Daniel的第一个答案外,还通过差异进行组织,使其有用:
1) 负指数。子字符串需要正索引,并将负索引设置为0。切片的负索引表示从字符串末尾开始的位置。

"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”。切片(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.

我的2c。

0
Alexandr 回答 7小时 前

两者之间的区别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"

slice
负值​​从线路末端测量:

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.
substr的第一个参数为负值,除IE8-外,所有浏览器都支持。
如果选择这三种方法中的一种,在大多数情况下使用-它将是slice:负参数,它维护和操作最明显。