デバッグ練習、ユーティリティ関数っぽいなにかをつくる

役に立たないエントリー。

教材にid:javascripterがつくったoperator.jsを使用する。

contains: function (a, b) {
  return a in b;
},

ん、このcontainsはどう使うんだろう、が発端。

デバッグ練習

var s=document.createElement('script');s.src='http://gist.github.com/raw/22565/28cc7e2590d52b38a53ff0b8bb8f6de680a864df?operator.js ';document.body.appendChild(s);
  • これでbodyにoperator.jsが読み込まれたのでconsole.log(operator.add(1,2))を実行すれば3が出力されるようになる。

ユーティリティ関数っぽいなにか

ソースを眺めていたらこれらをまとめてチェックするユーティリティ関数つくれるかなーって思ってできたのが以下のスクリプト。operatorの中に入ってる全ての関数に(1,7)という引数をつけて実行するもの。

for(var p in operator){
  try {
    console.log(p + ': ' + operator[p](1,7))
  }
  catch (e) {
    console.log(e)
  }
}


実行結果

add: 8
TypeError: invalid 'in' operand b message=invalid 'in' operand b
division: 0.14285714285714285
and: 1
xor: 6
 :
 :

実行すると、数値やエラーが出力されて見事にユーティリティ関数っぽいなにかができた。しかし、これでは関数が引数に2つの数字を期待する場合のチェックにしか使えない。今回はこれ以上追わない。
はじめfor..inをやったときのpをtypeofするとstringなので、どうやって関数を実行すればいいのか悩んだ。operator[p]にするとfunctionになった。さすがJS。


operator.contains関数の正しい使い方はこう。

var obj = {a:7,b:3};
var test1 = 'a';
var test2 = 'c';

console.log(operator.contains(test1,obj)) //true
console.log(operator.contains(test2,obj)) //false

containsの2つ目の引数はオブジェクトじゃないとだめ。inを使ってるから配列はできない(不確か)。


まあ最初っから以下のように抜き出してやればよかったんだけどね。練習練習。

function contains(a, b) {
  return a in b;
}

var obj = {a:7,b:3};
var test1 = 'a';
var test2 = 'c';

console.log(contains(test1,obj)) //true
console.log(contains(test2,obj)) //false