有谁知道这两种方法有什么区别?
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:否定参数并且它保持和操作最明显。