+ JavaScript(ECMAScript)質問用スレッド vol.122 + [無断転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2016/08/29(月) 01:23:24.09ID:MUTWRWKoトランスパイラなどの関連技術の話題も取り扱うように変わりました。
ECMAScriptの言語仕様の話題。最新ECMAScriptによるモダンな書き方、Promiseやasync/awaitを
使った非同期プログラミング。ES2015、2016、2017等の最新ECMAScriptをブラウザで今すぐ使う方法、
ビルド環境やbowerやnodeのパッケージを使う方法等、モダンなJavaScript環境についての幅広い話をしましょう。
ECMAScript対応実行環境一覧(ブラウザやbabelを含む)
http://kangax.github.io/compat-table/es5/
http://kangax.github.io/compat-table/es6/ (= es2015)
http://kangax.github.io/compat-table/es2016plus/
http://kangax.github.io/compat-table/esnext/
JavaScriptとは?
もともとMozillaの前身のNetscapeが作った言語であり本来のJavaScriptはFirefoxの実装のみです。
JavaScriptの正式な仕様名はECMAScriptです。ですが一般に使われているとおり
ChromeやEdgeで使う言語もJavaScriptとしてこのスレでは扱います。
Firefox等のJavaScript実装は最新のECMAScriptに準拠しています。
※DOMはブラウザが提供しているものでありJavaScript(ECMAScript)の範囲外です。
なのでDOMを使ったプログラミングは原則としてこのスレの対象外です。
DOMはwindowオブジェクト(ブラウザのホストオブジェクト)経由で
参照するもので、window自体、window.document、window.Workerなどです。
これに関する話題はWeb制作板の下記のスレに移動してください。
+ JavaScript & jQuery 質問用スレッド vol.7 + [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/hp/1467906819/
+ JavaScript の質問用スレッド vol.130 + [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/hp/1463395557/
前スレ + JavaScript の質問用スレッド vol.121 + [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/tech/1468158373/
0596デフォルトの名無しさん
2016/10/16(日) 21:44:43.73ID:LWTFfjDf「一番最初に起動したとき」というのは、
a(); // 1
のときでしょうか?
0597デフォルトの名無しさん
2016/10/16(日) 21:57:12.53ID:LWTFfjDfそれはどうやればいいのでしょうか?
参考書を読んでいるだけなので、デバッグの仕方もよく分かりません。
0598デフォルトの名無しさん
2016/10/16(日) 21:57:36.43ID:cgLhTvvHvar n = 0;
return n;
}
var a = Counter();
この場合にaの中に何が入っているかわかるのなら、
>>586でaの中に何が入ってるかは
置き換えるだけだろ
0599デフォルトの名無しさん
2016/10/16(日) 21:58:23.73ID:cgLhTvvH>>598で返り値だけになるのなんて当たり前だよね?
0600デフォルトの名無しさん
2016/10/16(日) 22:04:46.53ID:LWTFfjDfaの中には、
var n = 0;
return n;
が入ってるのではないのですか?
なぜ、n = 0; は省かれるのですか?
0601デフォルトの名無しさん
2016/10/16(日) 22:12:37.29ID:LWTFfjDf間違えました。
aには返り値が入ります。なので、>>598の場合は、aにはnが入って、つまり返り値だけになるのは分かります。
しかし、a(); の場合は、
var n = 0;
return n;
なぜ、こうならないのかが分かりません。
0602デフォルトの名無しさん
2016/10/16(日) 22:21:40.38ID:22TTvDK/JS以前からある思想を踏襲してるんじゃない?
Pythonかなんか知らんけどお
0603デフォルトの名無しさん
2016/10/16(日) 22:26:43.07ID:r3gdRhV6>なぜ返り値だけになるのですか?
キミがCounter()をそのように作ったから
>var n = 0; も一緒じゃないんですか?
return function() {return n++;}
のどこにn=0がある?
0604デフォルトの名無しさん
2016/10/16(日) 22:32:07.26ID:LWTFfjDfオブジェクトのコピーと混同してました。
var a = Counter();
確かにこれで、var n = 0; は入らないですね。返り値を代入しているだけだから。
すなわち、aには返り値の無名関数が入ると。
で、当然、a();には n = 0 は入ってなくて無名関数だけだから、呼ぶ度に加算される。
0605デフォルトの名無しさん
2016/10/16(日) 22:33:40.23ID:LWTFfjDf今になって思えば、まさしくその通りです(笑)
0606デフォルトの名無しさん
2016/10/16(日) 22:35:45.09ID:LWTFfjDf何度もよく読み返してみて自分の誤解に気づきました。
ありがとうございます。
0607デフォルトの名無しさん
2016/10/16(日) 22:57:07.10ID:cgLhTvvHaの中身は表示されるよ。
0608デフォルトの名無しさん
2016/10/16(日) 23:27:01.47ID:LWTFfjDf出ました。これが!
function () {
return ++n;
}
よーし、明日からまた頑張るぞ!
0609デフォルトの名無しさん
2016/10/17(月) 09:44:12.70ID:JGocT82Eいや、nじゃなくてaを考えろよ
0610デフォルトの名無しさん
2016/10/17(月) 10:02:05.92ID:5vFd9dbv周回遅れってわかってる?
0611デフォルトの名無しさん
2016/10/17(月) 10:35:49.18ID:SVcsoL0Rこれに何の意味、活用性があるのか?
小一時間問い詰めたい
0612デフォルトの名無しさん
2016/10/17(月) 11:35:06.10ID:5vFd9dbvキミは周回遅れ以前、出場資格ない
0613デフォルトの名無しさん
2016/10/17(月) 11:44:08.56ID:EnKnOK0gベーシックしか知らない方ですか?
0614デフォルトの名無しさん
2016/10/17(月) 12:15:27.10ID:k5b8iytR「インクリメントした値を返す意味がある」としか答えようがないな
リファレンスを読み直しておいで
0615デフォルトの名無しさん
2016/10/17(月) 19:20:09.73ID:wBVSlf54馬鹿は口を閉じてろよザッコww
何仕切ってんだこのヴァカがw
0616デフォルトの名無しさん
2016/10/17(月) 19:49:26.05ID:5vFd9dbv0617デフォルトの名無しさん
2016/10/17(月) 20:08:48.29ID:wBVSlf54馬鹿は口を閉じてろww
0618デフォルトの名無しさん
2016/10/17(月) 22:12:14.86ID:MSv6dw6i現実的にこんな処理が必要になる状況ってあるの?
0619デフォルトの名無しさん
2016/10/17(月) 22:21:09.76ID:xorYyxjjconsole.log(result);
1の前と、2の前と、最後の\nの前にマッチしてほしいが
1の前と、1つ目の\nの前と、2の前と、2つ目の\nの前と、2つ目の\nの後ろにマッチしてしまう
let result = "1\r\n2\r\n".match(/$/mg);
console.log(result);
1の後ろと、2の後ろと、2つ目の\nの後ろにマッチしてほしいが
1の後ろと、1つ目の\rの後ろ、2の後ろと、2つ目の\rの後ろと、2つ目の\nの後ろにマッチしてしまう
CRLFを含んだ文字列を処理するうまい方法はないものでしょうか?
仕様とあきらめて、LFのみに変換するしかないのでしょうか?
0620デフォルトの名無しさん
2016/10/17(月) 22:29:29.43ID:xorYyxjj訂正
1の前と、2の前と、2つ目の\nの後ろにマッチしてほしいが
補足
もう少しわかりやすく書くと、以下のようになってしまうのを修正したいです
result = "1\r\n2\r\n".replace(/^/mg, "!");
^1^
^2^
^
result = "1\r\n2\r\n".replace(/$/mg, "$");
1$$
2$$
$
0621デフォルトの名無しさん
2016/10/17(月) 22:49:51.36ID:5vFd9dbvお前、口開けてキーボード叩いてるのか?
知恵遅れの習性は謎だらけだ
0622デフォルトの名無しさん
2016/10/17(月) 23:36:27.61ID:Da5IbuDC0623デフォルトの名無しさん
2016/10/18(火) 01:13:52.49ID:sMICGAt6>1\r\n2\r\n
>1の前と、2の前と、2つ目の\nの後ろに、マッチしてほしい
1の前・2の前は、行頭だろ。
2つ目の\nの後ろは、全文字列の最後
2つに分けて考える。
それか、全文字列の最後は無視して、正規表現とは別に処理にする
0624デフォルトの名無しさん
2016/10/18(火) 01:35:52.87ID:g5oHSCaR「最後の\nの前」は「\rと\nの間」
1と2は「\nの後ろ」だったのに最後だけなぜ「\nの前」になるのだろうか?
0625デフォルトの名無しさん
2016/10/18(火) 03:24:17.45ID:sMICGAt6>1の前と、2の前と、最後の\nの前にマッチしてほしい
>>620
で訂正している
>1の前と、2の前と、2つ目の\nの後ろにマッチしてほしい
0626デフォルトの名無しさん
2016/10/18(火) 08:02:45.99ID:De2Roj8eちょいちょいあるんじゃない?
>>625
/m消して、\n探しちゃいかんの?
0627デフォルトの名無しさん
2016/10/18(火) 09:15:43.00ID:Vsk5WAhm>618
ドンな時?
0628デフォルトの名無しさん
2016/10/18(火) 09:38:02.36ID:cWVmYcdeサンプルのコードは単純だけど、たとえばリターンに記述されている
”++n”を三項演算子に書き換えて、上限値に来たらリセットする
ループカウンターにする。
あとは、解析を困難にする為の無駄なコードとして扱う。
サンプルの処理が単純だけど、少し手を加えれば、どの様にでも使える。
0629デフォルトの名無しさん
2016/10/18(火) 11:46:33.12ID:g5oHSCaR0630デフォルトの名無しさん
2016/10/18(火) 11:53:07.40ID:De2Roj8eモジュールの中全体で一意な番号が欲しいとき。
シングルスレッドが保証されてるので、正確にはインクリメント演算子は必要無いけど。
>>628
3項演算子もifも、比較文が必要でミスヒットすると悲しいから、Moduloの方が楽だと思う。
0631628
2016/10/18(火) 12:16:45.66ID:cWVmYcde>モジュールの中全体で一意な番号が欲しいとき。
”一意な番号”と云うと固定のenum宣言が頭に有ったけど
番号をmap管理すれば色々と使えますね。
なるほど。
>3項演算子もifも、比較文が必要でミスヒットすると悲しいから、Moduloの方が楽だと思う。
モジュールもある程度意味を持たせなければいけない考えなモノで
分岐処理も例に上げました。
0632デフォルトの名無しさん
2016/10/18(火) 16:19:34.97ID:Vk/gbf1F低速低容量で使いたいので。
古いの(低解像度)
http://hakobe932.hatenablog.com/entry/20060803/1154575478
http://chameleoncyber.org/?p=335
http://www.kototoka.com/entry/2014/08/11/kishoutyou-nowcast-tenki-yohou-gerira-gouu-yosoku-highresorad/
・・・
標準のやつでもいいかな
0633デフォルトの名無しさん
2016/10/19(水) 17:30:13.76ID:BuiU+rAj自作したら?
ES関係ないのでスレ違い
0634デフォルトの名無しさん
2016/10/26(水) 19:54:01.06ID:wme53G2uvar a={b:function (){}};
ってあった場合どんなふうにインデントするのがいいんですかね。
0635デフォルトの名無しさん
2016/10/26(水) 22:19:57.91ID:RGR5F2yC0636デフォルトの名無しさん
2016/10/26(水) 22:49:40.05ID:wme53G2u0637デフォルトの名無しさん
2016/10/26(水) 22:58:30.79ID:nn4J9Ce2var a = {
b:function (){
alert(“おまえは💩”);
}
};
0638デフォルトの名無しさん
2016/10/26(水) 23:02:07.76ID:bmG2AFzyb:function (){
}
};
0639デフォルトの名無しさん
2016/10/26(水) 23:23:52.60ID:Tc/AxpVE> ってあった場合どんなふうにインデントするのがいいんですかね。
インデントじゃなくてスペースの入れ方だろ?
採用するコーディングスタイル基準による。
こういうのはちゃんとチェックするツールが有って、今だとeslintっていうのが有名。
eslintではスタイルを選ぶことができるが(さらに独自でカスタマイズもできる)
その中で有名なのが、eslint:recommended と airbnb だろう。
eslint:recommended は比較的緩くてその書き方でも問題ない。
airbnbの場合は、var a = { b: function () {} };
(実際は const a = { b() {} }; を推奨される)
改行入れる場合はこうだな。
var a = {
b: function () {}
,
};
あと必ず { の後で改行入れろとか言ってるやつがいるけど、
最近はそれを採用している規約は少ない気がする。
スペースの有無は決まってることが多いけど、
改行の有無は、長ければ改行を入れるという決まりでいいだろう。
もちろん { で改行した場合はインデントを一つ増やす。
0640デフォルトの名無しさん
2016/10/26(水) 23:24:20.49ID:Tc/AxpVE改行入れる場合はこうだな。
var a = {
b: function () {},
};
0641デフォルトの名無しさん
2016/10/26(水) 23:32:21.50ID:RGR5F2yC別に何でもええんやで
0643デフォルトの名無しさん
2016/10/27(木) 00:43:35.94ID:wk+FybyZ著名なソース読んでも、機械的には入れてない気がしてたんだ。
にしても無名関数が読み慣れん。
0644デフォルトの名無しさん
2016/10/27(木) 00:50:40.68ID:WMnZ+0YuF12開発者ツールで、JSファイルを整形して開くだけでも、正しく直してくれないか?
0645デフォルトの名無しさん
2016/10/28(金) 12:59:15.72ID:pmKmGehb0.1を0
0.5を1
Math.ceilだと1以上ないとだめでした
0646デフォルトの名無しさん
2016/10/28(金) 13:34:11.62ID:dnmvvXjVMath.ceil()は繰り上げ、四捨五入ならMath.round()
0647デフォルトの名無しさん
2016/10/28(金) 13:47:06.25ID:OnyL+paEそんなめんどくさい事しなくても、0.5足してfloorでいいんじゃないの?
0648デフォルトの名無しさん
2016/10/29(土) 05:43:28.19ID:gGx5G/bS少しずれたりしないの?
0649デフォルトの名無しさん
2016/10/29(土) 12:07:08.55ID:yHYEAqhD0,5未満なら0,5を足して四捨五入して
0.5以上ならそのまま四捨五入したらいいじゃん
0650デフォルトの名無しさん
2016/10/29(土) 12:17:53.47ID:cEJXxPE7ズレなくて、切りが良い。
0651デフォルトの名無しさん
2016/10/29(土) 14:11:06.80ID:ypb3Na8rずれたんだけど
alert(0.49999999999999999+0.5); // 1
0652デフォルトの名無しさん
2016/10/29(土) 14:47:07.98ID:z8URZLObalert(0.49999999999999999); // 0.5
問題外
0653デフォルトの名無しさん
2016/10/29(土) 15:25:53.31ID:cEJXxPE7jsfiddle.netで実行した結果を上げる。
alert(0.49999999999999999+0.5); // 1
alert(0.49+0.5); // 0.99
alert(0.499+0.5); // 0.999
alert(0.4999+0.5); // 0.9999
alert(0.49999+0.5); // 0.9999899999999999
alert(0.499999+0.5); // 0.9999990000000001
この環境の精度では、小数点以下四桁迄なら大丈夫になる。
”小数点第一位までしかない1以下の小数を四捨五入して1か0にする方法を教えてください”
なので、「小数点以下二桁は無い」事になる。
処理手順は、0.5を足して小数部分を捨てれば良い。
0654デフォルトの名無しさん
2016/10/29(土) 18:07:27.02ID:O/3wAc5r0655デフォルトの名無しさん
2016/10/29(土) 18:16:09.69ID:P+i+TDJ5マイナスの時に想定外の動作
0656デフォルトの名無しさん
2016/10/29(土) 18:55:02.99ID:Lu2qC+NvMath.floorを優先する理由はない
0657デフォルトの名無しさん
2016/10/29(土) 19:15:01.21ID:mMTmoVUB欲しがりません勝つまでは
我慢しろ
0658デフォルトの名無しさん
2016/10/29(土) 19:27:12.02ID:Lu2qC+Nv0659デフォルトの名無しさん
2016/10/29(土) 19:52:25.39ID:cEJXxPE7コードにする以前の問題。
入力で認めていれば、エラー対応が必要だし
入力で処理に影響する情報を排除すればそのままで済む。
そもそもマイナス扱う処理で四捨五入使うかな?
0660デフォルトの名無しさん
2016/10/29(土) 19:53:28.10ID:68KH7Ulz-0.6を四捨五入でどっちにしたいか。
roundで0にできたっけ?
0661デフォルトの名無しさん
2016/10/29(土) 19:57:05.98ID:eSvC8hNl小数点第一位までしかないんだから
Math.round() で解決だろ
バカ
0662デフォルトの名無しさん
2016/10/29(土) 20:06:28.52ID:JHScm7pH( (n) * 2) & 1
n が数でなくとも 0 か 1 になるが
0663デフォルトの名無しさん
2016/10/29(土) 20:37:58.28ID:mNGjlCUC速度を稼ぐために制限付きを承知で使うならいいだろうが
0664デフォルトの名無しさん
2016/10/30(日) 01:00:03.39ID:O7t7tgSU負の場合、例えば-20000.4は
> 小数点第一位までしかない1以下の小数
をみたすので、エラーでは無い
> 四捨五入して1か0にするには
四捨五入する桁を可変にすれば良いのかな?
0665デフォルトの名無しさん
2016/10/30(日) 05:11:47.90ID:hqgegRgFビット演算が速度を稼げるという根拠は?
例えば直近のV8 nightlyのアセンブラで書き直させたBuiltin_MathRoundingOperationよりも速いと言えるの?
結局無駄なf64<->i32キャストが発生するし、実際は速くないよ
速く使おうと思ったらUSE_ASM_Context内や、よっぽど変数の扱いを気を付けて
キャストが全体として起こらないようにしなければならない
0666デフォルトの名無しさん
2016/10/30(日) 05:55:23.89ID:h7Os3ze3ビット演算は速度を稼げると
>>665は申しております。
0667デフォルトの名無しさん
2016/10/30(日) 10:21:13.83ID:UrnMpVuD0668デフォルトの名無しさん
2016/10/30(日) 10:28:59.39ID:TSDZ4OFC普通0じゃないですか?
1.0/10なら0.1ですが
0669デフォルトの名無しさん
2016/10/30(日) 11:32:50.61ID:Z+vVaA9C要求仕様に対する、解析能力の確認ですね。
0670デフォルトの名無しさん
2016/10/30(日) 12:21:33.43ID:dH+/za6/https://ja.wikipedia.org/wiki/IEEE_754
0671デフォルトの名無しさん
2016/10/30(日) 12:26:08.71ID:TSDZ4OFCjavaの1/10は出来ないの?
切り捨てたり切り上げたり面倒なんだけど
0672デフォルトの名無しさん
2016/10/30(日) 12:39:39.62ID:dH+/za6/出来ない
他言語の常識を持ち込むのがナンセンス
0673デフォルトの名無しさん
2016/10/30(日) 12:42:33.00ID:TSDZ4OFCmjky
0674デフォルトの名無しさん
2016/10/30(日) 16:50:23.32ID:v2s+0v0ZMath.floor(1/10); であなたの目的は達成できるが、数値演算をJavaと同じにするのは無理
0675デフォルトの名無しさん
2016/10/30(日) 17:02:25.81ID:TSDZ4OFC負数もそれでいける?
負数だと絶対値が切り捨てで増えて、切り上げで減るとか聞いたけど
0676デフォルトの名無しさん
2016/10/30(日) 21:42:24.67ID:v2s+0v0Zやってみれば分かることをなぜ聞くかな
試してから聞いてくれ
0677デフォルトの名無しさん
2016/10/31(月) 03:18:16.89ID:vSxBS38U例えば、何かしらで永続化するとして
class Person {
constructor(name, age);
}
const p = new Person('あいうえお', 20);
// WebStorage?で永続化してもとに戻す。ここではJSONで
const json = JSON.stringfy(p);
const p1 = JSON.parse(json);
p1でコード補完なんて効くのか??
JavaScriptでPOJOクラスみたいなものを宣言する存在意義がわかりません。教えて下さい。
0678デフォルトの名無しさん
2016/10/31(月) 04:43:21.97ID:lofvnrlWJSON出し入れした場合などはプロトタイプが削除されどうせinstanceof等機能しないのだから。
お作法的にはcreatePersonという関数にする
まあクラスでもとんでもなくいけないということはない
それでわかりやすくなるというのならね
0679デフォルトの名無しさん
2016/10/31(月) 05:10:17.86ID:vSxBS38Uですよね。
>まあクラスでもとんでもなくいけないということはない
>それでわかりやすくなるというのならね
デシアライズした後はあんまわかりやすくならなさそうだったので質問してみした。
ありがとうございます。
0680デフォルトの名無しさん
2016/10/31(月) 06:43:17.85ID:xWfuY90DPOJOの意味をわかってないねw
https://ja.wikipedia.org/wiki/Plain_Old_Java_Object より
> POJOの概念は、明らかにPOJOという用語より前から存在する。なぜなら、
> オブジェクトクラスの自然なありさまとは、何ら特別なものではないからである。
> この用語の功績は、何らかのフレームワークを使う利点がその複雑さを補って
> あまりあるかどうかということを開発者に考えさせるという点にある。
> シンプルな設計の方が優れている場合もあるということを思い出させる明確な用語がなくては、
> 複雑なフレームワークが十分な理由のないままシステムアーキテクチャに含まれてしまいやすい。
> POJOによる設計が一般的になるにつれて、大規模フレームワークの機能の一部はPOJOでも
> 実現できることが明らかになってきており、実際に必要な機能領域に対する選択肢は増えている。
> HibernateとSpringがその例である。
意味わかる? POJOっていうのは単なるクラス。フレームワークとかのクラスを継承しない
単なるクラス。それがシンプルで良いという考え方から生まれた用語。
JavaScriptでも同じ。単なるクラスがシンプルで良い。
wikipediaに書いてあるように、特別なものじゃないんだが?
永続化? 補完? そんなものPOJOの意義とは全く関係無い。
0681デフォルトの名無しさん
2016/10/31(月) 07:43:46.18ID:vSxBS38Uただシンプルぐらいの感覚で使ってたんですが、
ただ聞きたかったのは「POJOの存在意義」ではなく、
永続化するシンプルなクラスの「クラス宣言」をする存在意義をJavaScriptで知りたかったんです。
実際JavaScriptにはクラスというものはなくて
class Person {
constructor(name, age);
はただのシンタックスシュガーらしいのですが、わざわざこんな宣言するメリットあるのかなと
それがが聞きたかったのです。
つまり、直接
var p = { };で作ってもいいんじゃないのかと。
0682デフォルトの名無しさん
2016/10/31(月) 07:47:51.97ID:vSxBS38U存在ってつけたからPOJOの存在意義って風に。すみまんせん。日本語がおかしかったです。
>永続化するシンプルなクラスの「クラス宣言」をする意義
ただの意義でした。
0683デフォルトの名無しさん
2016/10/31(月) 18:41:59.71ID:lofvnrlWだから、シンタックスシュガーもクソもなくてJSに「クラス」という概念はあるし、
素朴なプロトタイプベースで何もかもこなすのは非効率だから、昔から何らかのクラスシステムが使われてきた。
ただオブジェクト指向のやり方が「クラス」に縛られていないというだけ。
そして標準class構文は1つのより良いクラスシステムを提供するもの。
クラスから継承を取ったら何が残るかと言うと、それは見た目だよ。
createPersonのような関数で済ますのが普通だが、
もし他にそういった物がまだなく、全てクラススタイルで記述されていたらどうだ?
意味はなくとも意義がある。
>>var p = { };で作ってもいいんじゃないのかと
それは全体的な状況による。
例えばclass構文ガチガチのスタイル縛りの設計に無遠慮入れ込む事はできない。
0684デフォルトの名無しさん
2016/10/31(月) 18:44:45.95ID:pApy3Ebyclass Hoge←OOPのクラス
として使ってる
0685デフォルトの名無しさん
2016/10/31(月) 21:26:05.75ID:xWfuY90DJavaScriptに限らず言語の文法っていうのは
可読性を上げるために作られているんだよ。
そして可読性を上げる方法の一つが、コードの中から読まなければ
いけないコードの量を減らすこと。
一定のパターンに対して名前をつけてその名前を覚えてしまうことで
読まなければいけない量を減らすことができる。デザインパターンもその一つだけど文法も同じ。
シンタックスシュガーも読まなければいけなかったコードを
短い言葉で置き換えてそれを覚えてしまうことで可読性を上げることにつながってる。
(とは言えなんでも覚えてしまうのは不可能だから、覚える価値があるものだけに絞るべき。
例えばプロジェクト固有の関数は覚える価値が少ない。言語仕様はどこでも使える知識だから覚える価値がある)
また文法っていうのは、汎用的な命令だたものを専用的な命令に置き換えることが
できるように進化してきている。例えばgotoはあちこちに飛ぶことができるものだが、
これをより専用化してbreakやretrunやthrowなどができた。
これはgotoだけでは色んな意味があるから何のために使っているのかわかりにくいが
専用的なbreakであればループを途中で抜けるんだろうなってことがわかるから。
JavaScriptはclassが無くても作れていたが、だが人間は関数とクラスを区別していた人が多かった。
だからその人間の感覚に近づけることが可読性向上につながるわけ。
可読性の問題なのだから無くてもできるのは当たり前。
var p = { }; これだとただのハッシュなのかクラスなのか、色んな使い方ができるから
これだけ見てもわかりづらいだろ? 使っている箇所を読まなければ分からない。
class Personであればnewして使うんだろうなってことが明確になる。
読まなくて済むわけだよ。これが可読性という話。
0686デフォルトの名無しさん
2016/10/31(月) 21:29:41.12ID:xWfuY90Dclass Personの方がわかりやすいが、全体のコードが数十行程度なら
そこまでする必要はない。
だからコードが短いうちはvar p = {} で書いていても良い。
だけどコードが増えたときには必ずclass Personに変更しなければいけない。
これを放っておけば、犬小屋を作るやり方で一軒家を作るようなことになりかねない。
規模によって適切なやり方は違う。
0687デフォルトの名無しさん
2016/10/31(月) 22:06:57.07ID:R+gJxrwJvar p = { };は当然に
p instanceof Personがfalseになる
0688デフォルトの名無しさん
2016/10/31(月) 22:14:03.50ID:vSxBS38UもうC++,Delphi,Java,C#と10年以上はずっと使ってきました。
で、今回プロトタイプベースと言われる
JavaScriptを使って本格的にプログラミングし始めたのですが、もちろん最初は
クラス宣言してどんどんクラスを量産してたんですが、今回、例えばSettingsクラスみたいな
シンプルなPOJO的で永続化するクラスを作ろうとしたときに、
デシアライズすると元のプロトタイプチェーン?みたいなものが失われるし、
実際動作させた場合、最初のクラス宣言した元のSettingsクラスのインスタンスは最初の1回だけ作成され
後は別のプロトタイプチェーンが失われた別のインスタンス?とでもいうのでしょうかが動くことになるので、
ん?とちょっと手が止まってしまって質問した次第です。
0689デフォルトの名無しさん
2016/10/31(月) 22:22:26.57ID:vSxBS38Uもちろん、クラス宣言があった方が、実際それ参照すれば元々どんな構造だったのか分かりやすいとは
もちろん思ってましたが、それを踏まえてJavaScriptの経験豊富な方たちは
どうしてるのかなと思って質問したわけです。
とりあえずはプロトタイプチェーンとか気にする必要ない用実装するので
クラス宣言する方向で行こうと思います。
0690デフォルトの名無しさん
2016/10/31(月) 22:23:55.93ID:vSxBS38U0691デフォルトの名無しさん
2016/10/31(月) 22:55:13.38ID:hNQh9muD> デシアライズすると元のプロトタイプチェーン?みたいなものが失われるし、
> 実際動作させた場合、最初のクラス宣言した元のSettingsクラスのインスタンスは最初の1回だけ作成され
> 後は別のプロトタイプチェーンが失われた別のインスタンス?とでもいうのでしょうかが動くことになるので、
考え方がクラスベースで固定されてるのでプロトタイプチェーンをしっかり学ぶべきな気がする。
デシリアライズしたらプロトタイプ上のプロパティが失われるというが、実際にはシリアライズされた時には失われているのでは?
シリアライズが正常動作しているならそれはデシリアライズ処理がおかしいだけ。
最も、プロトタイプ上のプロパティを拾ってないだけな気もするが。
0692デフォルトの名無しさん
2016/10/31(月) 23:08:27.14ID:xWfuY90D永続化が問題なのか?クラスの話関係ないじゃん。
シリアライズっていうけどさ、やってるのはJSON文字列への変換だろ?
前提として関数等はJSON文字列に変換することはできない。
シリアライズされたデータの中に関数定義は含まれないので
関数定義とデータは別々に管理しなければならない。
ここまでは自明だよな?
あとはクラス定義(プロトタイプチェーン含む)をコードで作った上で
その中のデータのみをシリアライズ & デシリアライズする。
これがJSONオブジェクトを使った場合のやり方だろ?
0693デフォルトの名無しさん
2016/10/31(月) 23:09:18.71ID:xWfuY90D0694デフォルトの名無しさん
2016/10/31(月) 23:20:25.00ID:xWfuY90Dお前それ本当に永続化したいと思ってんのか?って言いたくなるんだが。
何のために永続化が必要なんだ?
永続化なんてしないだろ。永続化しないもののために
わざわざ永続化のためのコードなんて書く意味ねーぞ?
Javaの話でも同じ。永続化しないものにSerializableなんて
やる必要ないぞ。何も考えずに無駄にコピペしてねーか?
0695デフォルトの名無しさん
2016/10/31(月) 23:29:48.72ID:vSxBS38U永続化する必要あるから永続化しようとしてるのに・・
0696デフォルトの名無しさん
2016/10/31(月) 23:48:32.48ID:VoAu6vx9グダグダとくだらねぇこと語って
■ このスレッドは過去ログ倉庫に格納されています