- ベストアンサー
JSイディオムとは?
- JSの参考書に記載されているイディオムとは、その文脈で特定の条件を満たすために使われる一連のコードのことです。
- イディオムは、特定のケースにおいてコードの効率性や可読性を向上させるために活用されます。
- 条件演算子を用いたイディオムを例に挙げると、変数が未定義の場合にデフォルト値を設定するという処理を短縮して書くことができます。
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
> するとa=は5=にならないということのようですが、 > 同じ変数var aなのに値が違うというのは、こんがらがりますね。 左辺の変数も取り出されて置き換わるという理屈になっていると、 事前に a=5; b= 12;の状態で b = a + 1; とあったとき 12 = 5 + 1; という理屈になってしまい矛盾してしまいますよね? でも、そうでなくて、 b = a + 1; の式は aの中身の5に+1した6を bに代入している式だというのは理解できているんですよね? これと同じで、 ”右辺にある変数は、変数の中身が取り出されてから計算される” ”左辺にある変数は、変数の中身を取り出ことはしないで、その変数へ代入するだけ” であれば、 a= a + 1;は ↓ 左辺のaという変数の中身を取り出して a= 5+1; ↓ 右辺の5+1を計算して a = 6; ↓ aという変数(名札の箱)に、6という数値を格納 となって、理屈は通りますよね?
その他の回答 (9)
- superside0
- ベストアンサー率64% (461/711)
> 1は||なのでかつではないのでしょうか? || は、かつ ではなく、 または です。 && が ’かつ’ (論理積) (AND) (×) (∧) で || が、 ’または’(論理和) (OR) (+) (∨)です。 A || B と書くと、 AまたはBが真(true)のとき、結果は真という意味ですので、 つまりは、 Aが真なら、Bがなんであろうと結果は真となるので、Bは無視できます。 反対にAが偽(false)なら、B次第で、結果が変わります。 これを利用すると、 Aが真(true)なら、 Bを評価しない(無視する.実行しない) という処理が作れます。 > msgの中身かつ 'こんにちは、世界!'; > と意味が分かりません。 かつ ではなく または ですので = msgの中身 または 'こんにちは、世界!' ですね。 これで msgの中身があればそれを採用するが、msgの中身がないときは'こんにちは、世界!' を採用する という式となります。 ちなみに、 || でなく && を使うと、これが反対になります。 つまり A && B は、AとBがどちらも真のときだけ、結果が真となるので、 Aが真(true)のときは、B次第で、結果が変わりますが Aが偽(false)のときは、Bがなんであろうとも、結果は偽なので、Bは無視できます。 これを利用すると、 Aが偽(false)なら、 Bを評価しない(無視する.実行しない) という処理が作れます。 ただ、正直なところ、この書き方は 慣れないと読み難いこともあるでしょうから ifか 三項演算子で 書いたほうが見通しがよい気がしますね。 (好き嫌いの問題でしょうけど、私は避けています) ただし、JavaScriptでなくて、シェルスクリプトでは、コマンド実行の結果をifで書くと長ったらしいので コマンド || exit 1 とかいて、コマンドがエラーしたら、シェルの途中でも終了させるとか make && make test と書いて、 makeコマンドが成功したときだけ、make testを行う なんてのはよく使いますが。 > 2の?もなんの意味でしょうか? 三項演算子の構文は 【条件式】 ? 【真の場合の値や式】 : 【偽の場合の値や式】 のように、 ? の前に条件式を書いて、そのあとに、 その条件が真と偽のときの値を : で挟んで書くのが、決まり文句ですので、 この形式をまる覚えして下さい。 外側の ( ) は、三項演算子がここからこここまで、というのを明確化させています。 こちらの書き方は、、条件との関係も複雑ではないので、 1つの式の途中で 条件分けしたいときなんかによく使いますね。 たとえば、文字列の連結の途中で msg = '~の中に' + xxx + 'が' + (cnt>0? '見つかりました':'見つかりませんでした') + ' ~' ; という感じで。
- superside0
- ベストアンサー率64% (461/711)
> a = a + 1; > 5=5+1となるようにも思えるのですが、なぜ始めのaは5にならないのでしょうか? > 同じaという変数なんですよね。 数学の式とちがって、右辺と左辺で意味が違うからです。 右辺に変数があれば、その変数の中身を取り出すという意味です。 左辺は、指定された変数への代入です。 つまり、右辺は出力、左辺は入力ということですね。 たとえば、a = 5;のとき a = a + 1; とあれば、変数aの中身が取り出されるのは、右辺のみなので、 5 = 5 +1 ; でなくて a = 5 + 1; になります。 これにより、右辺の a+ 1は → 5 + 1 → 6 と 計算されたあと 左辺の a へ 右辺のこの計算結果の6を代入(入力)されます。
お礼
右辺に変数があれば、その変数の中身を取り出すという意味です。 a + 1;のaは中身を取り出すでa=は取り出すでなく右の物をだいにゅうするになるということですね。 するとa=は5=にならないということのようですが、同じ変数var aなのに値が違うというのは、 こんがらがりますね。 a + 1;のaは中身を取り出すというのも初心者にはよくわからないのですがaの中の5を取り出して5+1になるということでしょうか? 左側はaという変数なのにひだりにあるという理由でなぜか5が代入されないのですね。 理由がはっきりわかりませんが
- superside0
- ベストアンサー率64% (461/711)
> a = a + 1;だけらaの中にaを入れるのは意味が分からないといっているのです。 はやり勘違いされています。 a = a + 1; は、数学の式のように状態を示しているのではなく、式の結果を代入しているだけなのです。 まず、右辺を考えてみましょう。 a + 1 という式は、 aという変数の中身を取り出して それに + 1 しなさいという式です。 例えば、事前に a = 5; と代入していていたなら、 a + 1 の結果は 6ですよね。 最後に、 左辺の a に =で6を代入していることになります。 もちろん、この式のまえでaの値がいくつかなのかで結果は異なりますが、 かならず プラス1することには変わりません。
お礼
>>> はやり勘違いされています。 a = a + 1; は、数学の式のように状態を示しているのではなく、式の結果を代入しているだけなのです そうだったのですね私は式自体を入れていると思っていたのですが、 =の代入とは=以降をそのまま入れたのではなく、あくまで右側の処理結果を 左の変数に入れるということなのですね。 返り値を入れるであってるんですかね? returnでないものは返り値とは言わないのでしょうか? ・ var a = 5; var a = a + 1; ということですね。 5=5+1となるようにも思えるのですが、なぜ始めのaは5にならないのでしょうか? a=5+1になるからなんでしょうが、同じaという変数なんですよね。 5=5+1になるようにも思えます。 var b = a + 1; であればおっしゃっている通りだともちろんわかるのですよ。
- notnot
- ベストアンサー率47% (4900/10358)
No1です。「イディオム」という言葉の意味自体を忘れてらっしゃるとは思いませんでした。 中学の英語の時間に出てきたと思いますが、"as soon as" とか覚えませんでしたか?日本語だと「慣用句」ですが、「慣用句」と書くと日本語みたいな気がしてくるので、「イディオム」という語を意図的に使っているんだと思います。 あと、やはり買う本を間違えましたね。「JavaScript本格入門」は、プログラミングしたこと無い人がプログラミングに入門する本では無いです。JavaScriptを動画学習サイトなどで見よう見まねでやっていた人が、JavaScrptに「本格的に入門する」ための本です。なので、 foo = foo || "あいうえお"; のような記述に違和感を持つレベルの人が読む本では無いです。 「JavaScriptを使って初めてプログラミングに入門する」ような本を買って、次に今の本を読むと非常にためになると思いますよ。決して無駄にはならないと思います。
お礼
マナーもわすれていらっしゃるあなたに言われる筋合いはないですけどね。どんな教育をうけたらこんな変人になるんでしょうか???親の顔を見てみたいですね。
- superside0
- ベストアンサー率64% (461/711)
> これって変数msgの中にmsgという変数が入っているんですよね。こんなの初めて見ました。こんなロシアの人形みたいなことは許されるのですか? > 変数msgの中にmsgという変数が入っているとは、そもそも意味が初心者には分かりません。 それは、= を 数学の等号の記号の意味と誤解してしまっているからです。 = は、右辺の式を 左辺の変数に代入するという意味です。 たとえば、 aという変数がもともとあって、それに整数の1を足したいときは a = a + 1; と記述します。 (もちろん a++;とか++a; という記述方法もありますが) > これって条件式の時に使うものなのになぜifでもないのに使うのかも疑問です。 > (2) msg = (msg === undefined ? 'こんにちは、世界!' : msg);も同じようによくわかりません。 ここでは、if 以外でも if のような条件分岐をすることができますよ、と説明されている箇所でしょうから if が出てこないのも 当然でしょう。 ifを使わないで if と同じような記述をすることができるのが、三項演算子 です。 なので、 if ( msg === undefined ) { msg = 'こんにちは、世界!'; } と書いてもよいし、 msg = (msg === undefined ? 'こんにちは、世界!' : msg); と書いてもよいし、 場合によって便利な方を選べばよいです。 たとえば、 countという変数の中身が0のときは'Not Found' , 0以外のときは 'Found it'とalert表示したかったら、 if文でなら、例えば if ( count == 0 ) { alert('Not Found'); } else { alert('Found it'); } となりますが、三項演算子なら alert( count==0?'Not Found':'Found it' ); の1行で書くことができます。 > msg = msg || 'こんにちは、世界!';がイディオムと下記の人が言っていますが、そう思われますか? 「イディオム」ってプログラム用語じゃなくて、単にこの参考書の直訳ミスでしょう。 既にご回答のあった通り、”よく使われる書き方”的な意味で 使っているのでしょうから、 そんなにこだわる必要はないと思いますよ。
お礼
代入ということはもちろんわかっています。 a = a + 1;だけらaの中にaを入れるのは意味が分からないといっているのです。 イディオムは ”よくこんな書き方がありますよねという意味なのですね。”
- superside0
- ベストアンサー率64% (461/711)
ようするに (1) msg = msg || 'こんにちは、世界!'; (2) msg = (msg === undefined ? 'こんにちは、世界!' : msg); の(1)と(2)は、似たような処理をする記述方法だけれども、 もともとmsgという変数の中身が空文字やnullだったときだけは、 (1)と(2)で結果が異なるこので、 どちらを使うべきかは、ケースバイケースで使い分けましょう ということですね。 場合分けして考えると、 ・もともとmsgという変数の中身が 'あいう' といったような文字列が既に代入されている場面では (1)と(2)のどちらを使っても、msgの中身は 'あいう' のまま ・もともとmsgという変数の中身が '' (空文字)の場面なら (1)を使うと、msgの中身は 'こんにちは、世界!' で上書き (2)を使うと、msgの中身は、'' (空文字) のまま ・もともとmsgという変数がnullの場面なら (1)を使うと、msgの中身は、'こんにちは、世界!' で上書き (2)を使うと、msgの中身は、nullのまま ・もともとmsgという変数がundefined (まだ変数が存在していない) 場面なら (1)(2)のどちらを使っても、msgとういう変数を作って、中身に 'こんにちは、世界!' を代入 となります。 つまり、 その変数は既に存在しているが、その変数の中身が空文字やnullだったときに そのままにしておきたいのか、 それとも 'こんにちは、世界!'で上書きしたいのか の どちらの結果になりたいかで、(1)と(2)のどちらを使うかを使い分けしましょう。 という説明でしょう。 ※直訳されただけの参考書で、分かり難いというのは、同感です。
お礼
ご丁寧にありがとうございます。 もともとmsgという変数の中身が空文字やnullだったときだけは、 (1)と(2)で結果が異なるこので、 どちらを使うべきかは、ケースバイケースで使い分けましょう ということですね。 1.2の中身が何か決まっておらず、中身が空だったり、文字列だったり中身をいろいろと変えてみると、 結果が変わってきますよということを言いたいということなのですね。 ただ初心者で恐縮ですが下記の式の意味がどうもいまいちわかりません。 (1) msg = msg || 'こんにちは、世界!'; これって変数msgの中にmsgという変数が入っているんですよね。こんなの初めて見ました。こんなロシアの人形みたいなことは許されるのですか? 変数msgの中にmsgという変数が入っているとは、そもそも意味が初心者には分かりません。 msg || 'こんにちは、世界!'; とはmsg もしくは 'こんにちは、世界!';だったらということですよね。 これって条件式の時に使うものなのになぜifでもないのに使うのかも疑問です。 (2) msg = (msg === undefined ? 'こんにちは、世界!' : msg); も同じようによくわかりません。 ・ msg = msg || 'こんにちは、世界!';がイディオムと下記の人が言っていますが、そう思われますか? その判断理由を教えてもらえませんか?
- titokani
- ベストアンサー率19% (341/1726)
>上記のこんにちは、世界のことの気がしますが、 「こんにちは、世界」はデフォルト値です。 ここで書かれている「本文のようなイディオム」とは、 msg = msg || 'こんにちは、世界!'; この行全体ですね。 >お金をはらわせて買った本で入門と書いてあるわけなので、 >あえて難しい英語を使う必要性はないと思いますけどね。 英語から翻訳された本なのでしょうか? なんとなく、翻訳の質が低いのかなという印象です。
お礼
[改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで] という本なのですが、本当にわかりにくいです。 なんでわざわざ難しいカタカナを使うんだろうと、とても入門書ではないです。 msg = msg || 'こんにちは、世界!';がイディオムなようですが、 その判断理由を教えてもらえませんか? 結局わかりやすく日本語で言うとイディオムとはなんという意味なのでしょうか?
- Gotthold
- ベストアンサー率47% (396/832)
イディオムは慣用句(慣用的に使われるコード)のことです。 > 本文のようなイディオムは利用できません。 > のイデオムとはこんにちは、世界!」という文字列のことですか? 文脈からすると「本文のようなイディオム」はあなたが引用した文章の中には存在しません。 あなたが引用した文章より前に出現しているはずです。 本文のような、という言い回しからしてこの文章自体は本文ではなく注釈だったりしませんか? その場合は本文の注釈が付けられている辺りに書かれているはずです。 > もっと初心者にもわかるように解説していただけるとありがたいです。 「本文のようなイディオム」が何をさしているのか分からないというのは日本語の読解力の問題で 初心者かどうか関係ないです。 分からない単語があって混乱したのだとは思いますが、とりあえず落ちついて辞書を引いてみましょう。 イディオム【idiom】の意味 - goo国語辞書 http://dictionary.goo.ne.jp/jn/13820/meaning/m0u/
お礼
var msg = ''; msg = msg || 'こんにちは、世界!'; console.log(msg); // 結果:こんにちは、世界! 変数msgがfalsyな値──空文字列などの場合に、デフォルト値として「こんにちは、世界!」を代入します。 注釈はありません。 上記のこんにちは、世界のことの気がしますが、 お金をはらわせて買った本で入門と書いてあるわけなので、 あえて難しい英語を使う必要性はないと思いますけどね。
- notnot
- ベストアンサー率47% (4900/10358)
変数が未定義なら、デフォルト値を代入すると言うことです。 そのやり方に、「本文のような短い書き方」と、「三項演算子を使った長い書き方」の2通りあると言うことです。 参考書の意味がわからない部分が何カ所かあるようなら、もっと易しい参考書に変えた方が良いと思いますよ。
お礼
本文のようなイディオムは利用できません。 のイデオムとはこんにちは、世界!」という文字列のことですか? このような長い文字列は使えないということですか? もっと初心者にもわかるように解説していただけるとありがたいです。
お礼
ありがとうございました。 >>> b = a + 1; の式はb=6になると思っていたのですが、そうではなく下記と一緒ということですね。 var b = 10 var b = 1 bの中身は1に上書きされたので、結果1が入っているということと一緒ということなのですね。 やっとわかりました。 var b = a+1も上記の変数上書きと同じで上書きされているということなのですね。 var b = 10 var b = a+1 b = a + 1;は変数bにa+1の処理結果が代入されるということですね。 するとconstだと再代入不可なので、 const b = 10 const b = a+1 の下側はエラーになるんでしょうね。
補足
>>> (1) msg = msg || 'こんにちは、世界!'; (2) msg = (msg === undefined ? 'こんにちは、世界!' : msg); 上記二つは一見同じに見えるが、若干違いがあるので使い分けましょうという意味だということはおかげさまでわかったのですが、 1は||なのでかつではないのでしょうか? msgの中身かつ 'こんにちは、世界!'; と意味が分かりません。 2の?もなんの意味でしょうか?