条件分岐の一時変数をなくしたい
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
◆ 一時変数避けたい
例えばこんなコード
temp がないと分岐条件に使ったあとにまた使えません
pop なのでもう一度メソッド呼び出すと別の値です
仮に同じになっても関数の処理によっては時間かかってしまうので避けたいです
ES6 からはスコープが使えるので
こうすれば一時変数はスコープ外から見えなくなります
これで一時変数が関数の内側全体にあることを防げるのですが これでもネストしてるし行も増えるしちょっと面倒です
楽にできないかなー と考えていて こんなものを作ってみました
doif 関数は doif(条件)(値, true の場合の処理) という使い方をするものです
条件を値が true のとき と設定した doIfTrue を作って doIfTrue(value, fn) と呼び出せば value が true になれば fn が value を引数に実行されます
value のところは可変引数にできます
条件を満たさないなら false です
他にも一時変数が邪魔だーって思うのが 正規表現の match
を
と書けます
カッコでネストや行を使わず書けるけど見やすいか はいまいちなところ
個人的にはけっこう好きですけどね
var temp = arr.pop()
if(temp){
console.log(temp)
}
temp がないと分岐条件に使ったあとにまた使えません
pop なのでもう一度メソッド呼び出すと別の値です
仮に同じになっても関数の処理によっては時間かかってしまうので避けたいです
ES6 からはスコープが使えるので
{
const temp = arr.pop()
if(temp){
console.log(temp)
}
}
こうすれば一時変数はスコープ外から見えなくなります
これで一時変数が関数の内側全体にあることを防げるのですが これでもネストしてるし行も増えるしちょっと面倒です
楽にできないかなー と考えていて こんなものを作ってみました
function doif(cond_fn){
return (...args) => {
var fn = args.pop()
return cond_fn && typeof cond_fn === "function" && typeof fn === "function"
&& cond_fn(...args)
&& fn(...args)
}
}
var doIfTrue = doif(e => e)
doIfTrue(arr.pop(), x => cosnole.log(x))
doif 関数は doif(条件)(値, true の場合の処理) という使い方をするものです
条件を値が true のとき と設定した doIfTrue を作って doIfTrue(value, fn) と呼び出せば value が true になれば fn が value を引数に実行されます
value のところは可変引数にできます
var val = doif((a, b, c) => a + b + c > 100)(10, 40, 60, (a, b, c) => a * b * c)
合計が 100 を超える場合は 全部を掛けた値を返します条件を満たさないなら false です
他にも一時変数が邪魔だーって思うのが 正規表現の match
var a = "[a=b]"
var x, y
var match = a.match(/^\[(.*)\=(.*)\]$/)
if(match){
x = match[1]
y = match[2]
}
を
var a = "[a=b]"
var x, y
doIfTrue(a.match(/^\[(.*)\=(.*)\]$/), m => [, x, y] = m)
と書けます
カッコでネストや行を使わず書けるけど見やすいか はいまいちなところ
個人的にはけっこう好きですけどね