String.slice和String.substring有什么区别?
有谁知道这两种方法之间有什么区别:
String.slice String.substring
slice()
像substring()
一样工作,具有一些不同的行为。
Syntax: string.slice(start, stop); Syntax: string.substring(start, stop);
他们有什么共同点:
- 如果
start
等于stop
:返回一个空string - 如果省略
stop
:将字符提取到string的末尾 - 如果任一个参数大于string的长度,则会使用该string的长度。
substring()
区别 :
- 如果
start > stop
,那么substring
将交换这两个参数。 - 如果任一个参数是负数或者是
NaN
,那么它被视为0
。
slice()
区别 :
- 如果
start > stop
,slice()
将不交换2个参数。 - 如果
start
是负数:从string的末尾设置char,就像在Firefox中的substr()
一样。 在Firefox和IE中都可以看到这种行为。 - 如果
stop
为负:将停止设置为:string.length – Math.abs(stop)
(原始值)。
来源: 编程和开发的基本艺术:Javascript:substr()vs substring()
注意:如果你急着,和/或寻找简短的答案滚动到答案的底部,并阅读最后两行。如果不急于阅读整个事情。
让我先说事实:
句法:
string.slice(start,end)
string.substr(start,length)
string.substring(start,end)
注#1: slice()==substring()
它能做什么?
slice()
方法提取一个string的一部分,并以一个新的string返回提取的部分。
substr()
方法从指定位置的字符开始提取string的一部分,并返回指定数量的字符。
substring()
方法提取一个string的部分,并返回提取的部分在一个新的string。
注#2: slice()==substring()
更改原始string?
slice()
不
substr()
不
substring()
不
注#3: slice()==substring()
用负数作为参数:
slice()
select从string结尾开始的字符
substr()
从string的末尾开始select字符
substring()
不执行
注#3: slice()==substr()==substr()
如果第一个论据大于第二个论据:
slice()
不执行
substr()
由于第二个参数不是一个位置,而是长度值,它将像往常一样执行,没有问题
substring()
将交换两个参数,并照常执行
第一个论点:
slice()
必需,表示:启动索引
substr()
必需,表示:起始索引
substring()
必需,表示:起始索引
注#4: slice()==substr()==substring()
第二个论据:
slice()
可选,位置(直到但不包括)结束提取的位置
substr()
可选,要提取的字符数
substring()
可选,位置(最多但不包括)结束提取的位置
注#5: slice()==substring()
如果第二个论据被忽略呢?
slice()
select从开始位置到结束string的所有字符
substr()
select从开始位置到结束string的所有字符
substring()
select从开始位置到结束string的所有字符
注#6: slice()==substr()==substring()
所以,可以说slice()
和substr()
之间有区别,而substring()
基本上是slice()
的副本。
综上所述:
如果你知道你将停止(但不包括)的索引(位置),使用slice()
如果知道要提取的字符的长度,则使用substr()
。
Ben Nadel写了一篇很好的文章,他指出了这些函数在参数上的差异:
String.slice( begin [, end ] ) String.substring( from [, to ] ) String.substr( start [, length ] )
他还指出,如果要切片的参数是负数,则从末尾引用string。 子串和substr不是。
这里是他的这篇文章http://www.bennadel.com/blog/2159-using-slice-substring-and-substr-in-javascript.htm
一个答案是好的,但需要一点点阅读。 特别是用新的术语“停止”。
我的围棋 – 除了上面丹尼尔的第一个答案之外,由差异组织起来,
1)负面指标。 子串需要正的索引,并将负索引设置为0.切片的索引意味着从string末尾开始的位置。
"1234".substring(-2, -1) == "1234".substring(0,0) == "" "1234".slice(-2, -1) == "1234".slice(2, 3) == "3"
2)交换索引。 子串将对索引重新sorting以使第一个索引小于或等于第二个索引。
"1234".substring(3,2) == "1234".substring(2,3) == "3" "1234".slice(3,2) == ""
————————–
一般评论 – 我觉得奇怪的是,第二个索引是在切片或子string的最后一个字符之后的位置。 我期望“1234”.slice(2,2)返回“3”。 这使得Andy的困惑超出了理由 – 我期望“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。
子串和切片之间的区别 – 他们是如何与消极和忽略国外线路的工作参数:
子串(开始,结束)
否定论据被解释为零。 太大的值被截断为string的长度:alert(“testme”.substring(-2)); //“testme”,-2变成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 2 alert ( "testme" .slice (1, -1)); // "estm", from the first position to the one at the end.
这比奇怪的逻辑子string要方便得多。
除IE8以外,所有浏览器都支持substr的第一个参数的负值。
如果select这三种方法中的一种,在大多数情况下使用 – 这将是切片 :负面的论点,它保持和操作最明显。
slice和substring方法之间唯一的区别是参数
两个都有两个参数,例如开始/结束/结束。
你不能传递一个负值作为substring方法的第一个参数,而是slice方法从最后遍历它。
切片方法参数详细信息:
REF: http : //www.thesstech.com/javascript/string_slice_method
参数
start_index从哪里开始的索引。 如果价值提供否定意味着从上次开始。 例如最后一个字符为-1。 end_index切片结束后的索引。 如果没有提供slice将从start_index到string的结尾。 在负值的情况下,索引将从string的末尾开始计算。
子串方法参数详细信息:
REF: http : //www.thesstech.com/javascript/string_substring_method
参数
从它应该是一个非负整数来指定子string应该从哪里开始的索引。 到一个可选的非负整数,以提供索引之前应该完成子string。
差异
String.prototype.slice
–处理负面指数
- “如果[ 任何一个参数都是 ]为负值,则将其视为
strLength +
[index
],其中strLength
是string的长度(例如,如果[index
]是-3
则将其视为strLength - 3
)。开始索引大于结束索引
“如果[ 起始索引 ]大于或等于 [ string片段 ]的[ 处理结束索引 ],则
slice()
返回一个空string。– MDN
String.prototype.substring
–处理负面指数
- “如果任一论点是[ 否定的 ] [ … ],那么它被视为
0
。开始索引大于结束索引
“如果[ 起始索引 ]大于[ 结束索引 ],那么
substring()
效果就好像两个参数被交换一样; 例如,str.substring(1, 0) == str.substring(0, 1)
。 “– MDN
相似
其他一切都是一样的,我想,包括:
- 如果一个结束索引参数是
undefined
,它将变成string的长度。 - 不是数字且不能转换为数字的参数变为
0
。
* substr()
方法也是如此,除了substr()
没有结尾索引参数( 参见String.prototype.substr
下的注释 )。
笔记
String.prototype.substring
-
其中
string.substring(startIndex, endIndex)
,-
参数交换限制 – 如果
endIndex
作为parameter passing时不是数字,则substring()
方法在内部变为0
(对slice()
也是这样)。 然而,它不会与startIndex
交换它的价值( 一个人认为它可能是合理的,但我离题了 ) 。 因此,如果endIndex = NaN
,那么string.substring(startIndex, endIndex) === ""
是真的(就像slice()
一样),不pipe提供的起始索引如何。 -
关于参数交换的想法 – 如果
endIndex
undefined
则变为string.length
; 如果startIndex
大于string的长度,你可能会推断它用endIndex
交换了它的值,但是由于这样会产生一个空string(因为这两个值都超出了string的索引),所以,这样做。 相反,它可能只是一个内部检查来查看startIndex > string.length
是否为true,如果是则返回空string。
-
String.prototype.substr
[ 稍微超出了问题的范围 ]
-
String.prototype.substr
非常像slice
,特别是关于索引值的负数的处理。 然而,关键的区别是substr()
的第二个参数没有指定结束索引,而是调用者想要返回的字符长度。 只要说substr()
行为就像slice的作用超出了这个关键的区别一样。
对于切片(开始,停止),如果停止为负,停止将被设置为:string.length – Math.abs(stop),而(string.length – 1) – Math.abs(stop)。