[JavaScript] 配列のようなものって?

2017年1月23日月曜日

JavaScript

arguments変数を本物の配列に変換する方法ではArray.applyを使ってarguments変数を配列に変換した。
でも、Function.applyメソッドの第2引数は基本的には配列ってことになってる。
配列を作るために配列を渡すってのは変だね。applyメソッドって、配列じゃなくても受け取れるようだ。

Function.prototype.apply() JavaScript MDN

うーん、どうやらプロパティとしてlengthを持っていて、0以上、length未満の数字を名称としたプロパティを持ったオブジェクトであればいいみたい。
var arr = Array.apply(null, { length : 3,
                              0 : 'orange', 
                              1 : 'banana', 
                              2 : 'grape' 
                            });
console.log(arr);
// orange,banana,grape

プロパティ名に数値リテラルが使えるところに違和感があるけど、内部的には文字列に変換されるみたいだね。

メンバー演算子 プロパティ名 JavaScript MDN

lengthを超えたインデックスのプロパティや、歯抜けになってる場合はどうなるんだろう。
var arr2 = Array.apply(null, { length : 2,
                               0 : 'orange',
                               1 : 'banana',
                               2 : 'grape'
                             });
console.log(arr2);
// orange,banana
console.log(arr2[2]);
// undefined

var arr3 = Array.apply(null, { length : 3,
                               0 : 'orange',
                             //  1 : 'banana',
                               2 : 'grape'
                             });
console.log(arr3);
// orange,,grape
console.log(arr3[1]);
// undefined

lengthを超えたプロパティや歯抜けになっているプロパティは無視されるみたい。
配列リテラルでもこんな書き方ができるから、JavaScriptの配列は歯抜けになっててもいいってことなのかな。
console.log(['orange', , 'grape']);
// orange,,grape