「配列の添字は何故0から始まるのか」というのをいつか書こうと思っていたんだけど、Mr. AWAWAが「配列はなぜ0始まりか説明出来ない」と書いていたので、良い機会なので「自分はこう理解している」というのを書いてみる。あくまで自分の理解なのであっているかどうかは不明。しかし、理解の助けになればと思うので間違っている可能性を承知で公開する。
以下、code例は全てJavaScriptで。
まず、次の配列について考えてみる。
var ary=["a","b","c","d","e","f","g","h","i","j"];
プログラマでない人の理解はこう。
a b c d e f g h i j
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
プログラマはこう。
a b c d e f g h i j
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
これを一般の人に説明するのは非常に難しい。
私は次のように考えている。
私は次のように考えている。
a b c d e f g h i j
0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 4 5 6 7 8 9 10
つまり、数値が割り当てられているのは要素ではなく、要素と要素の間の区切り。例えば、
ary[5] //=>"f"
5の区切りの次の要素を取得するので「f」が返ってくる。
ary.slice(3,6) //=>["d","e","f"]
と指定されると、3の区切りと6の区切りの間の「d,e,f」を取得する。
sliceの引数には負数も指定可能で、この場合は後ろからの取得となる。
つまり区切りはこう。
sliceの引数には負数も指定可能で、この場合は後ろからの取得となる。
つまり区切りはこう。
a b c d e f g h i j
0 1 2 3 4 5 6 7 8 9 10
-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 -0
0 1 2 3 4 5 6 7 8 9 10
-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 -0
実際にsliceを実行してみると次のようになる。
ary.slice(4,-3) //=>["e","f","g"]
ary.slice(-3,-1) //=>["h", "i"]
ary.slice(-7,7) //=>["d","e","f","g"]
ary.slice(-3,-1) //=>["h", "i"]
ary.slice(-7,7) //=>["d","e","f","g"]
ただし、最後まで取得したい場合第二引数に「-0」を指定してしまうと次のようになる。
ary.slice(6,-0) //=>[]
これは
ary.slice(6,0) //=>[]
と解釈されてしまうため、空の配列となってしまう。
(区切り位置の指定が前後逆になっているため空の配列となる。)
この場合、第二引数を省略すると第一引数に指定された区切りから最後までを取得する。
(区切り位置の指定が前後逆になっているため空の配列となる。)
この場合、第二引数を省略すると第一引数に指定された区切りから最後までを取得する。
ary.slice(6) //=>["g","h","i","j"]
同じようにspliceも同様である。
但し、spliceは破壊的メソッドであり、戻り値がブラウザ依存であるため注意が必要。
さらに、sliceは第一引数と第二引数ともに区切り位置だが、spliceの場合は第一引数が区切り位置で第二引数が「第一引数からの距離」である事に留意する必要がある。
つまり、
但し、spliceは破壊的メソッドであり、戻り値がブラウザ依存であるため注意が必要。
さらに、sliceは第一引数と第二引数ともに区切り位置だが、spliceの場合は第一引数が区切り位置で第二引数が「第一引数からの距離」である事に留意する必要がある。
つまり、
ary.splice(3,4,"x","y","z"); //=>["a","b","c","x","y","z","h","i","j"]
を実行すると3の区切りと「3の区切りから4つ進んだ7の区切り」の間の「d,e,f,g」が「x,y,z」に置き換わる。
第一引数には負数を指定可能。
第一引数には負数を指定可能。
ary.splice(-6,4,"x","y","z"); //=>["a","b","c","d","x","y","z","i","j"]
第二引数に0や負数を指定すると、距離が0となるので置き換えが発生せずに挿入のみとなる。
ary.splice(2,0,"x","y","z"); //=>["a","b","x","y","z","c","d","e","f","g","h","i","j"]
ary.splice(-2,0,"x","y","z"); //=>["a","b","c","d","e","f","g","h","x","y","z","i","j"]
ary.splice(-2,0,"x","y","z"); //=>["a","b","c","d","e","f","g","h","x","y","z","i","j"]
ちなみに、第三引数以降を指定しなかった場合は削除となる。
ary.splice(2,6); //=>["a","b","i","j"]
lengthは最後の区切り位置を返すので、
ary.length =>10
となる。
繰り返すけど、情報科学的に正しいかどうかはわからない。