のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,062,853人
昨日:no data人
今日:
最近の注目
人気の最安値情報

    私的良スレ書庫

    不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitter
    ログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。

    元スレ+ JavaScript の質問用スレッド vol.128 +

    JavaScript スレッド一覧へ / JavaScript とは? / 携帯版 / dat(gz)で取得 / トップメニュー
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
    レスフィルター : (試験中)
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter
    101 : Name_Not - 2016/02/03(水) 19:09:25.65 ID:???.net (+62,+29,-157)
    もっと言うと大体の変数はconstで書ける
    自分も人に見せるような気分でコードを書くときは最近は全部constで書く。

    別にvarでもいいが、constで書けるとこなら、const使ったほうが情報量が増えて好き。
    逆に嫌いな点は文字数が多いところ。
    そして、for文などconstが使いようのない場所でletを使うという感覚だ。

    一方適当にコードを試したりするときは基本的にletを使う。
    ただしletを用いてコンソールで遊ぶと、再実行時に二重定義エラーとなるのが嫌い。
    とは言え、レガシーなイメージのあるvarを使うのも楽しくない。
    102 : Name_Not - 2016/02/03(水) 19:11:08.45 ID:???.net (+94,+29,-88)
    変数の数が減るかどうかは別としてもスコープを最小限に抑える事自体は正しい設計だよね
    頭のメモリ領域も削減してストレスフリーなコーディングをしたい
    103 : Name_Not - 2016/02/03(水) 19:19:28.46 ID:???.net (+57,+29,-85)
    まあなんとも言えん。
    全て関数スコープというのもある意味ではシンプルでスマートであり、
    複雑なスコープを関数内で使う必要もないとも言えるのかもしれないと思わないこともなくない。
    104 : Name_Not - 2016/02/03(水) 19:20:54.86 ID:???.net (+11,-30,-279)
    >>100
    var の初期化処理は巻き上げられて関数初頭で undefined で初期化される
    let はブロックスコープだが、巻き上げられないという性質がある
    だから、var を使う場合は undefined で巻き上げられても正常に動作するようにアルゴリズムを考慮する必要がある
    http://bonsaiden.github.io/JavaScript-Garden/ja/#function.general

    function hoge () {
     console.log(a); // undefined
     console.log(b); // ReferenceError: b is not defined
     var a = 1;
     let b = 2;
    }
    hoge();

    巻き上げ(hoisting)を知っている人は関数初頭でvarで初期化するコードを書く人もいる(賛否両論はある)

    function hoge () {
     var a;
     console.log(a); // undefined
     a = 1;
    }

    一般には let の挙動の方が直感的でバグを発見しやすくて良いと評価される
    105 : Name_Not - 2016/02/03(水) 19:29:57.47 ID:???.net (+75,+29,-95)
    >>102
    スコープを最小限にする事は言語を問わず、プログラミング全般で大原則
    ES5に浸りきったプログラマが今からブロックスコープを習得するのは敷居が高いと感じる向きもあって一部で反感を買っているようだが
    http://www.google.co.jp/search?ie=UTF-8&q=%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%20%E6%9C%80%E5%B0%8F%E9%99%90
    106 : Name_Not - 2016/02/03(水) 19:43:50.60 ID:???.net (+89,+27,-29)
    ハードルが高い?
    ただ単にvarをletに置き換えれば済むことが99%だろう。
    だれもvarでしか出来ない挙動の活用に慣れ親しんでる人はいないと思う。
    107 : Name_Not - 2016/02/03(水) 19:56:51.78 ID:???.net (+72,+29,-30)
    >>106
    いや、俺自身はハードルの高さを感じないのだが、>>77,81辺りがletを使いこなせないが為にvarに拘っているように見えてね
    108 : Name_Not - 2016/02/03(水) 20:03:50.37 ID:???.net (+55,+27,-3)
    let使ってるからってあえて同じ変数名にするのはどうかと思うけどな
    109 : Name_Not - 2016/02/03(水) 20:11:06.97 ID:???.net (+57,+29,-57)
    あえて衝突させる事で実体化する変数の数を減らすテクニックとか普通に使わん?
    ブロックスコープどころか関数スコープでも変数名を衝突させる事は良くあるんだが
    110 : Name_Not - 2016/02/03(水) 20:18:19.77 ID:???.net (+57,+29,-44)
    forループでね
    インデントされてるからこそわかるけど
    注意深くみないとどっちのiを参照してるのかわからないようなコードは好ましくないと個人的に思う
    111 : Name_Not - 2016/02/03(水) 20:39:27.35 ID:???.net (+57,+29,-48)
    なるほど、俺はもう慣れたし、必要ないのに上位スコープのループ変数iを参照可能なコードが美しくないと感じてしまうな
    感覚の違いか…
    112 : Name_Not - 2016/02/03(水) 20:46:59.18 ID:???.net (+62,+29,-60)
    実際のところどちらでも良いケースが殆どなのだから
    「必要ないのに~」という論はどちらに慣れてるのかということでしか無い
    varに慣れていればletは特殊な場合でしか必要ないように見えるし、逆もまた然り
    113 : Name_Not - 2016/02/03(水) 20:54:11.79 ID:???.net (+93,+29,-48)
    どちらでも良いならletを使わない理由が特にないな
    hoistingしないし、スコープは最小限に抑えられるし、メリットしかない
    114 : Name_Not - 2016/02/03(水) 20:54:13.37 ID:???.net (+57,+29,-6)
    letが使えるならいくらでも使うが、ブラウザの対応が揃ってないので使ったことないわ
    115 : Name_Not - 2016/02/03(水) 20:57:17.74 ID:???.net (+109,+29,-106)
    >>113
    巻き上げが必ずしも悪いというものでもないし、
    スコープは最小限に抑えられるが有効なスコープの数は自体は増えるだろう。
    実際各エンジンではまだ最適化しきれておらず、for-letのパフォーマンスが悪い。
    だから自作のゲームAIエンジンでは泣く泣くvarを使ってる。
    116 : Name_Not - 2016/02/03(水) 21:04:16.84 ID:???.net (+72,+29,-38)
    >>115
    パフォーマンス問題は良く聞くし理解できるけど、

    > 巻き上げが必ずしも悪いというものでもないし、
    ここが分からない
    117 : Name_Not - 2016/02/03(水) 21:13:49.04 ID:???.net (+0,-28,-35)
    まあ変数宣言以前がundefiendとTDZ、どちらが自然かというのを決めるのは難しいかもな
    118 : Name_Not - 2016/02/03(水) 21:14:38.27 ID:???.net (-1,-19,+0)
    typo
    119 : Name_Not - 2016/02/03(水) 21:21:39.75 ID:???.net (+67,+29,-47)
    無名関数って複数の処理を行った結果が欲しいけど、
    1度しか使わないのでわざわざ関数にする必要がないようなときに使うもんですよね?
    120 : Name_Not - 2016/02/03(水) 21:24:05.44 ID:???.net (+99,+29,-84)
    いや、巻き上げ処理が自然に感じるかという感覚の問題じゃなくてね
    巻き上げが発生する事によるメリットが何もなくてデメリットしかないと自分は思うんだ
    変数文より手前で変数をundefinedとして評価したいケースが全く思いつかない
    それなら間違って評価しないように変数文より前で評価した時にReferenceErrorにした方が親切だと思う
    121 : Name_Not - 2016/02/03(水) 21:24:52.65 ID:???.net (+148,+29,-40)
    それは即時関数や狭義のクロージャで、無名関数の使われ方の一部。
    もっと一般的に言うと、関数を数値や文字列等と同列に値として扱いたい時で、
    名前は必要ないときに使う。
    122 : 119 - 2016/02/03(水) 21:26:23.42 ID:???.net (+97,+22,+0)
    >>121
    ありがとう!参考になります
    123 : Name_Not - 2016/02/03(水) 21:28:20.20 ID:???.net (+117,+29,-73)
    >>120
    その厳しさはブロックスコープだからこそ自然に映えるものだと思う
    関数スコープしかない世界で考えると、例えばfor(var iと数カ所に書いても動いて欲しいし、
    コードの順序を入れ替えたりしても気軽にエラーになってほしくも無いだろう
    124 : Name_Not - 2016/02/03(水) 21:35:54.11 ID:???.net (+14,-29,-54)
    >>123
    ごめん、何を言いたいのかわからない

    > for(var iと数カ所に書いても動いて欲しい
    let にしても動くよね?

    > コードの順序を入れ替えたりしても気軽にエラーになってほしくも無いだろう
    具体的にコードで書くと?
    125 : Name_Not - 2016/02/03(水) 21:37:24.37 ID:???.net (+131,-30,-62)
    ひょっとしてこういうこと?
    悪いけど、エラーにならないのが気持ち悪いコードだ

    'use strict';
    for(var i = 0; i < 9; ++i);
    for(i = 0; i < 9; ++i);
     ↓
    'use strict';
    for(i = 0; i < 9; ++i);
    for(var i = 0; i < 9; ++i);
    126 : Name_Not - 2016/02/03(水) 21:39:41.83 ID:???.net (+32,+23,-5)
    >>125
    デメリットは?
    気持ち悪いのがデメリット?
    127 : Name_Not - 2016/02/03(水) 21:42:02.91 ID:???.net (+77,-30,-92)
    >>126
    for(i = 0; i < 9; ++i); だけ見たらグローバル変数を宣言しているように見えて
    for(var i = 0; i < 9; ++i); を見て初めてhoistingしたローカル変数だと理解できる
    そもそも、これは両方とも var i すればいいし、わざわざ var を省く理由もない
    コードを入れ替えても何の問題もない
    hoistingするメリットが全く無い
    128 : Name_Not - 2016/02/03(水) 21:45:12.96 ID:???.net (+96,+29,-51)
    メリットとかの話ではなく、重複宣言でエラーにならないというのと、
    その重複宣言がより必要な関数スコープというのと、
    巻き上げで最初からundefinedで宣言されるという性質はセット。
    129 : Name_Not - 2016/02/03(水) 21:46:03.28 ID:???.net (+107,+29,-2)
    >>123は俺もよくわからん、解説してくれ
    130 : Name_Not - 2016/02/03(水) 21:47:25.08 ID:???.net (+71,+29,-3)
    >>129こういうこと>>125
    で、こういうこと>>127にはこういうこと>>128
    131 : Name_Not - 2016/02/03(水) 21:49:32.06 ID:???.net (+43,-30,-186)
    横からだけど、varを有用に使ってるコードを思い出した。

    <script src="script.js"></script>
    <script>
    var foo = foo || {};
    alert(a);
    </script>

    一つ目の<script>で読み込まれるscript.jsには、変数fooにオブジェクトを代入するコード(var foo = ...)が書いてある。
    けど、script.jsが正しく読み込まれる保証はない。

    二つ目の<script>は、
    一つ目の<script>がちゃんと読み込まれていれば、その読み込んだfooを用いて、
    一つ目の<script>が読み込まれていなければfooに初期値{}を代入する、
    というコード。
    132 : Name_Not - 2016/02/03(水) 21:52:54.48 ID:???.net (+48,+15,-31)
    >>126
    重複宣言と巻き上げがなぜセットなの?
    変数文が呼び出された時点で重複していたら再初期化するように仕様を組めばhoistingする必要がないと思うけど
    133 : Name_Not - 2016/02/03(水) 21:57:40.16 ID:???.net (+62,+29,-54)
    そりゃ無数の要素の組み合わせが考えられるが、
    「エラーにならない」という許さのバランス上そういう組み合わせであるのが自然であるということ。
    例えば、重複はOKだけどTDZがあるとか変だし、
    TDZが無いということで、undefinedになるというのなら自然
    134 : Name_Not - 2016/02/03(水) 22:01:43.19 ID:???.net (+57,+29,-5)
    変数の重複不許可の方がデバッグしやすくていい気がしてきた
    135 : Name_Not - 2016/02/03(水) 22:04:34.91 ID:???.net (+19,-30,-112)
    まあ、重複不許可ならこんなコードではまる事も無いよな

    /* グローバルコード */
    var name = ['Ken', 'Alice', 'Vega'];
    console.log(name); // "Ken,Alice,Vega"
    136 : Name_Not - 2016/02/03(水) 22:05:46.11 ID:???.net (+57,+29,-10)
    だがしかしそれだとvarを最初に纏めるスタイルに限定されてしまうということか
    137 : Name_Not - 2016/02/03(水) 22:08:57.01 ID:???.net (+56,+28,-10)
    いや、彼の言葉を信じるなら重複不許可ならTDZが使えるからhoistingが発生しないんじゃないか?
    JavaScriptはもっと厳しくしてもいい
    138 : Name_Not - 2016/02/03(水) 22:15:08.40 ID:???.net (+0,-28,-34)
    varの挙動を変える必要はないと思う。
    もしあるならstrict mode導入時に変わっているはず。
    139 : Name_Not - 2016/02/03(水) 22:15:22.65 ID:???.net (+66,+29,-11)
    ぶっちゃけ、重複許可するメリットがわからなくなった
    >>131はメリットといえなくもないけど、RererenceErrorになるならそっちの方が自然な気もする
    140 : Name_Not - 2016/02/03(水) 22:18:06.53 ID:???.net (+24,-5,-21)
    >>135は let にするとブロックスコープ化して期待通りに動作するな
    let すげえいい
    141 : Name_Not - 2016/02/03(水) 22:19:26.54 ID:???.net (+10,-29,-17)
    >>139
    for(var iと書きたい。
    殆どそれに尽きるんじゃね?
    142 : Name_Not - 2016/02/03(水) 22:24:52.93 ID:???.net (+0,-29,-17)
    >>141
    for(var j;...)と変数名を変えればいいからそれ程問題ないと考えを変えた
    それよりも変数名が衝突した時にエラーにならずに気が付かないデメリットが痛い
    143 : Name_Not - 2016/02/03(水) 22:32:23.18 ID:???.net (+91,+29,-43)
    そうか?
    グローバルにやたらめったら定義したり、よほど関数内管理しきれない能力じゃなければ
    変数名の衝突で困ることなんて非常に稀なケースだと思うけどな。
    144 : Name_Not - 2016/02/03(水) 22:36:57.84 ID:???.net (+53,+25,-16)
    letが良いのは分かったけど、じゃあconstの方がもっと良いの?
    145 : Name_Not - 2016/02/03(水) 22:56:42.49 ID:???.net (+70,+29,-27)
    >>143
    衝突が滅多に起きないのは同意だけど、衝突が起きた時に気が付く方がデバッグしやすい
    146 : Name_Not - 2016/02/04(木) 00:10:25.88 ID:???.net (+56,+28,-8)
    制限が緩いのがJavaScriptの魅力じゃないのか
    147 : Name_Not - 2016/02/04(木) 00:10:49.00 ID:???.net (+36,-30,-120)
    入力した文字列から秒数を求める関数を作りたいのですが、正規表現の後方参照で出来ないでしょうか?

    '3h50m32s' → 3 * 3600 + 50 * 60 + 32
    '30m10s' → 30 * 60 + 10
    '1時間3分' → 1 * 3600 + 3 * 60

    自分でやろうとすると置換してevalとか、indexOfで指定位置検索して
    手前の数字を抜き出したりとかになってしまいそうです><

    ちなみに↓みたいな感じで作ろうとしてるんですが、何か根本
    的に間違っておりますでしょうか?

    str.match((\d+)h(\d+)m(\d+)s);
    148 : Name_Not - 2016/02/04(木) 00:17:48.91 ID:???.net (+69,+29,-32)
    >>147
    それで出来てるじゃない
    「手前の数字を抜き出したりとかになってしまいそうです」とか言う前に試行錯誤しなさい
    149 : Name_Not - 2016/02/04(木) 00:34:31.89 ID:???.net (+16,-30,-100)
    >>148
    すいません、1番目の入力だとIndexの1に時間2に分3に秒が入って
    上手く機能するんですが2番目だとnullになるので、hやm等特定の
    ものが無くても上手く機能してすっきり書ける方法がないかなと

    //1番目
    var str1 = '1h30m10s'
    str1 = str1.match(/(\d+)h(\d+)m(\d+)s/);

    //2番目
    var str2 = '30m10s'
    str2 = str2.match(/(\d+)h(\d+)m(\d+)s/);
    150 : Name_Not - 2016/02/04(木) 00:43:44.58 ID:???.net (+59,+24,-10)
    30m10sも1時間3分も許容する必要なんてあるの?
    本当はもっと限定的でいいはず。
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript スレッド一覧へ
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

    類似してるかもしれないスレッド


    トップメニューへ / →のくす牧場書庫について