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

私的良スレ書庫

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

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

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
901 : Name_Not - 2011/07/17(日) 22:51:12.82 ID:??? (+44,+30,-178)
>>900
説明ってのは、説明して理解できる人にならば簡単だが、
そこまで達してない人には非常に困難なものなわけで。

ここまでのやりとりで、既に「とことん低いところだなぁ」としか見えてないわけよ。
「undefined変数なんて使うのは普通に不用心なだけで、だからどうという話でもない」
なんて平気で書いちゃうとなれば、いかに経験不足なのかは自ずと知れる。
そのレベルに合わせるために、できる限りリアルのたとえ話に置き換えてきたし。
ぶっちゃけると、分かるレベルまで引き落として説明できる自身がないw 教師じゃないんでね。

undefinedを使うのが無用心。笑い話すぎるが、反論できるかい?
はっきり言っておくぞ。この1行は、俺は上からモノを言ってる。
俺の上からモノを見て言ってるつもりなら、とりあえずまともな反論見せてくれ。
それで少なくとも上下が分かると思うぞ。
902 : Name_Not - 2011/07/17(日) 22:53:13.71 ID:??? (+16,+28,-12)
湧いてるなぁ
903 : Name_Not - 2011/07/17(日) 22:56:32.19 ID:??? (+27,+29,-21)
上から物をいってたら議論にならないのは明白だな
904 : Name_Not - 2011/07/17(日) 23:09:07.08 ID:??? (+36,+30,-101)
>>901
> そのレベルに合わせるために、できる限りリアルのたとえ話に置き換えてきたし
あー、頼むから『リアルのたとえ話』ではなく「リアルのコード」で説明してもらえると助かる

> undefinedを使うのが無用心
んー、お前がundefinedをどう使ってるのか「リアルのコード」で見せてもらえんかのう

で、順番としてまず「お前の反論」が先な、道交法はしっかり守ろう
905 : Name_Not - 2011/07/17(日) 23:31:17.08 ID:??? (+27,+29,-42)
極力他人のコードに干渉しないようにクールなコーディングをすればいいだけでしょ?
いつまで喧嘩してんの?
906 : Name_Not - 2011/07/17(日) 23:36:00.99 ID:??? (+27,+29,-51)
そうなんだが、コーディングそっちのけで上下関係にこだわるゴリラがいる
適当なメスにでもマウントしとけっての
907 : Name_Not - 2011/07/17(日) 23:42:02.49 ID:??? (+27,+29,-4)
議論は構わんのだがIDか名前を出してくれんかのう
908 : Name_Not - 2011/07/17(日) 23:48:41.56 ID:??? (-16,-30,+0)
>>904
ああそう。じゃ、先に。


あるデータを別の形式に変換するクラスを設計するとする。とりあえず myConv にでもしておく。
このクラスには set と get メソッドがあって、AAA・BBB・CCC...という複数の形式のデータを受け取って、
任意の形式で返すことにする。

// AAA 形式のデータ data1 を BBB形式にする
var obj = myConv();
obj.set(data1, "AAA");
var data2 = obj.get("BBB");

こういうデータ変換クラスを使うと、特定の形式への変換が多くなるのはよくあることだから、
setやgetに対して引数で形式を指定しなかった場合、デフォルトで AAA 形式を指定したものとなるように仕様変更する。
そうするとsetやgetの内部では、2つの実装方法が考えられる。
1つは arguments.length を見る方法。もう1つは形式であるべき引数がundefinedであるかどうか。
まあ、これだけなら arguments.length を見た方が確実だろう。

追加の仕様変更として、そもそも形式名は特定の文字列なのだから、
形式名をそのままメソッドにして、setやgetを引数に応じて呼び出せたら便利だという要望がきたとする。
つまり data2 = obj.set(data1, "AAA").get("BBB"); は data2 = obj.AAA(data1).BBB(); と書けた方が楽だと。
形式名メソッドの実装は、arguments.lengthを見て、setかgetを区別してそれぞれ呼び出せばそれで済む。
909 : Name_Not - 2011/07/17(日) 23:49:55.55 ID:??? (-23,-30,+0)
さて、さらなる仕様変更として、形式FFFの対応を要求されたとする。
形式FFFは引数にdataだけではなく、もう1つ別のパラメータを受け取る可能性がある。
とりあえず -10 <= param <= 10 となる整数とする。
FFFの呼び出しは obj.set(data1, "FFF", param); data2 = obj.get("FFF", param); となる。
形式名メソッドなら obj.FFF(data1, param); data2 = FFF(param);
これも形式名同様に、省略されたら特定の値をデフォルトとして使いたいとする。

