• 締切済み

falsyな値そのものに意味がある場合とは?

>>> var msg = ''; msg = msg || 'こんにちは、世界!'; console.log(msg); // 結果:こんにちは、世界! falsyな値に意味がある場合に注意 ただし、空文字やゼロなど、falsyな値そのものに意味がある場合には、本文のようなイディオムは利用できません。 空文字やゼロなどの値がデフォルト値(ここでは「こんにちは、世界!」)によって上書きされてしまうからです。 そのような場合には、以下のように条件演算子を利用してください。 msg = (msg === undefined ? 'こんにちは、世界!' : msg); これによって、変数msgがundefined(未定義)の場合にだけ、デフォルト値が適用されます。 0に意味があるというのは、0が計算式の一部だった場合などのことですか? 0に意味がないときはただの文字列などですか? なぜ0がこんにちは、世界!に上書きされるのでしょうか? 補足>>> ただし、空文字やゼロなど、falsyな値そのものに意味がある場合には、本文のようなイディオムは利用できません。 とは var msg = '';のから文字に特別な意味がある場合は下記の式は成立しないということでしょうか? msg = msg || 'こんにちは、世界!'; console.log(msg); // 結果:こんにちは、世界! また、下記はからもしくはこんにちは世界だったらという意味ですが、なんか意味がよく分かりません。 msg = msg || 'こんにちは、世界!'; JS本格入門より 返り値が0でエラーだった場合に0が帰ってくる場合は0にエラーという意味があるということでしょうか?

noname#226032
noname#226032

みんなの回答

  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.1

a = a || b というイディオムは、 aが真に評価されるならaにaを代入、つまりaをそのままにし、一方aが偽に評価されるならbを代入するというもので、 つまりは、aに真と評価されるような『有効な』値が設定されていなければ、bに初期化することを狙ったものです 特に引数において使われます。 a引数が与えられなかった場合、undefinedが与えられますから、 aの真偽値評価は偽となり、bで初期化することができ、一方もし与えられていればそのままとできるのです。 しかしこれは、偽評価の値は『有効な』値ではないという仮定に基づくものですから、そうでない場合、 例えば偽評価とされる0や空文字やfalseやnullなどに、意味があるような場合には使えません。 ただし、bにあたる初期化値をこれら自身にする場合であれば、その一つだけこの制限を緩和できます。 まあ引数であればES2015からデフォルト引数構文がありますから、このイディオムを使うような機会はかなり減りました。 古いソースを読むため以外では、もう覚えなくて良いようなことでもあります。

noname#226032
質問者

お礼

難しいですが、この質問のないようなES6があれば不要なのですね。 下記のことですか? デフォルト引数 function multiply(a, b = 1) { return a*b; } multiply(5); // 5 のように引数の()括弧内で代入を行うことで、デフォルト値を設定できる これは変数?bに1を代入することをはじめに行わなくてもいきなり引数の中で行えるようになったという事でしょうか? ただなんでaがいくつか記載していないのに5なのかは謎ですが

