-「配列のようなオブジェクト」にArrayのメソッドを使う
呼び出しが1回なら Array.prototype.slice
を使い、複数回なら Array.prototype.slice
をローカル変数にキャッシュして使います。
[].slice
は配列生成コストも無駄ですが、一度直属のプロパティを参照してからプロトタイプ上のプロパティ走査するので初めからプロトタイプ上のプロパティを指定した方が良いと考えます。
また、「配列のようなオブジェクト」に対して一回だけ Array.prototype
なメソッドを使うならば、配列変換コストが無駄なので Array.orototype.slice
を省略し、Array.prototype.forEach.call(arrayLike)
のように使います。
グローバル変数の呼び出しコストが高いので基本的にはクロージャに閉じ込めてスコープチェーン上のコストが高くないように工夫します。
JavaScript
13
4var toArray = (function (isArray, slice) {
5 if (typeof isArray !== 'function') {
6 isArray = (function (Object, toString) { // Array.isArray polyfill
7 return function isArray (arg) {
8
9 if (Object(arg) !== arg) {
10 return false;
11 }
12
13 if (toString.call(arg) === '[object Array]') {
14 return true;
15 }
16 return false;
17 };
18 }(Object, Object.prototype.toString));
19 }
20
21 return function toArray (arg) {
22 return isArray(arg) ? arg : slice.call(arg);
23 };
24}(Array.isArray, Array.prototype.slice));
25
26console.log(toArray({0: 1, 1: 2, 2: 3, length: 3})); // [1, 2, 3]
「配列のようなコンストラクタ」が拡張可能であれば、prototype
に配列メソッドを入れます。
JavaScript
1function SomethingLikeArray () { ; }
2SomethingLikeArray.prototype.slice = Array.prototype.slice;
3new SomethingLikeArray().slice();
- 任意のオブジェクトを受け取れる場面で、Objectのメソッドを確実に使う
Object.prototype.hasOwnProperty.call(arg)
のように指定します。
- Object.prototype.toStringでオブジェクトの分類を行う
Object.prototype.toString.call(new RegExp) === '[object RegExp]'
のようにして使いますが、これに関しては何を疑問に思っておられるのかわかりませんでした。
使い方を承知の上で質問しているようにも思いますが…。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。