こうなると、arguments.length を見るだけで区別しようとするのはむしろやっかいになってくるのが分かる。
この上さらに、形式GGGを実装し、パラメータを2つ受け取る可能性があり、それぞれデフォルト値がある、
なんてことになると、分岐はいくらでも複雑になる。パっと見では手がつけられないスパゲッティの素となる素質十分。

ここで最初の設計に戻って、そもそもundefinedであるか否かで判断するように仕様変更してしまうと、
この複雑さは全て解消される。


ここまで読んで「パラメータを全部1つのハッシュで指定すればいい」という考え方を持ってる人も出るだろうけど、
それだと obj.set({ data : data1, type : "FFF" /* param指定なし */ }).get({ type : "GGG", param1 : 2, param2 : 3 }); は読めても、
obj.FFF({ data : data1 }).GGG({ data : null, param1 : 2, param2 : 3 }); なんてやられた場合に判断がやっかいになるし、
そもそも形式名でメソッドを作って短縮形にするのは、短く単純に書きたいのだから、obj.FFF(data1).GGG(2, 3); の方が見通しがよく、
クラス利用者のタイプ量も少なくなる。
910 : Name_Not - 2011/07/17(日) 23:50:55.46 ID:??? (+33,+30,-117)
できるだけ小さな例で説明するように頑張ってはみたが、そもそもundefinedを有効利用できるのは、
引数の処理部分が複雑になってくる辺りからだから、どうしても小さな例では説明しきれなかった。

だが、こんな感じで、指定されなかった引数をundefinedで判断することで大きく見通しがよくなるパターンというものが
ちゃんと存在するのは間違いない。大きなプログラムになればなるほど、そういう箇所が増えてくる。


この程度のことも思いつけないのならば、今までずっと小さなプログラムで満足して、価値を知る機会がなかったってことだろうよ。
だからあんな笑い話を平気で書いてしまう。
911 : 900,904 - 2011/07/18(月) 00:00:33.87 ID:??? (+39,+30,-93)
>>908-910
そこは俺の「イベント関連の手法」に対する反論を書くところだろ……
まあいいや、イベント関連の俺の主張に瑕疵はなかったということでで良いんだな?
この議論はこれで終わり、と。

で、undefined に関してだな

> undefinedであるか否かで判断するように
うん、そうだね
それをどうやって判定するの?と聞いていたのよー

あんた、ホントに議論が下手だなあ
912 : Name_Not - 2011/07/18(月) 00:39:20.07 ID:??? (-26,-30,-188)
mousemoveで構造にかかわらず対象の範囲内でドラッグされれば移動するクールな方法はありますか?
たとえば<div id = "xxx">[<p>とか<div>とか状況によって変わり、<div>の中にさらに<div>など階層も変わる]</div>で囲まれている
今はgetElementById("xxx")でaddEventListener or attachEventをセットして
eventが役に立ちそうにもないのでdocument.getElementById("xxx").style.leftで直接要素指定してleftとtopの値を変えている
913 : Name_Not - 2011/07/18(月) 00:49:11.86 ID:??? (-24,-25,-48)
>>862

>誰かがdocument.body.innerHTMLに丸ごと干渉するコード、
のくだりは、ユーザースクリプトを作る上では正しいと思うけどな。
サーバー側で実装するなら好きにしろという感じ。
914 : Name_Not - 2011/07/18(月) 04:18:59.37 ID:??? (+27,+29,-45)
jQueryだか何だかよく解らないのですが
たまーにサイトで背景が電気を消したみたいに黒くなって
YES or NO みたいなの出るヤツがありますが、アレ知ってる人います?
915 : Name_Not - 2011/07/18(月) 04:31:18.97 ID:??? (+5,+7,-1)
ライトボックスっつーライブラリ
916 : Name_Not - 2011/07/18(月) 05:54:29.43 ID:??? (+36,+30,-97)
>イベント関連の俺の主張に瑕疵はなかったということでで良いんだな?

よくねえよ。日本語読めよ。

>説明ってのは、説明して理解できる人にならば簡単だが、
>そこまで達してない人には非常に困難なものなわけで。



>既に「とことん低いところだなぁ」としか見えてないわけよ。

なんだよ。

お前に説明できるレベルまで落として書こうにも、
if (変数 === undefined) すら理解してないレベルの奴に、
どう考えても5レスじゃ納まらない量の、お前がずっと要求している
サンプルコード書く気力がないよ。
917 : Name_Not - 2011/07/18(月) 06:00:17.37 ID:??? (+28,+29,+0)
>>915
おお、これでした
ありがとうございます
918 : Name_Not - 2011/07/18(月) 06:29:03.96 ID:??? (+7,+14,-15)
>>912
よくわからないからサンプルコードを掲示して
919 : 911 - 2011/07/18(月) 06:55:13.76 ID:??? (+32,+28,-115)
>>916
>if (変数 === undefined)
よし、やっとこれが出てきたな
でだ、undefined=1される危険性を知りながらtypeofもvoidも使わないのは何故だ?
また、>>909の例なら==nullでも十分だが、「わざわざ危ない橋を渡っている」理由は何だ?

