今更ですがarguments
オブジェクトを配列(Array)にする方法をいくつかあげてみた。
黒魔術系: arguments
オブジェクトそのもののクラスをObject
からArray
に変更する
配列(Array)の様にarguments
を扱えるようにする。非常に危険なので注意。
Object.setPrototypeOf(arguments, Array.prototype);
// または
arguments.__proto__ = Array.prototype;
function sortArgs() {
Object.setPrototypeOf(arguments, Array.prototype);
return arguments.sort().join(',');
}
console.log(sortArgs(1, 3, 5, 2, 4, 6));
実はArray-likeなオブジェクトになっているだけなので、そのまま使用しないように。
というか、実際のプロジェクトには使っちゃいけない。
あまり速くもないし。
for
を使ってarguments
を配列にコピーする
普通。args = []
よりargs = new Array(n)
がいいかも。
var args = [];
for (var i = 0; i < arguments.length; ++i)
args[i] = arguments[i];
function sortArgs() {
var args = new Array(arguments.length);
for (var i = 0; i < arguments.length; ++i)
args[i] = arguments[i];
return args.sort().join(',');
}
console.log(sortArgs(1, 3, 5, 2, 4, 6));
slice
を呼んでArray
に変換する
slice
を呼んで配列にする。これは非常によく見かける方法。
var args = [].slice.call(arguments);
// または
var args = Array.prototype.slice.call(arguments);
function sortArgs() {
return [].slice.call(arguments).sort().join(',');
}
console.log(sortArgs(1, 3, 5, 2, 4, 6));
...argsでArray
として引数を得る
ES6 (ES2015) 以降ならこの方法が一番いいと思う。
(...args)
function sortArgs(...args) {
return args.sort().join(',');
}
console.log(sortArgs(1, 3, 5, 2, 4, 6));
似てるけど他に以下の方法もある。
function sortArgs() {
return [...arguments].sort().join(',');
}
console.log(sortArgs(1, 3, 5, 2, 4, 6));
Array.from
を呼んでArray
に変換する
ES6 (ES2015) 以降ならこの方法もある。
var args = Array.from(arguments);
function sortArgs() {
return Array.from(arguments).sort().join(',');
}
console.log(sortArgs(1, 3, 5, 2, 4, 6));
Array
を呼んでArray
に変換する
ちょっとトリッキーな方法。
var args = arguments.length === 1 ? [arguments[0]] :
Array.apply(null, arguments);
function sortArgs() {
var args = arguments.length === 1 ?
[arguments[0]] : Array.apply(null, arguments);
return args.sort().join(',');
}
console.log(sortArgs(1, 3, 5, 2, 4, 6));
長さが1の時に注意が必要。Array(n)
は違う意味になるため。
map
を呼んでArray
に変換する
こういうのもある。
var args = [].map.call(arguments, x => x);
function sortArgs() {
return [].map.call(arguments, x => x).sort().join(',');
}
console.log(sortArgs(1, 3, 5, 2, 4, 6));
push
を呼んでArray
に変換する
あまり役に立たない。
var args = [];
[].push.apply(args, arguments);
concat
を呼んでArray
に変換する
これも役に立たない。
var args = [].concat.apply([], arguments);
ほか
Stack Overflow
Converting the “arguments” object to an array in javascript