質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

1133閲覧

関数Aの実行結果がnullかundefinedの時のみに関数内に変数を新たに作らず、関数Bを実行させるには?

murabito

総合スコア108

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

2クリップ

投稿2018/05/11 11:37

編集2018/05/12 14:10
const hoge = (foo, bar) => (v) => foo(v) || bar(v);

foo(v)の結果がnullundefinedの時にbar(v)を実行させたいので、
foo(v) || bar(v)のようにしているのですが、これだと、foo(v)の結果がfalsyな値の場合、
bar(v)が実行されてしまいます。

const zero = (v) => 0 * v; const double = (v) => 2 * v; console.log( hoge(zero, double)(10) )

この場合だと、0falsyなので、20が`返って来てしまいます。

const hoge = (foo, bar) => (v) => { const result = foo(v) return result != null ? result : bar(v); }

一応、このようにfoo(v)の結果をローカル変数に入れてから、foo(v)の結果がnullまたはundefinedではないかをチェックすれば、
期待する動きにはなるのですが、このようにローカル変数を作らないと期待する結果は得られないでしょうか?

const hoge = (foo, bar) => (v) => { return foo(v) != null ? foo(v) : bar(v); }

foo(v)をこのように2回呼ぶことも出来るでしょうが、これは非効率なので避けたいところです。

const hoge = (foo, bar) => (v) => foo(v) || bar(v);

このように全て、引数に渡ってくる値のみで完結させたいのですが、何か方法があれば教えて頂ければ幸いです。

※ 不可能な場合はそれが答えだと思います。

set0gut1👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/11 12:32 編集

回答ではないですが、0!=nullはtrueです。 Number.isNaNか (result!==null && result!==undefine)な判定にする必要があります。
murabito

2018/05/11 12:48 編集

「0!=nullはtrue」で問題ありません。今回はfoo(v)の結果がundefinedかnullの時のみbar(v)を実行したいので大丈夫です。
退会済みユーザー

退会済みユーザー

2018/05/11 12:51

すみません。勘違いしてました。
guest

回答3

0

ベストアンサー

こういうことでしょうか。

js

1const f = (foo, bar) => v => (x => x != null ? x : bar(v))(foo(v)) 2 3f((x => 0), (x => 2 * x))(10) 4// 0 5f((x => null), (x => 2 * x))(10) 6// 20 7f((x => undefined), (x => 2 * x))(10) 8// 20

投稿2018/05/11 15:12

編集2018/05/13 01:23
karamarimo

総合スコア2551

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

murabito

2018/05/12 14:09

ありがとうございます。即時実行関数使えば良かったのですね。
think49

2018/05/13 01:07

この回答は x != null を別の関数に追い出す処理をしていますが、質問文のコードと比べてどのようなメリットが考えられるでしょうか。 個人的には、「関数コスト分、処理が増える」というデメリットが追加されているように読めてしまいます。
karamarimo

2018/05/13 01:17

ローカル変数を使わず、foo を2回呼び出さずにやるにはどうするかという質問だったので、パズル的な問題だと思って回答しました。 確かに実用的にはメリットが無いので自分なら普通にローカル変数を使って書くと思います。
think49

2018/05/13 01:28

なるほど、パズル的な問題としての回答でしたか。 高評価が6つ付いていたので、私の想定できない部分でメリットがあるのかと思って焦りました。パズル的思考なら納得です。
guest

0

JavaScript

1v == null; 2v != null;

私はこの書き方が嫌いです。
変数には「入るべき型」を決めてから代入値を決めますが、nullが入りうるtruthyな型はObject型しかあり得ないからです。
つまり、truthy もしくは falsy で基本的に事足ります。

Re: murabito さん

投稿2018/05/11 13:14

編集2018/05/11 13:14
think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ローカル変数が入るなぁ。

js

1const hoge = ( foo, bar, i ) => v => ( ( i = foo( v ) ), ( i != null ? i : bar( v ) ) ); 2```**動くサンプル:**[https://jsfiddle.net/kuqtn37b/](https://jsfiddle.net/kuqtn37b/)

投稿2018/05/11 12:17

kei344

総合スコア69398

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問