【Javascript】配列の値の中から、最大値、最小値を求める(配列を引数に展開する)
問題
Javascriptで、数値の配列から、最大値、最小値を求めよ。
答え
var a = [3, 1, 4, 1, 5, 9, 2, 6]; Math.max.apply(null, a); // → 9 Math.min.apply(null, a); // → 1
補足
何が起きているのか。
Math.max(5, 7) // → 7 Math.max(5, 7, 4, 9, 1) // → 9 Math.max は可変長の引数をとります Math.max([5, 7, 4, 9, 1]) // → NaN そもそもダメです Math.max.apply(null, [5, 7, 4, 9, 1]) // → 9 OKです
applyの第一引数は何でもよい。結果は変わらない。
Math.max.apply({}, [5, 7, 4, 9, 1]) // → 9 OKです Math.max.apply([], [5, 7, 4, 9, 1]) // → 9 OKです Math.max.apply(new Date(), [5, 7, 4, 9, 1]) // → 9 OKです Math.max.apply(null, [5, 7, 4, 9, 1]) //→ 9 OKです
第一引数のオブジェクトにMath.maxを適用(apply)したところで、返ってくるのは Math.max(5, 7, 4, 9, 1) の結果。
言い換えると、applyは第1引数のオブジェクトをthisとして、第2引数の配列を引数に展開してmaxを実行するのだが、thisが何であれMath.max(5, 7, 4, 9, 1)の結果には影響しない。だから何を第1引数に渡してもよいけどnullか、素のオブジェクト{}が一番簡単。
配列を引数に展開したいときの方法でした。
参考
https://developer.mozilla.org/ja/A_re-introduction_to_JavaScript
コメント