javascriptの引数について

javascriptの引数についてです。

引数のチェックをjavascriptでは行ってくれません。

ES2015からは改善されているようです。

引数のチェックはしない

function showName(name) {
  console.log(name);
}

showName('foo');
=>foo

showName('foo', 'bar');
=>foo

showName();
=>undefined

これはrubyだと、引数が合わないよって怒ってくるところですね。

def show(name)
  name
end

[4] pry(main)> show('foo')
=> "foo"
[5] pry(main)> show('foo', 'bar')
ArgumentError: wrong number of arguments (given 2, expected 1)
from (pry):5:in `show'
[6] pry(main)> show()
ArgumentError: wrong number of arguments (given 0, expected 1)
from (pry):5:in `show'

引数を持つオブジェクト

argumentsが持っています。

argumentsオブジェクトを利用して、引数の数を確認することができます。

下のような感じですね。

function showName(name) {
  if (arguments.length !== 1) {
    console.log(`given ${arguments.length}, expected 1`)
  }else {
  console.log(name);
  }
}

可変長引数のように書く

可変長引数の場合は、配列で回していくことになります。

下のような感じになります。

function sum() {
  var result = 0;
  for(var i = 0, len = arguments.length; i < len; i++) {
    var tmp = arguments[i]
    if (typeof tmp !== 'number') {
      throw new Error('引数が数値ではありません');
    }
    result += tmp;
  }
  return result;
}
sum(1, 3, 5, 7, 9);

こういうのを見ると、rubyは簡潔に書ける言語だなって感じてしまう。