そして、あんたの日本語読解力のために言っておくが、俺はundefined「変数」を問題視していることを確認せよ
920 : Name_Not - 2011/07/18(月) 08:27:50.62 ID:??? (+23,+30,+0)
>でだ、undefined=1される危険性を知りながら

そんなもん単純だろうってか、もう何度も書いてるじゃねーかーーーーーーー!(苦笑)

「そんなもんを気にするようなバカげたコード書く奴は頭冷やせ。
JavaScriptの実行環境は、言語が安全な提供を保証するべきことまで簡単にブチ壊せる。
カギのかかってない倉庫だ。誰もが簡単に道具を持ち出し、偽の道具を置くことだってできる。
そこを気にするヒマがあったら、そうならないよう注意深くコードを書くことを周知徹底しろ」

これだけの話だ。

大きなプログラムになるほど他者のコードと干渉するかもしれない部分が増えてくる。
極力干渉しないコーディングをすることだけに注力するとしても、どれだけ努力してもまだ足りない。
くだらない誤魔化しテクで醜いコード書いて自惚れるようなチャチなプログラマがいても別にかまわんが、
それを知ったかして他人に広めようとすんな。
変数が undefined であることを比較するなら変数 === undefined が最もわかりやすい。
こういうところをバカげたくだらないテクニックでコーディングする奴は
極力干渉しないコーディングをすることだけに注力することが全くわかってない。
921 : Name_Not - 2011/07/18(月) 08:29:00.36 ID:??? (-21,-30,-107)
>>912
例えば、イベントターゲットがセレクタ #HOGE ~ div #xxx の文脈にあるか調べる
function handleEvent(e) {
 for (var context = [], n = e.target; n; n = n.parentNode)
 if (n.id === 'xxx') for (context.push(n); n = n.previousSibling; )
 if (n.nodeName === 'DIV') for (context.push(n); n = n.parentNode)
 if (n.id === 'HOGE') {
  context.push(n);
  context.reverse(); // 0=#HOGE, 1=div, 2=#xxx
 }
}
922 : 921 - 2011/07/18(月) 08:33:19.54 ID:??? (+32,+29,-107)
セレクタの後方から順に、上方探索と前方探索でマッチングを行う
これはCSSの結合子仕様に書かれている方法で、各単純セレクタにマッチしたものも全部わかる

このマッチング自体は、どのノードでイベントを監視するかに左右されない
documentだろうがdivだろうが#xxx自身だろうが、全く同じ文脈マッチングを適用できる
イベントデリゲーションが嫌でも、どうせ文脈確認は必要になってくるだろうから
924 : think49 - 2011/07/18(月) 08:56:51.75 ID:??? (-29,-30,+0)
undefined は [[Writable]]: false なので ES5 を実装しているブラウザなら書き換え不可能です。Fx5 はこの規定に従っているようですね。
http://es5.github.com/#x15.1.1.3

undefined = 1; // 評価値は1
undefined; // 評価値はundefined (書き換えられてない)

書き換え可能な実装に対しては undefind を初期化し直すか、ローカル変数 undefind を定義すればいいのでは?

(function () {
 if (typeof undefind !== 'undefined') { // undefined でなければ undefined で初期化し直す
  undefind = void 0;
 }
})();

function の中を複数人で共有しているなら「undefined を書き換えない」というコーディング規約をあらかじめ取り決めておくのが普通だと思います。
925 : Name_Not - 2011/07/18(月) 09:04:16.23 ID:??? (+32,+30,-72)
>>920
もう一度言うが、「手法」の話に対して「価値観」で反論すんな
この意味は分かってるか? 分かってないんだろうが、まあいい、次

と行こうと思ったら、>>924に先書かれちまったよ
まあつまり、undefinedを書き換えられる心配なんぞ、するだけ無駄ってこったよ
926 : Name_Not - 2011/07/18(月) 09:09:40.34 ID:??? (-21,-29,-64)
おっと、>>925は俺(>>911,>>919)な