関連するQ&A

  • イディオムとは

    JSの参考書に下記のように記載があるのですが、 イディオムとか非常にわかりにくくて何を言っているかわからないのですが、 わかる方はいませんでしょうか? >>> ただし、空文字やゼロなど、falsyな値そのものに意味がある場合には、本文のようなイディオムは利用できません。空文字やゼロなどの値がデフォルト値(ここでは「こんにちは、世界!」)によって上書きされてしまうからです。そのような場合には、以下のように条件演算子を利用してください。 msg = (msg === undefined ? 'こんにちは、世界!' : msg); これによって、変数msgがundefined(未定義)の場合にだけ、デフォルト値が適用されます。

  • Javascript selectタグ 値 利用

    javascriptで、<select>タグの扱い方について <select>のドロップダウンで、選択されたvalue値の取得  var adrress = document.getElementById("ID名").selectedIndex;  console.log(address); これですと、ログにundefinedと表示されるのですが、selectタグにonchange="処理"(?)を入れて、その関数も定義する方法以外に、<select>のvalueの値 を、変数に格納して、利用する方法はありますでしょうか? 詳しい方回答よろしくお願い致します。

  • 変数に入っている変数の値を参照したい場合には

    var a1="123"; var a2="789"; と 変数に文字が登録されている場合、 引数として、1又は2を渡し、 1の場合にはa1を 2の場合にはa2の値を 参照することは可能ですか? switchやif文を使わずに、 別の変数に、"a"+引数を代入し、 その変数に代入されている変数を参照する というようなことは可能ですか? 意味わかりますか? すみません。 よろしくお願い致します。

  • 空の要素の文字列を取得するとnullではなくund

    空の要素の文字列を取得するとnullではなくundefinedが返ってくるのはなぜでしょうか? var history1Txt = history1.value; また値が入っていてもundefinedが返ってきます。 値が入っている時だけ新しい履歴のテキストを古い履歴にコピーして、常に履歴がサイクルするようにしたいです。 https://codepen.io/anon/pen/MVzRLa

  • 返り値の配列中の1つの値のみ受け取りたい。

    関数で、例えば配列型を返す関数oshiete()があるとします。 これを個別の関数に割り当てる場合は以下のようになります。 list($var1, $var2, $var3) = oshiete(); あるいは $vars = oshiete(); $var1 = $vars[0]; $var2 = $vars[1]; $var3 = $vars[2]; もし返ってくる配列中の値のうち、1つだけ取り出したい場合は以下のようになります。 $var1 = oshiete(); $var1 = $var1[0]; しかし、ここで2行書くのが無駄に思えて仕方がありません。 1行目の「$arr = 」に続けて、関数oshiete()の値を1つだけ取り出す方法って無いのでしょうか?「$arr = oshiete()[0];」のような書き方は駄目でした。 あと、もし2行で書く方法し無い場合、関数oshiete()が1つの値を取り出すことだけが目的で、かつそれ以降使うことが無い場合、配列を一旦変数$var1に入れて次にその変数に上書きする形で値を代入する方法は、メモリ消費量などの観点から見ると有用でしょうか?他で使わないなら別の変数名を容易するのは無駄に思えます。

    • 締切済み
    • PHP
  • javascript var

    javascript 「var」について ソースコード function hello(name){ 「var」 msg = "your name " + name; return msg; } var greet = hello("Tom"); console.log(msg); ソースコードの2行目の頭に「var」をつけるかつけないかでコンソールエラーになるか、ならないかが変わるのですが「var」をつけると何故かエラーになるのですが、その理由が分かる方いらっしゃいますか? 「var」は「バリアブル」の略で変幻自在みたいな意味だと思うのですが、それをつけてエラーになる理由が良く分からなくて質問致しました。 馬鹿な質問ですが答えて頂けると助かります。m(__)m

  • Objectの1番目の値がundefinedに

    AS3にてPHPに値を渡して、処理した結果をFLASH側に戻す処理をしています。 今回はテスト用に、値は送らずに単純に結果を返すだけのPHPを作ったのですが、1番目の値がundefinedになってしまいます。 for inで取得すると正常にすべての値が取得できるのですが、直接参照するとダメです。2番目以降の値は取得できます。 このような現象について、お心当たりございましたら、是非お願い致します。 ●flash側 import ConnectPHP; //PHPとの受け渡しを行う外部AS var connectPHP = new ConnectPHP(); connectPHP.addEventListener(ConnectPHP.COMPLETE, completeHandler); connectPHP.sendAndLoad("check.php"); function completeHandler(e:Event):void { var obj:Object = connectPHP.result; for (var i in obj) { trace(i, '=>', obj[i]); } trace(obj.a); trace(obj.b); } ●PHP側 <?php echo "a=1&b=2"; ?> ●結果 a => 1 b => 2 undefined 2 ※for のtrace結果の時に、空の2行が書き出されます。

    • ベストアンサー
    • Flash
  • undefinedかnullかどう区別できますか?

    JavaScript の教科書に下記のように記載があったのですが、 >>> ページからアンカータグを取得するgetAnchorという関数があったとします。 その際、アンカータグが見つからなかったならば、何を返すべきでしょうか。undefined(未定義)は不自然です。 今度は「該当する値がなかった(=空であった)」という値を、意図して伝えようとしているので、nullを返すべきです。 関数で値が返されなかった場合はundefinedと聞いたのですが上記はそれに該当するように私は思ってしまうのですが、なぜ違うかわかりますか? 関数で値が返されなかった場合とはalert()のように引数がなかった場合という意味でしょうか? それともretunr 変数名などのreturnがない場合という意味でしょうか?

  • Console.ReadLine()で、入力デフォルト値を指定できます

    Console.ReadLine()で、入力デフォルト値を指定できますか? C#でプログラムをつくっています。 Console.ReadLine()を使えば、コマンドプロンプト上からのキー入力を文字列として受け取れますが、最初は空の状態です。 例えば、 string s = Console.ReadLine() を実行し、Enterキーを押すと、sは何も入力されませんが、デフォルト値を指定することで、ユーザーがただEnterキーを押したときに、デフォルト値を返すような方法はありますか? また、指定したデフォルト値を画面上に表示し、ユーザーが編集できるような方法はありますでしょうか? どうぞよろしくお願いします。

  • ES6を学んでいるのですが難しいです。

    ES6を学んでいるのですが難しくて初心者にもわかるように解説していただけるとありたいです。 http://qiita.com/takeharu/items/cbbe017bbdd120015ca0 >>> 関数で複数の値を一度に返す一度に関数で複数の値を返すことができます。今まではオブジェクトや配列に代入して返していました。 function getFruit() { return ['りんご', 'バナナ'];} ES6 var [fruit1, fruit2] = getFruit(); ES5 console.log(fruit1); // りんごconsole.log(fruit2); // バナナ >>> 上記は function getFruit() { return ['りんご', 'バナナ'];} ES6 var [fruit1, fruit2] = getFruit(); ES5 ということだと思いますか? そのような説明がないのでわかりにくいですが、 ・ >>> 「...」演算子により、複数の値を一つの配列にまとめる「...」演算子を使用することにより、それ以降の値を一つの配列としてまとめることができます。 var [name, age, ...fruit] = ['ハル', 21, 'りんご', 'みかん']; console.log(name, age, fruit); // ハル 21 ['りんご', 'みかん'] また、「...」演算子を使用することにより、配列の展開もできます。 var array = [1, 2, 3]; console.log(array); // [1, 2, 3]console.log(...array); // 1 2 3 これにより今まで配列で最大値を求める場合は、applyメソッドを使用する必要がありました。しかし、展開することにより、簡潔に記述可能となります。 * Before var array = [1, 5, 3]; var max = Math.max.apply(null, array) console.log(max); // 5 * After var array = [1, 5, 3]; var max = Math.max(...array); console.log(max); // 5 >>> var max = Math.max(...array);の部分がおそらく新しいのだと思いますが、nullが...になっているというのは、 どういう意味で、どんなメリットがあるのでしょうか?

専門家に質問してみよう