有谁知道这两种方法有什么区别?
String.prototype.slice
String.prototype.substring
有谁知道这两种方法有什么区别?
String.prototype.slice
String.prototype.substring
slice()
像substring()
一些不同的行为一样工作。
Syntax: string.slice(start, stop);
Syntax: string.substring(start, stop);
他们的共同点:
start
等于stop
:返回一个空字符串stop
省略:将字符提取到字符串的末尾的区别 :substring()
start > stop
,substring
则将交换这两个参数。NaN
,则将其视为0
。的区别 :slice()
start > stop
,slice()
将返回空字符串。( ""
)start
为负:从字符串的末尾设置字符,就像substr()
在 Firefox 中一样。在 Firefox 和 IE 中都可以观察到这种行为。stop
为负:将停止设置为:(string.length – Math.abs(stop)
原始值),除非ECMA 规范中Math.max(0, string.length + stop)
涵盖的以 0为界(因此,)。slice()
.substr()
.否则,请继续阅读以进行完整比较
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()
。
一个答案很好,但需要一点点阅读。尤其是新术语“停止”。
我的 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
substring
和slice
-之间的区别在于它们如何处理国外的负面和忽视线:
负参数被解释为零。过大的值被截断为字符串的长度:
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
:否定参数并且它保持和操作最明显。