27004


**下記のようなコードを見かけたのですが、どういう意味でしょうか？**  
・第3引数を渡さないとき、cはundefinedになるため、常にfalse？  
・第3引数を渡すとき、cは常にtrue？

[code]

    function test (a, b, c) {
      //
      if (c) {
        //
     } else {
        //
     }
    }
    test(1, 2);
    
[/code]

・これは一般的な書き方でしょうか？


CC BY-SA 3.0
2016-06-23T02:06:23.597
26971
2016-06-23T11:11:04.467
7886
question
javascript
undefinedは、真偽判定に利用できる？


省略可能なブール引数として使っています。  
省略した場合、及び `false`、`0`、`""`など偽と判断される値を渡した場合はfalseとなります。  
それ以外の値を渡した場合はtrueとなります。

一般的な書き方かと。


CC BY-SA 3.0
2016-06-23T03:00:14.217
26977
2016-06-23T03:00:14.217
4236
26971
answer


一般的な書き方ですが、

[code]

    function(a, b, c){
      if(!!c){
         someFunc(c); // cについて処理する
      } else{
         someFunc({}); // cがなかった時の処理
      }
      // ...
    }
    
[/code]

のように、 `if(!!c){ ...` というのも多いです。  
たとえば、前述の `someFunc` は「引数にtrueかfalseが欲しい！ nullやundefinedはこまる！」  
というようなときに、`someFunc(!!c)` とすれば、引数cを省略した時も、falseを入れた時も、trueが来た時も問題なく動きます。

`!!`のパターンもよく見るので一応覚えておいたほうが良いですよ


CC BY-SA 3.0
2016-06-23T10:58:30.833
27003
2016-06-23T10:58:30.833
13215
26971
answer


すでに承認された回答が付いていますが、念のため補足です。

_・第3引数を渡さないとき、cはundefinedになるため、常にfalse？_  
Yesです。true/false以外の値を論理値が必要な場所に渡した時に、どのようにtrue/falseに変換されるかは(harry0000さんのコメントにもありますが)しっかり定義されています。

[9.2 ToBoolean](http://www.ecma-international.org/ecma-262/5.1/#sec-9.2)  
リンク先はECMA5.1のものですが、この部分の記述についてはバージョン間での本質的な変更はないはずです。

undefinedがfalseとして判定されることは(よほど変な独自実装をしていない限り)間違いありません。

_・第3引数を渡すとき、cは常にtrue？_  
Noです。上のリンクを参照すればわかりますが、`undefined`, `false`, `null`, `+0`, `-0`, `NaN`,
`''`(空文字列)は`false`と判定されます。ここにあげた値を第3引数として渡せばif(c)の判定は成立せず、「第3引数を渡しているのに条件は成立しない」と言うことになります。

あなたのコードでtest(1, 2, 0)を実行して、`if`部と`else`部のどちらが実行されるか確かめてみてください。

_・これは一般的な書き方でしょうか？_

「一般的」をどう定義すれば良いのかわからないので、直接の回答ではありませんが、「`undefined`, `false`, `null`, `+0`,
`-0`, `NaN`, `''`」以外の値を全て真と判定したい場合にはよくある書き方、と言って良いと思います。

但し、「必須ではない引数を指定されたかどうか」を判定するには、この条件の書き方ではうまくいかないことも多いです。`0`や`''`を指定された場合に、それは何も指定していないものと扱って良いのかどうか、よく考えて、要件に合わないなら、`arguments.length`を使って判定すべきでしょう。


CC BY-SA 3.0
2016-06-23T11:11:04.467
27004
2016-06-23T11:11:04.467
13972
26971
answer