すぐ忘れるのでメモ
var hoge = new Array();
短縮版としてよくこうやって書く
var hoge = [];
var hoge = [1,2,3,4]; var piyo = hoge.shift(); //[2,3,4]; alert(piyo); //1
戻りと副作用が動作としてセットなので↑は破壊的。
var hoge = [1,2,3,4]; var piyo = hoge.pop(); //[1,2,3] alert(piyo); //4
破壊的
var hoge = new Array(); hoge.push('aaa');
破壊的
実はこのメソッド
var hoge = []; hoge.push('aaa', 'bbb', 'ccc');
引数を何個もとって連続で追加することができる。
「末尾に追加する」pushは引数を複数個とれるので、こいつを応用すると破壊的に配列を結合することができる
var hoge = ['aaa']; Array.prototype.push.apply(hoge, ['bbb', 'ccc']);
applyメソッドは関数に成り代わって関数を実行するメソッドで第二引数を配列でとることができる。
だからこれを利用してpushを呼び出せば内部的には展開されてpushされるので、結果配列を結合したことと同じ効果を得ることができる。
var hoge = [1,2,3]; var moge = hoge.concat([4,5,6]);
mogeは
[1,2,3,4,5,6]
非破壊的
このconcatメソッドは引数を複数取ることもでき複数の配列を並列に同じようにつなぐ
var hoge = [1,2,3]; var moge = hoge.concat([4,5,6],[7,8,9]);
mogeは
[1,2,3,4,5,6,7,8,9]
長さをゼロに指定すると内部もなくなります
var hoge = [1,2,3]; hoge.length = 0;
JavaScriptは数値っぽいメンバとlengthプロパティがくっついていればオブジェクトになるみたい
つまりオブジェクトに無理やりつけてやればそう動くw Javascript/jQuery内部ではそういう操作してた。
Javascriptのダックタイピング的性質
とういうことでこういうコードが記述可能
var hoge = {} hoge[0] = 'aaa'; hoge[1] = 'bbb'; hoge.length = 2; Array.prototype.push.apply(hoge, ['ccc']); alert(hoge[2]);
なんでか知らんけどArrayには削除メソッドが無いw ・・・っが結局内部は単なる連想配列なのでdelete演算子が使える。
var a = ["a","b","c"]; delete a[1]; //=>["a", undifined, "c"]
結果はundifinedがセットされて要素数は変わらない
deleteと違って要素数も減らす版
var a = ["a","b","c"]; a.splice(1, 1); //=>["a", "c"]
注意点としてこの「詰める版」は要素数が減少するので定番のforループとかで操作すると操作対象とインデックスがズレます。
消した場合だけインデックスをデクリメントすれば問題ないです。
toStringメソッドを使うことによって、JSON形式の文字列に変換してくれる。
基本的に要素のカンマ区切りとして展開される(一番外側の[]括弧が無い)が、要素に格納されているtoStringメソッドを勝手に探索して存在したならばそれを実行し戻りで展開してくれる。
これによってオリジナルオブジェクトにtoStringを実装しておけば容易にJSON形式の文字列を生成することができるようになる。
これにはsliceメソッドを使う。第一引数に取り出したい場所の開始インデックス、第二引数に終了未満インデックスを入力する。つまり第一引数以上第二引数未満の要素を配列として取り出すことができる。
1個ズレなら1要素
[4, 5, 6, 7].slice(2, 3); //[6]
同じなら無し
[4, 5, 6, 7].slice(2, 2); //[]
オーバーしてもOK
[4, 5, 6, 7].slice(2, 10); //[6, 7]
第二引数を省略すると最後まで切り出す
[4, 5, 6, 7].slice(0); //[4, 5, 6, 7]
[4, 5, 6, 7].slice(1); //[5, 6, 7]
[4, 5, 6, 7].slice(0, 2); //[4, 5]
負の数を指定することで後ろ側から切り出せる。順番は格納順と変わらない。後ろ3要素を切り出したいなら
[4, 5, 6, 7].slice(-3); //[5, 6, 7]
っで切り出せる