Stringオブジェクトのsubstringとsliceとsubstrはどれも文字列から指定した範囲で文字を切り出すメソッドだが、微妙な違いがある。
文字列の5文字目から7文字目を抜き出す。
substring
var str = 'hogeほげーfugaふがー'
str.substring(4, 7)
//ほげー
slice
var str = 'hogeほげーfugaふがー'
str.slice(4, 7)
//ほげー
substr
var str = 'hogeほげーfugaふがー'
str.substr(4, 3)
//ほげー
substringとsliceは、
str.substring[slice](start, end)
と書く。(startはn + 1であることに注意)
substrは
str.substr(start, startから何文字切り取るか)
と書く。
こう見ると一見、substringとslice一緒やんーとなるかもしれない。しかし、この二つにも微妙な違いが存在する。
start(第一引数) > end(第二引数) の時
第一引数の値が第二引数よりも大きくなった場合に違いがある。
substring
var str = 'hogeほげーfugaふがー'
str.substring(7, 4)
//ほげー
slice
var str = 'hogeほげーfugaふがー'
str.slice(7, 4)
//""
substringでは、start(第一引数) と end(第二引数)をひっくり返して処理する。
sliceでは、空文字を返す。
end(第二引数)に負の値
end(第二引数)に負の値が入ったときの挙動も違う。
substring
var str = 'hogeほげーfugaふがー'
str.substring(4, -7)
//hoge
slice
var str = 'hogeほげーfugaふがー'
str.slice(4, -7)
//ほげー
substringでは、負の値は0にキャストされる。
そして先ほどの例で示したように、substringは、start(第一引数) > end(第二引数)だった場合にはひっくり返して処理するので、0から4文字目までを返す。
sliceでは、負の値はキャストされず、末尾から数える。
つまり、slice(4, -7)は、slice(4, 7)と同じになる。
slice(4, -4)ならば、slice(4, 10)と同じ。
(文字列の長さから引いた数と考えるとわかりやすいかも)