ついでだが、『大きなプログラム』ならプリミティブの数値・文字列・真偽値と
オブジェクトのNumber、String、Booleanとを区別する判定が必要になることも多い
何だかんだでtypeofは使うことになるんだがな
927 : ssig33 - 2011/07/18(月) 09:17:13.12 ID:??? (+27,+29,-33)
くだらない論議かましてる割に
生産性にかけてるなあお前ら
928 : ssig33 - 2011/07/18(月) 09:18:37.76 ID:??? (-22,-20,+0)
rubykaigiすらでてないとか本当にかわいそうだなあ
かわいそう
929 : Name_Not - 2011/07/18(月) 09:22:55.50 ID:??? (+17,+24,+0)
ここは Ruby スレじゃないよね
930 : ssig33 - 2011/07/18(月) 09:24:20.81 ID:??? (+27,+29,-34)
別に関係なくないかあ?
だってお前らもRuby使ってんだろ
jsの連中もきてたが、ああ お前らはステルスアマノの腰ぎんちゃくかあ。
931 : ssig33 - 2011/07/18(月) 09:33:34.94 ID:??? (+27,+29,-3)
まあ地方の愚民どもはrubykaigi出れなくて当たり前だよな
カントー地方くらいか東京周辺
お前たちってある意味悲惨だよね
932 : Name_Not - 2011/07/18(月) 09:34:12.58 ID:??? (-10,+1,-1)
可哀想な人…
934 : ssig33 - 2011/07/18(月) 10:28:50.09 ID:??? (+27,+29,-8)
それ昭和スタイルじゃん
時代遅れ
いまさらRubyくらい使える用紙他方がいいんじゃないかな
936 : Name_Not - 2011/07/18(月) 10:36:05.98 ID:??? (-28,-21,-1)
>>935
俺もよくそのtypoするわw
938 : ssig33 - 2011/07/18(月) 10:40:06.58 ID:??? (+22,+29,-15)
なんだこのクソコテ
ぶっこ すぞ
940 : Name_Not - 2011/07/18(月) 12:45:51.87 ID:??? (+27,+29,-46)
こいけりくwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwww

こいけりくが2chwwwwwwwwwwww
wwwwwwww
ww
おい、小池いい加減にしろよ小池wwwwwwぶっとばすぞ小池
941 : Name_Not - 2011/07/18(月) 12:49:31.90 ID:??? (+26,+29,-89)
ssig33=小池陸

http://twitter.com/ssig33

真性キチガイのRuby使い(rails)

Rubykaigiのトイレで、親指の腐った肉を洗い流すなど血をばらまくなど
衛生害テロをやったキチガイ
奇声をあげるなどキチガイ行為
挙句の果てに、Perl使いのOと大喧嘩して殴りあいになって、警備員に追い出されるざま
Perl使いにパッシング浴びて退場
そのあとツイッターで反省無し
こいつRubykaigi一生立ち入り禁止だってさ
942 : think49 - 2011/07/18(月) 14:20:36.50 ID:??? (-27,-30,-223)
>>937
それも考えましたが、今回の争点となりそうな [[Writable]]: false の性質が消えてしまうのであえてグローバル変数 undefined を残す実装にしてみました。
http://jsfiddle.net/3DS2v/1/

>>939
イベントバブルを利用するなら parentNode を辿るのがいいんじゃないですかねえ。
以下、スマートに見えて効率は良くないです。(未検証なので参考程度に)

function handleMousedown (event) {
 var target = event.target;

 if (!Array.prototype.some.call(event.currentTarget.querySelectorAll('#a *'), function (element) { return target === element; })) {
  return;
 }

 // 処理
}
document.addEventListener('mousedown', handleMousedown, false);
943 : Name_Not - 2011/07/18(月) 14:47:01.84 ID:??? (-27,-30,+0)
var scope = document, dragObj = {target:null};
scope.addEventListener('mousedown', drag, false); scope.addEventListener('mousemove', drag, false); scope.addEventListener('mouseup', drag, false);
function drag(e) { var c; switch (e.type) {
 case 'mousedown': c = e.target; do if (c.id === 'xxx') break; while (c = c.parentNode); if (c) dragObj.target = c; break;
 case 'mousemove': c = dragObj.target; if (c) { c.style.left = e.clientX + 'px'; c.style.top = e.clientY + 'px'; } break;
 case 'mouseup': dragObj.target = null; break; }}
949 : Name_Not - 2011/07/18(月) 21:05:14.77 ID:??? (+27,+29,-16)
議論こそID出すか名前にレス番入れるかしてほしい
950 : Name_Not - 2011/07/18(月) 21:51:47.23 ID:??? (-29,-30,-124)
とりあえずテンプレ議論は終わり?
結局
(案1) ID推奨、レス番を名前推奨 // >853 (1票)
(案2) ID推奨、レス番を名前強制 // >824 (1票)
(案3) ID強制、レス番を名前推奨
(案4) ID強制、レス番を名前強制
(案5) ID推奨、レス番を名前強く推奨 // >855,869 (2票)
(案6) ID強制、レス番を名前推奨 or ID推奨、レス番を名前強制
(案7) 2回目以降レス番を名前推奨 // >870 (1票)
これとかどーすんの?

とりあえず最新っぽいテンプレ用サイト>>872
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript スレッド一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

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


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