あなたの混乱は当然です。ほとんどすべてのプログラマーは、人生のある時点で1つのエラーを犯します。それで、例を使ってそれをあなたに説明します:
文字列を考えてみましょう"Hello World!"
。コンピュータでは、メモリ内で文字の配列として表されます。次のようになります。
+---+---+---+---+---+---+---+---+---+---+---+---+
| H | e | l | l | o | | W | o | r | l | d | ! |
+---+---+---+---+---+---+---+---+---+---+---+---+
0 1 2 3 4 5 6 7 8 9 10 11 12
ここで、ボックス(文字)は12個だけですが、インデックス(0
to 12
)は13個あることに注意してください。インデックスは文字の間にあります。
注:最後のインデックスは常に配列の長さです。
プログラマーが犯すよくある間違いは、配列について考えるとき、インデックスではなくボックスの観点から考えるということです。
重要:配列は、ボックスの数ではなく、インデックスの観点から記述されます。
slice
それでは、メソッドを見てみましょう。このメソッドは2つのインデックスを取り、2番目のインデックスはオプションです。指定された文字列のサブ文字列を返します。
たとえば、必要な場合は、次のように抽出します("World"
インデックスで開始し、インデックスで終了します)。"Hello World!"
"World"
6
11
"Hello World!".slice(6, 11); // "World"
スペースの後にすべてが必要な"Hello World!"
場合(つまり、必要な場合"World!"
)、の代わりに短い形式を使用できますslice(6, 12)
。ここでは12
が暗示されているので、単純に使用できますslice(6)
:
"Hello World!".slice(6); // "World!"
文字列の長さを知らなくても、負のインデックスを使用して文字列の最後の文字を抽出することもできます。
"Hello World!".slice(-1); // "!"
ここ-1
はインデックスを表しますlength - 1
。length
は最後のインデックスとして定義されているので12 - 1
、この場合は単純です。したがって、インデックスの後のすべてを返します11
。
了解した?これで、フェンスポストの問題を理解できました。
これが、呼び出したときに文字列全体をそのまま取得する理由ですslice(0)
。を呼び出すと、最初の文字以降のすべてが表示されますslice(1)
。
配列を扱うときは、ボックスではなくインデックスの観点から考えることを常に忘れないでください。
文字の間に読みます。