16/06/10 09:33:17.22 o8hFzx97.net
>>485-487
Groovyのメタプログラミングなら、
実行時に既存のクラスに、メソッドを追加するなら、Category・Mixin。
メソッド・プロパティを変更・追加するなら、ExpandoMetaClass
そういう複雑極まりない方向へ進むのは、最初から考え方がおかしいのでは?
517:デフォルトの名無しさん
16/06/10 09:36:28.17 +uuPJDCE.net
>>500
> 関数式よりも、巻き上げのある関数宣言の方が、良いのか?
何も考えてねぇ馬鹿は、変数の巻き上げの問題(もちろん理由がある)の話を、
全く関係ない関数にまで適用しようとする(笑)
理由は何だよw
ブロック内だけで使う関数など、関数式でなければいけない場合もあるが
通常は関数宣言の方がいいに決まってるだろ。
C言語は宣言された関数しか使えなかったため「前方宣言」などという
物が生み出されてしまったが、それ以降、それ以外の殆どの言語は
関数はどこで宣言しても(巻き上げされたかのように)使うことが出来る。
518:デフォルトの名無しさん
16/06/10 09:40:10.83 4srunpG+.net
所詮は自己満足の世界なんだよ
519:デフォルトの名無しさん
16/06/10 09:40:12.48 +uuPJDCE.net
普通に関数に名前(コンストラクタも含む)をつければいいのに、
「さいきんのクールなプログラマはvarで関数入れて使うんだぜ!
今時関数に名前つけるなんてのは旧石器時代だな!」とか言ってるんだぜw
バカっぽいだろ?事実なんにも考えてない。
デバッガ時に関数名表示がでなくなる問題があるというのにな。
520:デフォルトの名無しさん
16/06/10 10:33:45.27 GFWTaLNc.net
>>483
> どちらもES3の頃から存在して使い分けされていたわけだが
誰もが(いいすぎ)使い分けるようになったのは、近代になってから
> 関数式を使わない時代っていつだ?
だから旧石器時代だって
ゼロ年代初頭あたりまで
521:デフォルトの名無しさん
16/06/10 10:36:19.23 GFWTaLNc.net
>>493
> function Klass() {} という書き方が古くなったとか
> 聞いたこと無いし、
グローバルネームスペースを汚染する弊害について聞いたことないのか
522:デフォルトの名無しさん
16/06/10 11:04:28.13 rddDxbo4.net
>>509
クロージャの中でやる分には大丈夫なんじゃないの?巻き上げられたっけ?
523:デフォルトの名無しさん
16/06/10 11:31:26.83 xHgczCBO.net
今時グローバル汚染するようなアホおまえくらいだから
524:デフォルトの名無しさん
16/06/10 11:46:24.26 XqAkh7YW.net
なんであんなに無名を濫用するのかと思ってたが
そんなしょうもない理由だったのか
525:デフォルトの名無しさん
16/06/10 14:12:05.29 dpRBFPup.net
>>509
聞いたことないが、その弊害の発生条件は?
526:デフォルトの名無しさん
16/06/10 14:36:22.02 4srunpG+.net
そうだよな
汚染ってなんだよ
527:デフォルトの名無しさん
16/06/10 15:06:36.55 LT2C5Mf1.net
prototype使って、汚染しちゃうのは初心者がやってしまう失敗
528:デフォルトの名無しさん
16/06/10 15:59:08.90 DxAsZ/F5.net
1個くらいならバレないんじゃない?
529:デフォルトの名無しさん
16/06/10 16:05:16.91
530:3bO9ZAmE.net
531:デフォルトの名無しさん
16/06/10 18:15:57.76 LT2C5Mf1.net
コンソールに出すの?
アラートで出すの?
アラートで出たら、めちゃくちゃ怖いかもww
532:デフォルトの名無しさん
16/06/10 19:06:13.75 qrHSyLm3.net
prototype汚染という考え方も古くなってきた感はあるが…
しかし、風呂敷を広すぎではないかね
元々はprototuype汚染の話ではなかったわけで段々と本題がずれてきているように思う
533:デフォルトの名無しさん
16/06/10 19:27:07.34 qrHSyLm3.net
>>489-491
画面を再描画するならサーバサイドの処理があるはずだが、それはJavaScriptで実装すべき案件なのかね
フォームで値を受け渡してサーバサイドで処理、セッションを使う等、いくつか対策があるはずだが
jsを使うなら再描画させずに動的にDOMを書きかえれば済むが、マルチポスト先を読む限りではこの質問者にはハードルが高そうだな
URLリンク(teratail.com)
URLリンク(teratail.com)
534:デフォルトの名無しさん
16/06/10 20:02:15.97 G+eNnn4N.net
>>500
少なくとも文法上は大差ないのだろう。MDNにも説明はある。
> 全ての関数は実際には Function オブジェクトです。
> Function コンストラクタか関数宣言か関数式か
> URLリンク(developer.mozilla.org)
new Functionや非トップレベル関数(strict modeでは禁止)も含めて書いてあるから余計に分かりにくくなっているが、
要するにどうでもよさそうだ。
現実的にはコンストラクタだけ前方参照できてもプロトタイプが用意できていないから意味がない。
だから関数式の方が似合っている気はする。
ちなみに汚染については変数名か関数名かだけでどちらも汚染する。
また、デバッグ時にこんなところが関数表示されたところで嬉しくない。
どのみちコンストラクタが呼ばれればコールスタックには載るし、ブレークポイントも当てられる。
お前らは異様に文法にこだわることを止めて、もっとコードを書いた方がいい。
指摘が間抜けなのは、コードを書いてないからだ。(実践的ではない)
○○の問題がある(キリッというのは正しいが、それが重要なことなのか、わりとどうでもいいことなのか、区別が出来ていない。
>>520
> マルチポスト先
よく見つけたなw
というかこの手のモラルがない奴、急に増えたよな?何か理由があると思うのだが。
昔から居たけど、マルチポスト先が増えたから発覚しやすくなっただけか?
535:デフォルトの名無しさん
16/06/10 20:08:51.44 RNr8lFlW.net
>>499
どうもありがとうございます。おかげで気がついてしまいました。
concatはArrayを受け取ってArrayを返すつもりで>>487では書きましたが、
よく考えると今回拡張したA(以下単にA)を引数に受け取りたいですし、
返す結果もよく考えるとAであったほうが嬉しいかもしれません。
実装の手間という面だけでも尻込みしつつあったんですが、
いまや設計の方針と言う面でも相当きな臭いというか。
concatの返す値が決められなくて不気味。使うときに不安。
仮にsliceやspliceなどのもまとめて全部Aを返すように統一したとしても、
最終的にはArrayとAの二系統が混在する世界になっちゃうわけで不気味。
>>501
> 完璧なエミュレーションに拘らないのであれば妥協も必要
そのつもりだったんですがいざ用意してみると、
欲が出るわ粗が目立つわ方針で不安になるわで散々でした。
今後は生のArrayのみを運用していくつもりです(結論)。
>>504
ありがとうございます。Groovyはぐぐったことすら無いので分かりません。
> そういう複雑極まりない方向へ進むのは、最初から考え方がおかしいのでは?
はい。完全にそのとおりです。
536:デフォルトの名無しさん
16/06/10 21:47:53.40 qrHSyLm3.net
>>522
> 今後は生のArrayのみを運用していくつもりです(結論)。
それはそれで一つの答えだが、やや狭い世界になっていると思う
> 最終的にはArrayとAの二系統が混在する世界になっちゃうわけで不気味。
2つの世界が存在することは問題なくてそれが息をするように自然に使えるかどうかが問題ではないだろうか
mew Array と new A を行き来する世界はよくないが、それぞれの世界で完結する処理を書けるのならそれでいい
どちらかといえば、設計指針を決めかねて迷っているのだと思うが…
基本的には new A は A だけで閉じた世界(new Array を返してはならない)であるべきなので A#concat は new A を返すべきだと思う
逆に A#push は汎用的なので特別な事をせずとも new A を返す
このように汎用的な関数を基本的には使って非汎用関数に対しては Polyfill を作る要領でコードを書いていけばそれなりのものができるだろう
別の設計指針としては new Map を new ArrayMap 的な設計にして作り直しても面白いかもしれない
new Map は関数でsetter/getterを作るので new Array よりは互換コードを書きやすいはずだ
機会があれば、是非新しい世界を作ることに挑戦してみてほしい
537:デフォルトの名無しさん
16/06/10 21:58:16.74 MdFWcZSW.net
こういう人に読ます気がない文章は目の前で破り捨てるに限る
538:デフォルトの名無しさん
16/06/10 22:12:29.26 AlU+uWXE.net
ES6だとプロトタイプ汚染がないのかと思ったけどもしかして新機能がない?
結局
Object.defineProperty(...){........}
と書かんといけんのか
539:デフォルトの名無しさん
16/06/10 22:18:01.79 G+eNnn4N.net
この程度で躓くのならもっと長いMDNは当然無理で、池沼のままなのもむべなるかな
540:523
16/06/10 22:51:59.24 qrHSyLm3.net
読みにくくてすまん
どういうわけが改行コードが一部消えているな…
541:デフォルトの名無しさん
16/06/10 23:08:39.56 +uuPJDCE.net
*∧ ∧:・。゚*。 : ・ 。 ゚ *★.
(*・ω・*) ゚ *。*
*〇 〇………………………**
祝☆jQuery 3.0 リリース URLリンク(blog.jquery.com)
**………………………………*
+ JavaScript & jQuery 質問用スレッド vol.6 + [無断転載禁止]©2ch.net
スレリンク(hp板)
542:デフォルトの名無しさん
16/06/10 23:10:44.42 +uuPJDCE.net
>>509
> > function Klass() {} という書き方が古くなったとか
> > 聞いたこと無いし、
> グローバルネームスペースを汚染する弊害について聞いたことないのか
なにいってんだおめぇ?
var Klass = function() {} という書き方をしても
グローバルネームスペース汚染してるだろw
function hoge() {
function Klass() {}
}
↑Klassがグローバルネームスペース汚染ってどういうこと?w
543:デフォルトの名無しさん
16/06/10 23:13:14.16 +uuPJDCE.net
>>524
同じこと思ったw
544:デフォルトの名無しさん
16/06/11 00:01:17.78 MQjYfq34.net
ライブラリスレが復活してた
JavaScript ライブラリ総合質問所 vol.5 [無断転載禁止]©2ch.net
スレリンク(hp板)
545:デフォルトの名無しさん
16/06/11 08:41:10.92 MQjYfq34.net
jQuery推しが酷いと思ったらテンプレ改変されていたのか
546:デフォルトの名無しさん
16/06/11 13:03:48.93 n8nif7qi.net
今更かよ
ここ乗っ取られスレだよ
547:デフォルトの名無しさん
16/06/11 13:06:25.18 ijG8u0pc.net
java script初心者です。ご教授願います m(_ _)m
初めてpromiseで簡単な非同期処理を書いたんですが、一応動くもののどうにもコードがしっくりきません
もっとシンプルにできたり、適切な書き方があるところがあったら教えてください
内容は単語queryに対応する画像検索結果がローカルストレージになかったら外部APIに問い合わせるというものです
548:534
16/06/11 13:09:15.52 ijG8u0pc.net
function getCachedData(query) {
return new Promise(function(resolve, reject){
chrome.storage.local.get(query, function(cachedJson){
if (isExist(cachedJson)) {
resolve(cachedJson[query]);
} else {
reject();
}
});
});
}
function getImageData(query) {
getCachedData(query)
.catch(function(){
return fetch(window.googleCustomSearchApi + query)
.then(function(response) {
return response.json();
}).then(function(json){
chrome.storage.local.set({[query]: json});
return json;
});
}).then(function(json) {
createPopUp(json.items[0]);
positionPopUp();
}).catch(function(err) {
console.error(err);
});
}
549:デフォルトの名無しさん
16/06/11 13:14:41.27 ijG8u0pc.net
インデント潰れてしまった・・・ preタグで再投稿
<pre>
function getImageData(query) {
getCachedData(query)
.catch(function(){
return fetch(window.googleCustomSearchApi + query)
.then(function(response) {
return response.json();
}).then(function(json){
chrome.storage.local.set({[query]: json});
return json;
});
}).then(function(json) {
createPopUp(json.items[0]);
positionPopUp();
}).catch(function(err) {
console.error(err);
});
}</pre>
550:デフォルトの名無しさん
16/06/11 13:21:07.32 e5AOazPt.net
>>534
この記事が参考になるかな
URLリンク(gao-tec.seesaa.net)
551:デフォルトの名無しさん
16/06/11 13:33:33.96 ijG8u0pc.net
>>537
ありがとう 3回読んできます
552:デフォルトの名無しさん
16/06/11 13:39:59.04 n8nif7qi.net
>>534-535
2chはHTMLタグ使えないからjsFiddleみたいな投稿サイトを使うといいよ
前まではテンプレにあったんだが
一見ネストが深いように見えるけど結構シンプルに纏まってると思う
fetchの部分を外に出せば視認性がよくなるんじゃないのって程度
しいて言えばgetImageData内でPopUp関数を呼び出してるのがしっくりこない
getImageData自身もPromiseインスタンスを返してresolve(json)するのがいい
553:デフォルトの名無しさん
16/06/11 13:59:44.48 ijG8u0pc.net
>>539
今日だけ師匠と呼ばせてください
自分でもそこはなんか気持ちわるかったんです promiseチェインがcatchで始まった挙句、頭でっかちで
でも外に出すというのはどうやるんでしょう・・・
fetchからの処理をまとめた関数(返り値は最終的なjsonデータのpromise)を外に定義して、それを呼び出す感じですか?
そしてgetImageDataがPromiseインスタンスを返すように書き換えるには、ええと・・・(思考フリーズ)
554:デフォルトの名無しさん
16/06/11 14:41:46.28 n8nif7qi.net
>>540
getCachedDataと同じ書き方をfetchとgetImagedataでやるだけだよ
555:デフォルトの名無しさん
16/06/11 15:16:00.71 NAulAg4n.net
>>539
> 一見ネストが深いように見えるけど結構シンプルに纏まってると思う
え? ちょっとまてよ?
556:デフォルトの名無しさん
16/06/11 15:45:12.80 NAulAg4n.net
>>540
これgetImageDataの中でキャッシュあるか調べてるからいけないんだよ。
一般論として、キャッシュというのは存在を意識しないようにコードにするべき。
関数の役割ってのが書いてないし、これだけじゃ読み取れないから難しいんだが、
そのgetImageDataっていうのは画像があれば、ポップアップウインドウを表示するんだろう?
であれば、getImageData() ではなくて showImageData() とかいう名前にするべき。
そして、getCachedData()ではなく、こっちをgetImageData()にするべき。
getImageData()っていうのは単にImageDataを返すだけ、その中でキャッシュを使っていようが
使っていまいが関係ないし、別の仕組みのキャッシュを使うかもしれない。がgetImageData()を
使う人からはそんなこと知ったことじゃない
>>535のコードは、chrome.storage.local を使っている箇所が、getCachedDataと
getImageDataの2つに分かれているだろ? 関数の役目が明確に分離されていないからそうなる。
非同期の書き方の問題の前にまずやることがあるってことさ。
あと、スペース1個でインデントは見にくいからやめろw
最低でも2個だ。
557:デフォルトの名無しさん
16/06/11 15:47:35.86 NAulAg4n.net
で、これが修正コード例だ。
やりたいならばchrome.storage.local.getをPromise化する事もできるがね。
function getImageData(query) {
return new Promise(function(resolve, reject) {
chrome.storage.local.get(query, function(cachedJson) {
if (isExist(cachedJson)) {
resolve(cachedJson[query]);
return;
}
558: fetch(window.googleCustomSearchApi + query) .then(function(response) { var json = response.json() chrome.storage.local.set({[query]: json}); resolve(json); }) .catch(function(err) { reject(err); }) }); }); } function showImageData(query) { getImageData(query) .then(function(json) { createPopUp(json.items[0]); positionPopUp(); }) .catch(function(err) { console.error(err); }); }
559:デフォルトの名無しさん
16/06/11 15:56:05.66 NAulAg4n.net
で、どうしてもgetImageData()の中身をPromise化したいならこんな感じかね?
動かせる環境がないので、これで正しく動いているかはしらない。
元のコードに合わせてisExistがfalseならreject()しているが、
nullを返して、データがnullだったらfetchしたほうがいいような気もするが。
function getImageData(query) {
return new Promise(function(resolve, reject) {
chrome.storage.local.get(query, function(cachedJson) {
if (isExist(cachedJson)) {
resolve(cachedJson[query]);
} else {
reject();
}
}).cache(function()) {
return fetch(window.googleCustomSearchApi + query)
}).then(function(response) {
var json = response.json()
chrome.storage.local.set({[query]: json});
return json;
});
}
560:534
16/06/11 16:03:43.18 ijG8u0pc.net
>>543
自分でああでもないこうでもないと考えてコードを修正していたら返信遅れました
か ら く ちwwww と思って訂正コードと自作スパゲッティを見比べたらグウの音も出ませんでした
この整理されたしっくり来る感じ 勉強になります
あとは・・ エラーハンドリングについてわからないところがあります!
561:デフォルトの名無しさん
16/06/11 16:07:35.34 ZhHlBSFM.net
>>537
良い記事だ。
が、前から疑問なのだが、何故お前らはネストにこだわるのだ?
俺は展開して書いていて、特に問題を感じない。
要求が「脳筋無限ループの例ぐらい単純な構造で」「非同期処理を実現する」
「処理は上から下へ」「ネストが深くならない」ならば、これでいいと思うのだが。
好きずきはあると思うが、このような場合にでも例としても出てこないのは謎なんだが。
function Main(){
console.log("a");
setTimeout(Main_1,2000);
function Main_1(){
console.log("b");
setTimeout(Main_2,1000);
}
function Main_2(){
console.log("c");
}
}
Main();
562:デフォルトの名無しさん
16/06/11 16:12:31.73 NAulAg4n.net
>>545は本当に動くかどうかわからない。
実はcacheのあとにthenをつなげたことないんでねw
まあ関数の中を試行錯誤すりゃできるだろうと思うけど。
最悪>>544でいいし。
"何をする" 関数か?(クラスか?)ってことをよく考えることが重要。
動くようにコードを配置するんじゃなくて、何をする関数か?を定義して
それに合わない所はたとえコードが増えても外にだすべきだし、
入れるべきだと思えば、どうにかして持ってくる。
もちろん場合によっては、"何をする" の定義を変えてもいいけど
はっきり定義させることが重要。
例えば、このgetImageData()はchrome.storage.local を使うことが前提になってるけど、
いろんなキャッシュの仕組みを入れ替えられるようにする関数(というかクラスになるだろうけど)を定義すれば
getImageData()の中からはchrome.storage.localが消えて、キャッシュの仕組みを
入れ替えられるだけのことをするクラスができあがるわけ。
563:デフォルトの名無しさん
16/06/11 16:15:59.14 NAulAg4n.net
>>547
> が、前から疑問なのだが、何故お前らはネストにこだわるのだ?
やりかけで覚えておかなければならないことが増えるからだよ。
Aが終わってからBをして、Bが終わってからCをする。というやり方よりも
Aの途中でBをして、Bをしているその途中でCをするほうが疲れるから。
Cが終わったら、Bはどうなったんだっけ? そしてAはどうなったんだっけ?って
戻って行かないといけないからね。
言い換えると可読性の問題だからだ。
非同期とかそういうところが問題になってるんじゃない。
やりかけの作業を脳に貯めておくと言うところが問題なんだよ。
564:デフォルトの名無しさん
16/06/11 16:20:02.55 NAulAg4n.net
>>547
あと、そのコードの問題は「名前」が増える。
名前が増えるっていうのも、いちいち記憶して
おかなければならないことだから面倒
限りある記憶領域は、記憶する価値のある物、
汎用的でどこでも使えることだけに絞る必要がある。
覚える価値がないものは覚えなくていい。
そのコードは関数の�
565:シ前が増えているだけだが、 クロージャーじゃなくなっているから、変数の名前も増えるだろうね あと処理があちこちに飛ぶから、コードが長くなったらスクロールする回数も増えるよw もちろん関数が長ければ分けるが少なければその場に埋め込むという意味だ。
566:デフォルトの名無しさん
16/06/11 16:26:52.64 ZhHlBSFM.net
>>549
そうか?ぶった切られているだけで、実は同じだろ。追加部分を見やすいように編集しておいた。
同期的に「放り投げて終わり」にしたいという気持ちも分かるが、無理にネスト/Promise化するより見やすくないか?
脳内 s/setTimeout...function(){// で全く問題ないはずだが。
function Main(){
console.log("a");
setTimeout(Main_1,2000); // 追加
function Main_1(){ // 追加
console.log("b");
setTimeout(Main_2,1000); // 追加
} // 追加
function Main_2(){ // 追加
console.log("c");
} // 追加
}
Main();
567:デフォルトの名無しさん
16/06/11 16:29:29.39 tWgkOxEq.net
もうそれはasync/await、もしくはgenerator/yieldを使うしかないよ。
568:デフォルトの名無しさん
16/06/11 16:35:45.96 NAulAg4n.net
>>551
サンプルコードでやってるからだめなんだよw
お前、頭の中で、このコードはsetTimeoutしかない。Main以外の名前は存在しない。
しかもそれぞれ短いコードで呼び出す順番に並んでいるいう「記憶」に頼ってコード読んでるだろ?
それはお前だから出来ること。(短いから俺でも出来るけどさw)
実際に業務ではそういう「記憶」には頼れない。コードはもっと長いし
汎用的じゃないものは名前も覚えられない。(何日も経ったら忘れる)
汎用的でないものには、適切な名前をつけることも難しい。
仮にそのコードのまま、記憶に頼れないように書き換えてみようか?
さっきと同じように気楽に読めるかい? どこでどう呼び出しが行われてるか探すだろ?
function Kjads(){
console.log("a");
function cgrd(){ // あrtが
console.log("c");
} // あrtが
badf(fgaz); // あrtが
function fgaz(){ // あrtが
console.log("b");
asdfa(cgrd); // あrtが
} // あrtが
}
Kjads();
569:デフォルトの名無しさん
16/06/11 16:36:17.69 ZhHlBSFM.net
>>550
「名前」が増えるのは事実だけど、関数内関数で隠蔽するし、
そもそも処理を必ず「上から下に」書くのでその点は問題にならない。
つまり、このように展開した場合、その関数は直前のsetTimeoutからしか呼ばれない。
したがって、覚える必要はないし、
処理があちこちに飛ぶこともない。(
570:ただこれはそう書く、ということだが) ちなみにクロージャーにはなっている。 > もちろん関数が長ければ分けるが少なければその場に埋め込むという意味だ。 いや、結構糞長い奴もそこに書くよね? $.ajaxとかその場にだらだら全部書くほうが普通じゃないか?
571:デフォルトの名無しさん
16/06/11 16:39:28.40 NAulAg4n.net
>>554
もうそろそろ>>553をみて、記憶に頼ってるなって自覚したはずw
> ちなみにクロージャーにはなっている。
なってない
function Main(){
var v = 1
setTimeout(function() {
console.log(v);
}, 1000);
}
↓ エラーになる
function Main(){
var v = 1
setTimeout(Main_1, 1000);
}
function Main_1(){
console.log(v);
}
変数vを渡すために、名前が増えるwww
572:デフォルトの名無しさん
16/06/11 16:39:52.50 ZhHlBSFM.net
>>553
ああ、ちょっと遅れたが、それは既に書いたように、俺内コーディングルール
処理を必ず「上から下に」書く
で対応している。というか、そもそも意図的に可読性を落とす必要はないだろ。
「上から下に」書けるところでは「上から下に」書くのが常識だろ。
名前もこの手の場合は XXX_1, XXX_2, ..... と順に付けていく。おかしな名前を付けたりすることはない。
573:デフォルトの名無しさん
16/06/11 16:40:41.06 NAulAg4n.net
>>554
> $.ajaxとかその場にだらだら全部書くほうが普通じゃないか?
下手なやつが多いだけ。
俺は関数に分けるべき理由が生まれれば当然分ける。
574:534
16/06/11 16:40:58.22 ijG8u0pc.net
>>544 の綺麗なコードを見る前に、API問い合わせの部分を関数に分離しようと思って、fetch用の追加のエラーハンドリングも加えてこう書いてしまったんですね(お蔵入りですが、このなかで疑問が沸いたので・・)
function googleCustomSearch(query) {
return fetch(window.googleCustomSearchApi + query)
.then(handleNetworkError)
.then(response => response.json())
.then(json => {
chrome.storage.local.set({[query]: json});
return json;
})
.catch(err => {
// 【ここが疑問】
});
}
function handleNetworkError(response) {
if (!response.ok) {
throw new Error(reponse.status, response.statusText);
}
return response;
}
575:デフォルトの名無しさん
16/06/11 16:44:00.74 NAulAg4n.net
>>556
> 処理を必ず「上から下に」書く
>
> で対応している。というか、そもそも意図的に可読性を落とす必要はないだろ。
> 「上から下に」書けるところでは「上から下に」書くのが常識だろ。
ほらなw お前の常識w
何処かで、function hoge() {} じゃなくて var hoge = function() {} って
書けって言っていたやつが居るが、
(ちなみに俺はその必要がないならばfunction hoge()って書け派)
これは上から下に書けない。
hoge();
var hoge = function() {}
hage()
var hage = function() {}
まあ 「上から下に」"書けるところでは" って書いているところからもわかるように
書けない場合があると自覚してるんだろうがw
その書ける所と書けない所、ここは書ける所だという前提を知ってるのも「記憶」だよねw
576:デフォルトの名無しさん
16/06/11 16:44:38.09 ZhHlBSFM.net
>>555
何が言いたいのか分からんが、これでいいか?
function Main(){
var count = 0;
console.log('a: '+count++);
setTimeout(Main_1,2000);
function Main_1(){
console.log('b: '+count++);
setTimeout(Main_2,1000);
}
function Main_2(){
console.log('c: '+count++);
}
}
Main();
577:デフォルトの名無しさん
16/06/11 16:46:15.25 NAulAg4n.net
>>560
勝手にコード書き換えんなよw
function Main(){
var count = 0;
console.log('a: '+count++);
setTimeout(Main_1,2000);
function Main_1(){
var v = 1;
console.log('b: '+count++);
setTimeout(Main_2,1000);
}
function Main_2(){
console.log('c: '+count++);
console.log(v); // エラーになる
}
}
Main();
それともお前、ローカル変数は作るな。
全部クラス変数にしろとか言う派なのか?www
578:デフォルトの名無しさん
16/06/11 16:50:41.71 NAulAg4n.net
>>558
いやw 何が疑問なのかさっぱりわからないんだがwww
579:デフォルトの名無しさん
16/06/11 16:51:15.94 ijG8u0pc.net
googleCustomSearchの呼出元にhandleNetworkErrorで起きたエラーを伝えるためには、
1.最後のcatchのなかでもう一度new Error(err)を投げる
2.Promise.reject(error)を返す
3.そもそも書き方が悪い、 >>544みたいにfetchをnew Promiseでラップして、reject(err)してください
どれが適切なんでしょうか
580:デフォルトの名無しさん
16/06/11 16:54:15.22 ZhHlBSFM.net
>>561
いや勝手に書き換えたのはお前だろ。
>>555のコードでは var v=1 は Mainの中じゃないか。
Main_1の中で新しい変数が必要なら、
・Main_2をMain_1内に移動する(ネストが増える)
・v を Main内で定義しておく
のどちらかだろ。俺なら後者的アプローチを取ることが多いと思う。
ただ、途中で変数が必要なときも管理しなくていいというのは確かにメリットかもな。
581:デフォルトの名無しさん
16/06/11 17:02:05.55 ZhHlBSFM.net
>>559
それはクラスの時の話だ。
クラスの場合は、コンストラクタだけ呼べても意味がないだろ。
Hoge.prototype.XXX = function(){...};
の記述が「順序が必要」なので、どのみちその記述以降じゃないと new Hoge() 出来ないんだよ。
誰も普通の関数 hoge を全部 var hoge = function(){} と書けとは言ってない。
お前が話について来れてないだけ。
まあ分かった、お前が「文法的に読み込める方が善」というのならそれでいい。
で、他の連中もそうなのか?
582:デフォルトの名無しさん
16/06/11 17:09:12.67 ZhHlBSFM.net
>>557
ちと細かいがこれにも言っておくと、
> 俺は関数に分けるべき理由が生まれれば当然分ける。
彼等は「関数に分けるべき理由」が分からないのではなくて、その必要がないという判断でそこに書いているんだよ。
下手なわけではない。
通常、$.ajaxの場合はそこでしか使われない関数になるから、ネスト派ならそこにだらだら書く方が自然なんだ。
ただ、「ネストが深くなる」のが嫌いなくせに、「ネストでしか書かない」のが俺には疑問なんだ。
583:デフォルトの名無しさん
16/06/11 17:31:06.27 aOjkg+66.net
>>523
毎度ありがとうございます。
> 機会があれば、是非新しい世界を作ることに挑戦してみてほしい
今回のことで色々勉強させてもらいましたので、
次に生かせたいと思います! 色々ありがとうございまし!
584:デフォルトの名無しさん
16/06/11 17:31:44.01 aOjkg+66.net
おっw
×まし!
○ました!
585:デフォルトの名無しさん
16/06/11 18:02:04.85 NAulAg4n.net
>>566
> 下手なわけではない。
> 通常、$.ajaxの場合はそこでしか使われない関数になるから、ネスト派ならそこにだらだら書く方が自然なんだ。
> ただ、「ネストが深くなる」のが嫌いなくせに、「ネストでしか書かない」のが俺には疑問なんだ。 <
586:br> いや、俺は$.ajaxでDeferred使うし、やっぱり下手なだけじゃね?
587:デフォルトの名無しさん
16/06/11 18:05:04.82 NAulAg4n.net
>>563
> どれが適切なんでしょうか
どれか迷ったら、一番楽な方法を選べばいいよw
何でもそうだけど原則として楽になるように作られてるわけなんだしさ。
しばらくPromiseは触ってないから忘れたが、throwで任意のエラーオブジェクトでも
投げればいいんじゃね?
588:デフォルトの名無しさん
16/06/11 18:07:10.39 NAulAg4n.net
>>565
> クラスの場合は、コンストラクタだけ呼べても意味がないだろ。
意味あるぞ?
function NantokaManager(params) {
this.params = params;
this.run = function() {}
}
var manager = new NantokaManager;
manager.run()
とかさ。
589:デフォルトの名無しさん
16/06/11 18:08:34.97 NAulAg4n.net
>>565
> 誰も普通の関数 hoge を全部 var hoge = function(){} と書けとは言ってない。
> お前が話について来れてないだけ。
俺もそんな話はしていない。
ついてこいよw
590:デフォルトの名無しさん
16/06/11 19:28:03.24 ZhHlBSFM.net
>>571-572
すまんが意味が分からんし、お前の主張も分からん。
その場合の駄目なコードとそちらの主張を対で出せるか?(以下例のように)
一応こちらの意見をもう一度言っておくと、
function hoge(){} // OK。通常の関数はこちら。
var Hoge = function(){}; // コンストラクタの場合はこっちの方がよさそう
となる。
そのコードが「共通プロトタイプを持たない場合」に限定しているつもりなら、勝手にどうぞでしかない。
591:デフォルトの名無しさん
16/06/11 19:33:03.15 NAulAg4n.net
>>573
え? お前コードは必ずプロトタイプを持つものっていう前提なの?
どうやらお前は限定しているようだが、
俺は、どんな限定もしていない。
592:デフォルトの名無しさん
16/06/11 19:40:17.64 ZhHlBSFM.net
>>574
何が言いたいのか分からん。
そちらが説明しきれないのなら、相互理解は不能だから終わりでいい。
593:デフォルトの名無しさん
16/06/11 21:27:53.17 NAulAg4n.net
>>575
お前がこう言ってきたんだろ?
> クラスの場合は、コンストラクタだけ呼べても意味がないだろ。
だから俺は、コンストラクタだけ呼べても意味がある場合を言ったまで。
そしたらお前が「俺は共通プロトタイプをもった場合に限定してるんだ」って
いい出したんだろw
俺はお前と違って何も限定していない。
コンストラクタだけ呼べても意味がある場合は
実際に存在している。
594:デフォルトの名無しさん
16/06/11 22:29:21.64 ZhHlBSFM.net
>>576
なるほど、お前は人殺し君か。
どおりで話が通じないわけだ。
595:デフォルトの名無しさん
16/06/12 00:46:04.68 hCgFiHr7.net
多分人殺しくんとは俺の事だろうが、
>>576は俺ではないし、正直、ID:ZhHlBSFMは頑張って色々回答してるけど実務レベルではないわ。
処理は上から下へ流れるように、なんて、飼い犬が死んでも言わんレベルのたわ言じゃん。
相互に呼び出し合う事のある関数なんかどういう順序で記述するんだろ。
イベンハンドラやら、タイマーのハンドラは、どの順序なのかな。
子供のお題目にしか聞こえん。
逆に何年目か教えてほしいわw
何度かこういう言い方してるけど、ああいう悔しがり方とキレ方する奴が具体的にすら言えないってことは、ほんとに経験無いガクセーさんなんだろうけど。
596:デフォルトの名無しさん
16/06/12 00:51:30.61 CJz8oq6+.net
後学のためにID真っ赤にしてる方々の書いた素晴らしいスクリプトを見せてくださいよ
597:576
16/06/12 00:51:41.20 AMLyjVO9.net
>>578
お前のことだったんかw
いきなりなんか言われて意味不明だったわ。
えーと何の話だっけ?
同期命令が使える言語で、
sleep(1000)
console.log(1)
sleep(1000)
console.log(2)
sleep(1000)
console.log(3)
と書きたくなるようなコードを、ネストして書くだけでも苦痛なのに、これを関数に分解して
function Main_1() {
sleep(1000)
console.log(1)
}
function Main_2() {
sleep(1000)
console.log(2)
}
function Main_3() {
sleep(1000)
console.log(3)
}
とかやりたくないわけでw
あと関数なのに、大文字から始めってる時点で、経験不足だってことがわかるよ。
念の為に言っておくと、上のMain_1とか言うのは俺がいい出した名前じゃないからねw
598:デフォルトの名無しさん
16/06/12 00:52:45.85 AMLyjVO9.net
>>579
俺は何回も書いてるよ。
>>546とか読んでみな。(俺が>>546という意味ではない)
599:デフォルトの名無しさん
16/06/12 01:26:35.68 npk74fIw.net
はいはい自演乙。
自演じゃないならレベルの高い>>578-581の間で色々解決できるだろうから頑張れ。
600:デフォルトの名無しさん
16/06/12 01:33:50.33 AMLyjVO9.net
> 自演じゃないならレベルの高い>>578-581の間で色々解決できるだろうから頑張れ。
自演じゃないぞw
解決できるだろうけど、その前に何も解決すべき
課題が出てないじゃないかw
そして、俺とお前は他人だろ?
その理屈ならいろいろ解決できるだろうな。
何か言ってみろ。俺は手伝わないがwww
601:デフォルトの名無しさん
16/06/12 01:40:01.79 m2Zib5nl.net
あ?なんだこのゴミみたいな木っ端は
最低でも1000行以上あるプログラムとして成立してるもんもってこいや
602:デフォルトの名無しさん
16/06/12 01:43:07.89 npk74fIw.net
>>583
じゃあとりあえず>>578の疑問に答えてやれよ
> 相互に呼び出し合う事のある関数なんかどういう順序で記述するんだろ。
> イベンハンドラやら、タイマーのハンドラは、どの順序なのかな。
厳密にはこれは質問ではないから、「俺がどう書くか」の予想でもいいぞ。
とにかくお前らで色々話をしてみろ。
面白そうなら俺も加わるし、他も加わってくるだろう。
どうでもよければ無視されるだけだ。
603:デフォルトの名無しさん
16/06/12 02:01:39.12 AMLyjVO9.net
>>585
どうせ質問に答えても自演じゃないって認めないんだろw
まあ質問じゃないとお前もわかってるようだから、それにレスしろと
いうならば、レスするのは何の問題もない。
>>578
> 相互に呼び出し合う事のある関数なんかどういう順序で記述するんだろ。
> イベンハンドラやら、タイマーのハンドラは、どの順序なのかな。
全くだなw 必ずしも上から書けるわけがない。
関数を呼び出される順番に書くとか言っているやつは馬鹿じゃないだおろうかね
どういう順番で書くかは、ばらばらで人によってはアルファベット順ってこともあるだろう。
だから必要もないのに小さな関数に分けるなんて論外。
一つの関数にし、ネストがいやだからPromiseというのが使われるようになった。
この件に関しては、俺は>>578と同じ意見だろうな
604:デフォルトの名無しさん
16/06/12 02:36:10.54 npk74fIw.net
>>586
> この件に関しては、俺は>>578と同じ意見だろうな
そりゃ同一人物だからなw
まあ、人殺し君も多投するタイプだから、待ってればレスが返ってくるはずだ。
そして本当に別人なら、色々意見交換すれば相違点が発見できるだろう。
それは俺関係なしにいいことだから、やってみることだね。
605:デフォルトの名無しさん
16/06/12 02:56:48.44 hCgFiHr7.net
>>587
同一人物とかよくわからんな。
俺が連投するのは暇だからで、まともに過ごしてる時はそれなりにしか書かんけど。
10日間際は忙しいからな。
まさか本気で同一人物だと思ってたら笑えるww
606:デフォルトの名無しさん
16/06/12 03:17:12.70 hCgFiHr7.net
>>586
うむ。アルファベット順ならまだマシだけど。
台帳に書いてある順とかちょっとびっくりする会社もあるからな。どことは言わんけど。
多分業務経験ない奴は笑うだけだが、
実務やってれば「NDA結ばないとリバースエンジニアリングすら難しい」という人間minifierだったりする。
必要に応じて関数は分けるべきというより、むしろ、関数は射影的であるべきだと思う。
コールバック関数のネストを「関数と関数を繋いでる」と単純に誤解して悪手だと思ってほしくないのが、
本来は関数と「関数を引数に取る関数」を定義して、「関数を引数にとる関数」に関数を食わせるが為の手段を逆に見た結果、「コールバック」って姿に見えてるだけ。
だから、yieldとジェネレーターを使おうが、Promiseを使おうが、本来は何一つ定義が変わってる訳でも、処理が変わってる訳でも無い。
関数に関数を食わせて値を取り出してる。
・水を冷やして出来た物を、回転する鉋で削って、皿に落とし入れたもの、
・皿で受け止めた、回転する鉋で削られた、冷やされた水、
・回転する鉋で水を冷やして出来た塊を削り、皿に落としたもの
は全部主題が同じもの。
水を冷やす、という関数と水を、値として「氷」と扱おうが、
かき氷機を「『水を冷やした物』削り機」と展開しようが、とう扱うかは使い方次第。
そこに、ニーズ外の要件なんて無いの。扱いにくいとかどうでもいいんよ。
また、undefinedの時と同じ勘違いしてるけどさ。
水→機械A→中間生成物→機械B→製品、
というシーケンスであらわすのが正しいのか、
((水→機械A)→機械B)→製品、とフローで合わすのかは瑣末すぎるほどの差。
しかし、言われてるのは俺じゃないが、関数を大文字から始めると経験不足なんだwww
C20年目かもしれんけどな、そういう人はww
607:デフォルトの名無しさん
16/06/12 03:21:29.67 hCgFiHr7.net
こいつ、言われたくないことを人に言って安全圏に逃げたいだけなんだろうなぁ。ユング的なシャドウをもう少し悪く歪めたものが見えるわ。
voidとか、岡部健みたいな感じの破綻者に対して憧れてる人間、くらい性根がさもしい。
608:デフォルトの名無しさん
16/06/12 09:01:52.07 AMLyjVO9.net
>>587
だから同一人物じゃねーよw
609:デフォルトの名無しさん
16/06/12 09:04:46.11 AMLyjVO9.net
>>589
> しかし、言われてるのは俺じゃないが、関数を大文字から始めると経験不足なんだwww
JavaScriptのコーディング規約はいくつもあるが、どれも関数は小文字で始める。クラスは大文字。
JavaScriptの経験があるなら、これに従ってるはずなので
見た瞬間気持ち悪さを感じるものだよw
610:デフォルトの名無しさん
16/06/12 09:10:26.75 AMLyjVO9.net
>>589
> だから、yieldとジェネレーターを使おうが、Promiseを使おうが、本来は何一つ定義が変わってる訳でも、処理が変わってる訳でも無い。
処理が変わってるわけでもない・・・ならば
読みやすい方がいいだろ?
逆に考えれば、どんなに読みづらく書いても
処理が変わっていないというコードにすることはできるだろう?
読みづらくても処理が同じならいいと言うのか?
そうではないだろう。
コードっていうのは書いて終わりじゃない。修正するもの。
むしろ読むほうが多いので、書くよりも読むほうが大事。
だから「可読性」という言葉がある。「可書性」という言葉はない。
> そこに、ニーズ外の要件なんて無いの。扱いにくいとかどうでもいいんよ。
俺はいまだかつて「時間的に早く書けて修正も簡単で、メンテナンスにかかるコストが低い」
という要件がなかったことはないぞw
どんなプロジェクトでも安く仕上げることは、暗黙的に含まれてる要件だ。
611:デフォルトの名無しさん
16/06/12 13:15:07.43 npk74fIw.net
別人であればもっと議論が深まるはずだよな。
みんな見てくれてるから、せいぜい頑張れ。
612:デフォルトの名無しさん
16/06/12 13:19:20.40 AMLyjVO9.net
どうあっても別人と認めたくないようだ(笑)
613:デフォルトの名無しさん
16/06/12 13:20:50.61 AMLyjVO9.net
あ、なるほど。話が進むと今度は
一人だから意図的に会話できる。
それが自作自演の証拠って言うつもりだなw
614:デフォルトの名無しさん
16/06/12 15:04:26.78 npk74fIw.net
いやきみ(ら)にとっては俺はただの馬鹿なんだろ。
だったら俺を引っ張り出す方向のレスを付けること自体おかしいだろ。
ガン無視してくれよw
いずれにしても、君らが「別人」かどうかは皆が判断することであって、
俺が「自演」主張しても、逆に君らが「別人」主張しても意味無いんだよ。
どちらがキチガイかは皆が判断してくれる。
そして一つアドバイスをするなら、君のキャラなら>>592は
「え?お前偉そうなこと言っている割には『大文字』のルールも知らないんだwww」
と煽るべきだった。キャラを変えると自然な自演に見えない。
君も煽りで相手を引き出すキャラなんだし、
このレスなら人殺し君のキャラなら確実に食いついてくるし。
本当に別人なら、君らが会話すれば君らにとっても得る物があるはず。だからもっとやればいい。
いちいち俺に対してキョロキョロしたり、
或いはここに来て会話を終わらせる方向にキャラ変更するのは不自然だ。
はい続きをどうぞ。
615:デフォルトの名無しさん
16/06/12 16:27:25.35 9HFtYPb0.net
その人殺し君とかいうのに論破されちゃって
悔しくて大ハッスルしてるの?
616:デフォルトの名無しさん
16/06/12 16:54:18.02 hCgFiHr7.net
>>592
そりゃ、javascriptの規約はいくらでもあるだろうけど、
javascriptの規約しか知らないどころか、ありえないような口ぶりで話してたからねw
なんかからトランスパイルするなら、こうなるだろうな、って考えたりしないんだ、って感じ。
>>593
もちろんそう。
しかし、読みやすいのと書きやすいのと、定義しやすいのはそれぞれ別の概念だから、そういう意味では可読性に相当する単語は、独立性とか、依存度とか、抽象度とか
見方次第でいくらでも変わるものじゃないか?
安くあげる事より、致命的な不具合を出さない事の方が求められるプロジェクトしかやってないからな。
正直、安くなくても売れるから。
安くないほうが売れるとも言えるレベルで。
>>597
お前ほんと何と戦ってんの?
617:デフォルトの名無しさん
16/06/12 19:20:47.80 npk74fIw.net
>>599
> わざとこの態度だからなぁ。 (>>327)
煽っていくスタイルプリーズ
618:デフォルトの名無しさん
16/06/12 19:39:15.05 AMLyjVO9.net
> なんかからトランスパイルするなら、こうなるだろうな、
なんでそんなコード書くの?www
619:デフォルトの名無しさん
16/06/12 19:40:36.87 z4XaqaSO.net
function f(a) {
let t = a;
t[0] = 1;
console.log(a);
console.log(t);
}
let a = [0];
f(a);
これaも[1]になっちゃうんですが
ES2015とか新しい書き方で配列をコピーする方法ありませんか?
620:デフォルトの名無しさん
16/06/12 19:41:46.51 AMLyjVO9.net
>>597
> どちらがキチガイかは皆が判断してくれる。
お前がキチガイだって俺は判断したよwww
621:デフォルトの名無しさん
16/06/12 22:24:47.44 QKWa7och.net
芝生くっつけるやつにろくなのはいないってのは間違いなさそうだ
622:デフォルトの名無しさん
16/06/12 22:34:59.19 npk74fIw.net
>>601
馬鹿にはちゃんと安価付けろ。気づいてもらえないぞ。
てかお前もちゃんと煽れよ。
>>599
>>601は>>599宛だぞ。
おーい。煽られてるぞー。
623:デフォルトの名無しさん
16/06/12 22:46:30.04 xguVhByI.net
そりゃ別人なんだから、煽りもするわwww
624:デフォルトの名無しさん
16/06/12 23:31:28.41 GjxFekK/.net
>>602
concat
625:デフォルトの名無しさん
16/06/12 23:34:06.35 xguVhByI.net
shallowコピーの場合はconcatでいいよね。
最初は?ってなるけど、知ってしまえば簡単に覚えられるし。
なんらかのdeepコピーの場合はライブラリ使うしか無いかな?
626:デフォルトの名無しさん
16/06/12 23:54:06.37 npk74fIw.net
いやシャローコピーは slice() だと思うが。
627:デフォルトの名無しさん
16/06/12 23:56:00.26 hCgFiHr7.net
>>605
お前、脳みその代わりにババロア詰まってて、しかも微妙に機能してんじゃねえの?
一番煽られてんのはお前だと思うんだけどw
恥ずかしくねえのかな。。
628:デフォルトの名無しさん
16/06/12 23:57:34.48 hCgFiHr7.net
>>608
JSON.parse(JSON.stringify(obj))
が、一番手軽で早い。
629:デフォルトの名無しさん
16/06/13 00:05:59.69 6Ot446qT.net
>>611
関数コピーできない。
日付がおかしくなる。
undefinedが消える。
使えないねw
630:デフォルトの名無しさん
16/06/13 00:15:43.00 rTAmnA9g.net
>>612
値をコピーするなら十分でしょ。
関数をコピーとか必要性がわからんし、
undefinedが消えるって、元からundefinedだったんだから、消えてないでしょ。
undefinedが消えるってのは、undefinedで無くなるときだよ。
お前の頭が使えねえなぁ。
631:デフォルトの名無しさん
16/06/13 00:15:53.62 +G6yi6vX.net
let の宣言場所について質問させてください
for文の中でのみ使う変数を let で宣言しようとしたら、forの中と外どちらで宣言したほうがいいんでしょうか
632:デフォルトの名無しさん
16/06/13 00:32:34.63 6Ot446qT.net
>>613
> 値をコピーするなら十分でしょ。
勝手に決めるな。
日付がおかしくなる問題は解決できてないし、
undefinedが消えるっていうのは、キーが無くなるんだよ。
まったく使えないって言ってるだろ
633:デフォルトの名無しさん
16/06/13 00:40:16.01 6Ot446qT.net
>>614
どうするのが一番可読性が良いかを考えれば自ずと答えは出る。
可読性を高くするには、頭の中で覚えておくコードを少なくするということでもある。
だからより小さい範囲、つまりfor文の中で書くのが良い。
ただし、for文の行でいろいろ書くなよ?w
for (let i = 0, l = array.length; i < l; i++)
for文の行でやるのは多くてもこれだけ(インデックス用の変数と終了条件)だ
for (let i = 0, l = array.length, foo, bar, baz; i < l; i++)
なんてfor文とは関係ない変数を宣言しないように。
言い換えると、変数に代入しないletはやってはいけないってこと。
let v = 0; // OK
let v; // NG
またletではなくconstを使ったほうが良いぞ
constは再代入が不可能になる。つまり変数に入れた値を変えることが出来ない。
それでプログラミングが出来るのか?って思うかもしれないができるんだ。
関数型プログラミングの考え方を取り入れると殆どconstでよくなる。
634:デフォルトの名無しさん
16/06/13 01:17:56.81 +G6yi6vX.net
>>616
むむむ・・・ インデックス用の変数でも終了条件でもないです
後で見たときに何をしているか分かりやすいように、計算途中の値に名前をつけて一時変数に入れていました
forの試行毎に新しい計算値が入ります
635:デフォルトの名無しさん
16/06/13 01:49:05.39 6Ot446qT.net
>>617
つまりこういうことでしょう?
for(let i = 0; i < 10; i++) {
let value = i * 10
console.log(value);
}
当然forの中だよ。中でしか使わないんだから。
そしてこれはconstに置き換えられる。
for(let i = 0; i < 10; i++) {
const value = i * 10
console.log(value);
}
ループ毎に新しく作られるからだ。
このconst valueをforの外に置くことは出来ない。
636:デフォルトの名無しさん
16/06/13 02:07:05.34 LLEcmK37.net
es2015で()=>をつかえばthisの挙動を変更できるのに
なんでjavascriptでdeep copyができないのですか?
}
637:デフォルトの名無しさん
16/06/13 02:13:16.73 +G6yi6vX.net
>>618
ありがとうございます! forの中に引っ越します
varに慣れていたので繰り返し処理のなかで宣言するのに違和感があったんですよね
638:デフォルトの名無しさん
16/06/13 02:41:54.70 6Ot446qT.net
俺はvarのときからforの中に書いていたけどね。
そこだけでしか使わないし、別に文法エラーでもなんでも無いんだから。
639:デフォルトの名無しさん
16/06/13 06:18:58.38 o3uO7eJP.net
>>615
キーが無くなるのと、キーに対応する値にundefinedが入ってるのは同値だろ。
だから、undefinedを代入してる!みたいな勘違いしたのかな?頭おかしいのかなw
日付がおかしくなるって具体的にはどう言うこと?エポックがズレるみたいな話では無くて、型が誤解されるみたいな話なら苦笑いだな。
>>616
変数に代入しないlet、では無いんじゃねえの?
仮宣言みたいなもんで。
640:デフォルトの名無しさん
16/06/13 07:23:07.35 +G6yi6vX.net
スコープ先頭での let a; がダメとなると、スコープ後半
641:になってから代入する値が確定するケースではどうしてるんでしょう? コード修正時にtemporal dead zoneによるミスを起こし易いので、スコープ途中でlet宣言する場合は、明示的に新たにブロックスコープを作ったほうがいいと書いてあるのをどこかで読んだんですが、 最後まで使う変数にそれをするとスコープのためだけにネストが深くなってしまって気持ち悪いです
642:デフォルトの名無しさん
16/06/13 07:33:47.84 ZIxcBfsq.net
>>623
let a=nullで宣言しておいたら?
643:デフォルトの名無しさん
16/06/13 09:10:57.92 6Ot446qT.net
>>622
> キーが無くなるのと、キーに対応する値にundefinedが入ってるのは同値だろ。
違うぞw
keysで出力されるもの見てみwww
644:デフォルトの名無しさん
16/06/13 09:47:02.30 uHiiHky6.net
普通にブロック内に書けばいいんじゃないの?
わざわざブロック使えなんていうなら、関数全体で同じことしてるvarだって先頭で全部明示しろってなると思うんだけど
645:デフォルトの名無しさん
16/06/13 09:57:57.31 CfEi32hJ.net
>>612が指摘している問題はおそらく、こういうこと
var obj = {fn: function fn () {}, date: new Date, undefined: undefined};
console.log(obj);
console.log(JSON.stringify(obj)); // "{"date":"2016-06-13T00:45:07.522Z"}"
console.log(JSON.parse(JSON.stringify(obj))); // {"date":"2016-06-13T00:45:07.522Z"}
var array = [function fn () {}, new Date, undefined];
console.log(array);
console.log(JSON.stringify(array)); // "[null,"2016-06-13T00:48:58.483Z",null]"
console.log(JSON.parse(JSON.stringify(array))); // [null, "2016-06-13T00:52:23.947Z", null]
646:デフォルトの名無しさん
16/06/13 10:10:14.80 CfEi32hJ.net
JSON.stringify の一番の問題は new Object, new Array 以外の Object 型を扱えない事
new Date なら String 型に変換されるだけだから new Date し直す方法がある(ただし、参照は失われるので参照比較できなくなる)が、それ以外はどうしようもない
function Person (name) { this.name = String(name); }
var obj = {person: new Person('太郎')};
var obj2 = JSON.parse(JSON.stringify(obj));
console.log(obj); // {person: Person {name: "太郎"}}
console.log(obj.person instanceof Person); // true
console.log(JSON.stringify(obj)); // {"person":{"name":"太郎"}}
console.log(obj2); // // {person: Object {name: "太郎"}}
console.log(obj2.person instanceof Person); // false
今のところ、deep copy する標準関数はないので Object.assign を使って自前で deep copy 関数を作るのが妥当
647:デフォルトの名無しさん
16/06/13 10:57:57.06 ZIxcBfsq.net
>>625
あのさ、keysで定義されていてもその中身はundefinedなんだろ?
なら、データとしての扱われ方として、同じだと思うんだけど。
キーがある事が大切であれば、キーを列挙したもの、というデータがあるべきだと思うんだけどどうなの?
>>628
あーなるほど、そういうことか。
参照を失わせるために、そういう事するんだから、であればそのオブジェクトの.toJSONを定義してやるべきだろうね。
648:デフォルトの名無しさん
16/06/13 11:55:17.37 CfEi32hJ.net
>>629
> あのさ、keysで定義されていてもその中身はundefinedなんだろ?
横から口を出すが、hasOwnPropety の結果が異なるから同じではない
「undefinedを代入する設計が筋が悪い」といわれればその通りだが、「同じ」ではない
実際、プロパティの存在チェックなら obj.prop !== undefined よりも obj.hasOwnProperty('prop') を使うべきだ
var obj = {undefined:undefined}, obj2 = {};
console.log(obj.hasOwnProperty('undefined')); // true
console.log(obj2.hasOwnProperty('undefined')); // false
> 参照を失わせるために、そういう事するんだから、であればそのオブジェクトの.toJSONを定義してやるべきだろうね。
プリミティブデータの倉庫として使うなら JSON.stringify で良いが、new Object, new Array 以外は参照を失わせるべきではないのでは?
>>628でいえば、new Person('太郎') を {name: '太郎'} に書き換えるメリットがない
649:デフォルトの名無しさん
16/06/13 12:22:56.73 CfEi32hJ.net
> 参照を失わせるために、そういう事するんだから、であればそのオブジェクトの.toJSONを定義してやるべきだろうね。
ひょっとして、new Person する為の拡張構文をJSON に追加してやるといいたかったのだろうか
私が deep copy するのは構造を書き換えたいが、元の構造も残したい場合だからデータそのものは元のままでいい
new Person('太郎') はたった一人の太郎であり、同名の太郎を作ってもらっては困る
同名オブジェクトを作ると taro === person の比較が出来ず、person instanceof Person && taro.name === person.name のようにダックタイピング的に比較しなければならない
こうなるともう new Person を定義した意味がなく、{name: '太郎'} を生成したのと大して変わらない
650:デフォルトの名無しさん
16/06/13 13:52:54.74 KnYKOJ/M.net
>>630
あー、わからんでもない。
undefinedを値として使う、ってニーズがあれは、それもまた真なんだろうな。
そうなると、assignでもなくオブジェクト毎にちゃんとcloneを実装すべきって感じか。
>>631
ちょっとまって、それはdeepcopyでは無いんじゃないの?
ただの参照の張替えじゃないか。
比較するのであれば、それはequals的なメソッドを作るか、諦めて、stringifyした物同士が同じになるかを比較すべきだろ。
651:デフォルトの名無しさん
16/06/13 17:10:28.33 CILZ2bdj.net
>>632
{}, [] は deep copy する
[{person: new Person('太郎')}, {person: new Person('一朗')}]
逆に new Person を deep copy したいと思う状況が分からない
new Date も関数も期待通りに動かないわけで汎用性が大きく犠牲になっていると思うが…
652:デフォルトの名無しさん
16/06/13 17:51:17.99 u+uz+gNL.net
ボタンをクリックしたいのですがどう書けばいいかわかりません>_<
ソースはこれです↓
URLリンク(i.imgur.com)
653:デフォルトの名無しさん
16/06/13 17:52:47.17 viWjyZUM.net
変数宣言って同じ人でもいまいち一貫性が感じられないんだけどさ
はるか遠くで使うのに頭に全部羅列してるかとおもいきや次は使う直前に書いてたり
そうしなきゃいけない時ももちろんあるけど、特にそういう理由も見受けられないのもいっぱいある
あまり詳しくないんだがなんか意味あるのああいうの
654:デフォルトの名無しさん
16/06/13 18:30:36.62 K+DNMsci.net
>>633
状況がわからない、とか言ってちゃぶ台返しされても。。
deepcopyの話じゃないの?
それはシャローコピーそのものじゃん。。一番上っ面だけコピーするって。
Personをdeepcopyしたいって要件ならいくらでもあるじゃん。
オブジェクト変更するから、変更前の「前回オブジェクト」を持っておきたいとか、
保存ボタン押すときに、保存の必要性あるか確認したいから、オブジェクトと退避オブジェクトを比較したい、その退避オブジェクトを作るとか。
655:デフォルトの名無しさん
16/06/13 20:36:13.44 WO2lddk8.net
private変数っぽくしたいときにこうするのってどう?
var Foo = function () {this.private = {};};
Foo.prototype.getBar = function () {return this.private.bar;};
Foo.prototype.setBar = function (b) {this.private.bar = b;};
var foo = new Foo();
{
let _baz;
foo.getBaz = function () {return _bar;};
foo.setBaz = function (b) {_bar = b;};
}
後者はインスタンスごとにgetter/setterをクロージャにしなきゃいけなくて不満。
前者はfoo.private.barで手が届いちゃうものの、意図は明確でそれで十分な気が。
private変数っ「ぽく」したいだけの場合、前者の方法はどう? みんなどう思う?
あとjavascript界隈に既に、こういう「ぽく」したい場合のイディオムってある?
656:デフォルトの名無しさん
16/06/13 21:22:27.21 pgYO3XjB.net
to infinity and beyond
657:デフォルトの名無しさん
16/06/13 22:52:41.14 O5DunmIw.net
>>636
だから、{}, [] は deep copy するといっているのだが
次の構造は正しくdeep copyされる
[[[1], [2]], [[3], [4]]]
{a: {1: true}, b: {2: false}}
一口にdeep copyといってもいろいろ問題があるわけで「この問題にあなたはどう考えているのか?」
- 関数はdeep copy出来ない(そもそも、スコープが変わったら動かなくなる可能性がある)
- customコンストラクタはdeep copy出来ない
- その他、Array, Object以外のdeep copyも難しい
この問題は個々がdeep copyする状況によって解決策が変わるだろうからあなたの考えがな聞きたかった
658:デフォルトの名無しさん
16/06/13 22:57:06.96 O5DunmIw.net
>>636
> オブジェクト変更するから、変更前の「前回オブジェクト」を持っておきたいとか、
なるほど、その発想はなかったな
私ならPersonかPersonを管理するクラスを作ってその中で履歴を管理しそうだ
659:デフォルトの名無しさん
16/06/13 23:38:40.69 K+DNMsci.net
>>639
だから、あのさあ。。
他の言語で考えてみれば?そんな関数は、jsで言う、そのインスタンスのプロトタイプが持つべきで、そのインスタンスが持つべきものじゃないでしょ。
二回目だけど、それはdeepcopyではない。
どうしてもしたければ、laveでもしろ。
問題が理解出来てなさすぎるんじゃないか?
>>640
Personを管理するクラスを作ったなら、そいつが持つのは一体何なんだ?
Personじゃないの?
「Person」と、「Personのコピー」と、「PersonとPersonのコピーを管理するクラス」って無駄すぎるだろ。
どう考えてもPersonを正しくコピー出来るべきで、Personのインスタンス同士を中身を使って比較出来るべきじゃないの?
660:デフォルトの名無しさん
16/06/13 23:45:19.16 O5DunmIw.net
>>641
JSONでもdeep copy出来てなかったと思うのだが
否定ばかりであなたの考える最善が何も出てこないな
661:デフォルトの名無しさん
16/06/14 00:47:25.44 DODkZCvX.net
JavaScriptで deep copy に最適解は存在しないので自分のポリシーに照らし合わせて一番無理のない実装を考える
例えば、次のオブジェクトの deep copy が難しい
var obj = {
date: new Date,
regexp: /test/g,
img: new Image(100, 100),
window: window,
document: document.implementation.createHTMLDocument('sample'),
elementInIframe: document.querySelector('iframe').contentDocument.getElementById('hoge'),
fn: (function (i) { return function fn () { return i++; }; }(0))
};
date, regexp は getPrototypeOf で [[Prototype]] を確認すれば実装可能
img, document, elementInIframe は cloneNode で可能
window は new Window する仕組みがないと難しい
fn は Function#toString を取るだけではスコープの問題を解決不可能なので無理
この調子で一つ一つ対処していったらキリがないのでどこかで妥協するのが普通
ちなみに、deep copyでJSONを持ち出すのは妥協の結果であり、他を圧倒するほどのメリットはない(そもそも、シリアライズする意味がない)
それぞれの妥協解を開示して意見を募るぐらいが妥当ではないかね
662:デフォルトの名無しさん
16/06/14 02:01:10.19 9x/TacpJ.net
>>642
最善は、オブジェクトはオブジェクトとして、関数をもたず、単なるデータの塊として、関数とは別に定義して、
stringify/parseで文字列と相互に変換できる、だよ。
ネットワークを経てrpc的なもので関数呼び合うにも便利だし。
値の持ち主が関数を持つのは好きじゃない。
>>643
圧倒するほどのメリットと言えば、それこそAPIやら、socket.ioを経ても素直に透過な所じゃないかな。
663:デフォルトの名無しさん
16/06/14 02:03:53.91 M6DJWkXG.net
>>644
日付が壊れる問題はどうすんの?
664:デフォルトの名無しさん
16/06/14 02:06:47.27 M6DJWkXG.net
あれ?もしかしてまだ日付が壊れる問題の詳細でてなかったの?
日付らしき文字があったからもう情報出てると思ってたw
まあぐぐればすぐに分かるよね?って話。
JavaScriptのDeepCopyでJSON.parse/stringifyを使ってはいけない
URLリンク(qiita.com)
665:デフォルトの名無しさん
16/06/14 02:11:20.97 M6DJWkXG.net
>>644
> 最善は、オブジェクトはオブジェクトとして、関数をもたず、単なるデータの塊として、関数とは別に定義して、
> stringify/parseで文字列と相互に変換できる、だよ。
理由がないよね。
> ネットワークを経てrpc的なもので関数呼び合うにも便利だし。
今はDeep Copyの話をしている。
シリアライズの話なら別でやれ
666:デフォルトの名無しさん
16/06/14 02:24:34.32 TbEnZJwB.net
>>645-646
なんでこういう事いう奴のJSON.parse/stringifyには第二引数がないんだろう?w
667:デフォルトの名無しさん
16/06/14 02:31:07.43 M6DJWkXG.net
JSON.parse/stringifyには第二引数で頑張ればできるという誤解が
広まらないように先に言っておくと、これはNumber、String、Booleanにしか
対応できません。
668:デフォルトの名無しさん
16/06/14 04:26:35.95 TbEnZJwB.net
>>649
嘘吐くなよ試しちまったじゃねぇかw
parseに渡すreviverは文字列を受け取って問題なくオブジェクトを返せるし
stringifyに渡すreplacerはオブジェクトを受け取って任意の文字列に変換出来る
別にコピーのためだけに局所的に使うならreplacerは正しいjsonを吐く必要もないしな
復元のための情報山盛りにして吐き出せばいい
Dateとundefinedを試してコピー出来たのは確認した
Functionとクロージャはスコープの問題があるのでシャローコピーにせざるを得ないが
同一スコープ内でstringify/parseをするならreviverでオリジナルから参照をコピーするのは簡単だ
ただまあここまでやるのはシリアライザとデシリアライザを自前で実装するのと変わらんからオブジェクトを直接弄った方が早いなw
ところでディープコピーってjQueryからextendメソッドをパクって来るんじゃダメなんか?
循環参照で死ぬので他のライブラリのでもいいがディープコピーを実現しようとしてるライブラリは少なくないと思うんだが
669:デフォルトの名無しさん
16/06/14 09:05:34.57 BcKyLCvc.net
>>634
「js button click event」で検索!
670:デフォルトの名無しさん
16/06/14 09:26:05.33 VOPCCsis.net
>>651
「いやです!>_<」
671:デフォルトの名無しさん
16/06/14 09:30:58.95 DODkZCvX.net
>>644
> 最善は、オブジェクトはオブジェクトとして、関数をもたず、単なるデータの塊として
だから、それをどうやって実装するのか、という事を聞いているのだが
「データの塊」とはJSONにあるような「プロパティの塊」の事か?
function Person (name) { this.name = String(name); }
var obj = {name1: new Person('Ken'), name2: {name: 'Ken'}};
console.log(JSON.stringify(obj)); // "{"name1":{"name":"Ken"},"name2":{"name":"Ken"}}"
結局、JSONの問題点は克服できてないのだが
あなたの頭の中がJSONに最適化されているからJSONにそぐわないコードを意識的に追い出しているに過ぎない
- 関数が消されるが、使わないので問題ない
- undefined は消されるが、undefined をプロパティ値に持たないので問題ない
- new Date は String 型に変換されるが、後で new Date し直すので問題ない
- new Arrayを除く全てのオブジェクトは new Object に変換されるが、オブジェクトおを「プロパティの塊」としかみないので問題ない
- new Date(2016, 5, 14, 9, 0, 0) と "2016-06-14T00:00:00.000Z" が同値を認識されるが、データの塊としか見ないので問題ない
- new function Person (name) { this.name = name; }('Ken') と {name: 'Ken'} が同値と認識されるが、オブジェクトを「プロパティの塊」としか見ないので問題ない
> 圧倒するほどのメリットと言えば、それこそAPIやら、socket.ioを経ても素直に透過な所じゃないかな。
JSONはシリアライズ不可能なオブジェクトを扱えないデメリットがある
「あなたは」シリアライズ不可能なオブジェクトを使わないからJSONが最適解だが、「私は」シリアライズ不可能なオブジェクトを扱うので最適解が「シリアライズ不可能なオブジェクトを社ローコピーする」になっている
トレードオフの関係にあることは間違いない
672:デフォルトの名無しさん
16/06/14 09:41:30.57 DODkZCvX.net
>>643の obj を JSON.stringify(obj); すると SyntaxError になるな
673:デフォルトの名無しさん
16/06/14 10:11:55.55 dYSnVaKQ.net
>>653
最適解が「シャローコピー」となる、その主語はなに?
何に関して議論してるの?
674:デフォルトの名無しさん
16/06/14 10:29:28.31 ScASA3Ww.net
別にJSON使ってもいいと思うけど、
別の手としてはMessageChannel使えば非同期で循環参照も扱える
まあJSONも少し手を加えれば循環参照を扱えるが
昔作ったこんな感じで
URLリンク(ideone.com)
昔関数も扱えないかと考えたことがある
まあちょっとコピーとは感じが違うが、NodeとブラウザでWSを使いオブジェクトを共有しようと思っていた。
その時はオブジェクト情報を送るのではなく影となるProxyを使い、
操作を原本に問い合わせることでだいたい可能という判断になった。
原本に与える影響を最小限にして、あたかもでディープコピーされたかのように振る舞うのも
まあ巧みなProxyとレシーバーを守るメソッド定義に気をつけていれば可能な範疇だろう
675:デフォルトの名無しさん
16/06/14 11:59:42.69 9x/TacpJ.net
>>653
頭おかしいのかな。
そうだと言ってるんだよ。
データと操作と、操作のためのオブジェクトは別個に考えるべきだと。
最適解として、シリアライズ不可能な物はシャローコピーする、は、
お前の運用に対する無難な妥協点であって、ディープコピーじゃないよ。
だからlave使えって。
676:デフォルトの名無しさん
16/06/14 12:02:10.51 9x/TacpJ.net
>>654
toJSON実装しとけ。
677:デフォルトの名無しさん
16/06/14 12:50:00.83 DODkZCvX.net
>>655
シリアライズ不可能なオブジェクト
>>657
「あなたの考えるdeep copyかどうか」はどうでもいいんだがな
「あなたの考えるあなたの為のdeep copy」が私にとっては使えないし、逆もしかりというだけなんだが
で、「あなたの考えるdeep copy」と「私の考えるdeep copy」の仕様が違うだけ
laveとは何のことだ?
>>658
toJSONとは?
678:デフォルトの名無しさん
16/06/14 12:51:12.47 DODkZCvX.net
追記
「ディープコピーじゃないよ」といわれてもあなたの中ではそうなんだろう、としか言いようがない
679:デフォルトの名無しさん
16/06/14 13:11:10.09 dYSnVaKQ.net
>>659
> シリアライズ不可能なオブジェクト
それ、そもそも問題設定がおかしくないか?
もともとはオブジェクトをコピーするときの話で、その目的・実現方法による分類として
シャローコピーとディープコピーがある。
シリアライズ不可能なオブジェクトでもシャローコピーで良い場合もあれば悪い場合もある。
それは目的によって異なるというだけのこと。
680:デフォルトの名無しさん
16/06/14 13:20:14.73 dYSnVaKQ.net
>>689からも話が続いてるとして、
> 一口にdeep copyといってもいろいろ問題があるわけで「この問題にあなたはどう考えているのか?」
> この問題は個々がdeep copyする状況によって解決策が変わるだろうからあなたの考えがな聞きたかった
つまり、ディープコピーしたいんだが、ある項目についてはそれが難しいという話でしょ?
で、その問題解決の最適解がシャローコピー?
>>636の
> オブジェクト変更するから、変更前の「前回オブジェクト」を持っておきたいとか、
> 保存ボタン押すときに、保存の必要性あるか確認したいから、オブジェクトと退避オブジェクトを比較したい、その退避オブジェクトを作るとか
目的でディープコピーをしたいのだという人と、根本的に議論がかみ合ってない。
681:デフォルトの名無しさん
16/06/14 13:22:09.03 9x/TacpJ.net
>>659
deepcopyの定義から考えような。勝手キーワードじゃないよ。
URLリンク(en.m.wikipedia.org)
laveはこれ。
URLリンク(github.com)
toJSON
URLリンク(developer.mozilla.org)
>>660
お前の中でしか違わないよ。
682:デフォルトの名無しさん
16/06/14 16:09:36.89 9x/TacpJ.net
まぁ、===で比較したいから、インスタンスは唯一の存在であってほしいから、これは「俺のdeep copy」とか言われても困るわな。
絶対地雷踏み抜くわ。
同名のtaroオブジェクトとかで苦笑いしておくべきだったか。
683:デフォルトの名無しさん
16/06/14 17:54:57.29 DODkZCvX.net
>>663
あなたの主張はわかった
684:デフォルトの名無しさん
16/06/14 18:07:30.48 dYSnVaKQ.net
あなたの主張はわかった。
=> でもそれは間違ってる
=> 私が間違っていた
=> あなたも正しいが、私の主張も正しい
のどれだろうか。
685:デフォルトの名無しさん
16/06/14 18:47:33.56 9x/TacpJ.net
>>665
無知を省みて自分の至らぬ所を認め、その上で正しい知識を入れ直さないと、
技術者として致命的な場面がやってくるよ。
匿名で出来る間にやっておけばいかがかな。
686:デフォルトの名無しさん
16/06/14 19:35:30.53 TG3hSyiU.net
一般論からは、複製するオブジェクトを利用している文脈に固有のデータは
複製されない方がよいだろう(一時的な管理データなど
よって、何を複製すべきかは複製した結果を利用する文脈に依存する
元と同じ文脈で利用する場合でも、すべてのデータを複製した方が
いいとは限らない( id みたいに重複すると困るものなど
687:デフォルトの名無しさん
16/06/14 22:10:43.05 VJ/4c5wE.net
ディープコピーは滅多に使わないな
マップした結果が偶々ディープコピーと同じ結果になる事はあるけど
転送はJsonXmlバイナリのどれかのシリアライズだし
688:デフォルトの名無しさん
16/06/14 23:14:40.87 9x/TacpJ.net
一般論としては、ってのがよくわからんが、そんなものをデータに持ち込むからじゃないの?
689:デフォルトの名無しさん
16/06/14 23:28:10.46 M6DJWkXG.net
ディープコピーとシリアライズは別の機能。
ディープコピーにシリアライズ用の関数を使うのは間違い。
それだけの話だろ
690:デフォルトの名無しさん
16/06/15 00:12:34.59 cIXZs8w1.net
>>671
そりゃおっしゃる通り。
一番元々の要件に対して、「手軽で早い」解決策。
そこから、変なものをdeepcopyだと寝言言う奴があらわれてこうなっただけ。
cloneとequalsを定義すべきだと思うよ。「正しい実装」では。
691:デフォルトの名無しさん
16/06/15 00:19:47.28 wTcNi+2O.net
>>672
もともとの要件? もともとの要件は、ディープコピーなんだが?w
ディープコピーにシリアライズ用の関数を使うのは間違いって
JSONつかってやるコードを持ち出してきた
>>661をぎったんぎったんに叩いてやれよw
↓しっかり思い出せやw
608 自分:デフォルトの名無しさん[sage] 投稿日:2016/06/12(日) 23:34:06.35 ID:xguVhByI [2/2]
shallowコピーの場合はconcatでいいよね。
最初は?ってなるけど、知ってしまえば簡単に覚えられるし。
なんらかのdeepコピーの場合はライブラリ使うしか無いかな?
611 返信:デフォルトの名無しさん[sage] 投稿日:2016/06/12(日) 23:57:34.48 ID:hCgFiHr7 [7/7]
>>608
JSON.parse(JSON.stringify(obj))
が、一番手軽で早い。
692:デフォルトの名無しさん
16/06/15 01:25:24.86 Iz/1ukPU.net
ディープコピーといっても様々じゃない?
構造下のオブジェクトは再作成することになるが、
関数に限ってはクロージャの面からも参照コピーした方がいい。
しかしそうなると関数オブジェクトのプロパティの取り回しが困る。
他にも非列挙やシンボルの扱いもあるし一般的に何が正しいかなんてない。
693:デフォルトの名無しさん
16/06/15 02:03:52.98 wTcNi+2O.net
>>674
例えそうだとしても日付が壊れるとか
undefinedが消えるだとかいうのは問題外
694:デフォルトの名無しさん
16/06/15 04:32:57.44 Iz/1ukPU.net
そっとしてそれはギャグで言ってるのかな?
695:デフォルトの名無しさん
16/06/15 08:08:29.44 SSaOcc+i.net
>>673
ディープコピー全体に対して、すべてをシリアライズで解決するのは正しいか間違いか、
って話であって、
少なくともconcat使うような配列やらなんやらでは、シリアライズで必要十分だねと。
訳わからん前提を持ち出して、あまつさえディープコピーではないものをディープコピーと言い出した奴は気が狂ってると思うけど。
だから、何度かclone/equalsの話もしてんじゃん。
お前、自分が何故叩かれたか理解してないの?
>>675
そんな形で持つからだろ。
696:デフォルトの名無しさん
16/06/15 08:56:16.37 FEVYup+X.net
javascript業界は素人ばっかりだな
参照型のディープコピーの実装は大きく分けて3つ
プロパティの自動マッピング、シリアライズ、明示的なコピー関数
実行効率や制約の多さはともかくとして工数的にはシリアライズを利用する方法は有力な選択肢だよ
もちろんそもそも論としてディープコピーなんかそんなに使わないってのがあるけどね
697:デフォルトの名無しさん
16/06/15 09:05:04.59 wTcNi+2O.net
> 参照型のディープコピーの実装は大きく分けて3つ
> プロパティの自動マッピング、シリアライズ、明示的なコピー関数
オレオレ定義すんなよ。
見苦しいんだよ。
698:デフォルトの名無しさん
16/06/15 09:08:01.05 wTcNi+2O.net
> 工数的には
どこぞのライブラリを使えばいい。
699:デフォルトの名無しさん
16/06/15 11:46:17.65 SSaOcc+i.net
>>679
これ、オレオレ定義か?
CoRしたいなら1つめ、あとはごく当たり前な実装だと思うけど。
700:デフォルトの名無しさん
16/06/15 13:00:32.42 RkIC2p5j.net
>>681
一般にディープコピーするのにシリアライズは必要ないんじゃない?
無駄な処理を挟んでいるだけに見える
701:デフォルトの名無しさん
16/06/15 13:11:48.27 SSaOcc+i.net
>>682
javascriptみたいな、オブジェクトのプロパティの型がプリミティブだって保証が無い言語で、
制限事項少なめで一発でコピーするには楽だと思うけどなぁ。
702:デフォルトの名無しさん
16/06/15 13:37:00.47 RkIC2p5j.net
>>683
JavaScriptの場合、JSONが楽に実装できることは否定しないよ
サーバにデータを送るならシリアライズする意味はあるけど、ディープコピーする為だけにシリアライズする必要はないってだけ
シリアライズしたフォーマット(JSON)の制約を受けるわけだし、シリアライズする時点で目的と手段が一致してないように見える
Object.keysやfor-ofで列挙したキーを順番にコピーしていく方がどう考えても制約が少ない
703:デフォルトの名無しさん
16/06/15 14:34:35.52 KXw+rbZw.net
なんかディープコピーはあれもこれもちゃんとして超完璧じゃないといけないみたいな人がいるけど
どのライブラリとってみてもそれなりな実装しかしてないんだよね。
>>684とか制約が少ない(キリッ
って言うけどそこまでしてその制約の少なさを求める妥当性を一切言わない。
704:デフォルトの名無しさん
16/06/15 15:00:16.56 RkIC2p5j.net
>>685
「制約が少ない」は>>683の「制限事項少なめ」に反論しただけ
上の方で「ディープコピーじゃないよ」云々の人がいたし、ディープコピーのクオリティを向上させる流れだと思ったんだけどね
それなりの実装でいいなら各々が自分の好きなように実装すればいいし、他人の実装を否定する必要もないね
705:デフォルトの名無しさん
16/06/15 15:03:11.81 KXw+rbZw.net
どんだけ頑張ってもそれなりの実装にしかならないから決め手がなくて問題なんでしょ。
706:デフォルトの名無しさん
16/06/15 15:39:36.39 SSaOcc+i.net
>>684
for ofで、オブジェクトなら再帰的に、とやると、今度は参照が循環してしまった場合に備えて、メモ化する必要が出てきたりと、制限事項を制限事項とするためにとても面倒な段取りを踏まないといかんのよ。
そういう意味では、やっぱりインスタンス各自に任せるのが一番なのかもしれんよ。
cloneを必ず実装して、その中の実装でも、どんなオブジェクトも自力ではコピーせずに、cloneを呼び出すようにして、呼び出せるcloneが無い場合、死ぬかないしは参照のコピーとなる可能性があるとワーニング吐くとくとか。
.toJSON実装しときゃstringifyだと割と解決するんだけどね。
707:デフォルトの名無しさん
16/06/15 15:42:17.53 TAanDQJ+.net
>>684
ディープコピーの実装する為だけに面倒くさいだけのツマラナイコード書く必要なくね?
シリアライズでサッサと済ませればいいじゃん
708:デフォルトの名無しさん
16/06/15 16:25:26.27 RkIC2p5j.net
>>688
> for ofで、オブジェクトな�
709:迯ト帰的に、とやると、今度は参照が循環してしまった場合に備えて、メモ化する必要が出てきたりと、制限事項を制限事項とするためにとても面倒な段取りを踏まないといかんのよ。 なるほど、参照をメモ化すれば循環参照を保持出来るね オブジェクトの配列をメモ化しておいてArray#indexOfで探せばいいので比較的簡単に実装できそう JSON.stringifyを使ったら循環参照を消してた var obj = {a:{x:1},b:obj,c:this.a}; JSON.stringify(obj); // "{"a":{"x":1}}" toJSONを使ってユニークな文字を出力しても解決できそうにないかな ユニークな文字列と同値が存在したら破綻するし、渡すオブジェクト自身に循環参照していた場合、obj.toJSONを定義した途端にJSON.stringify(obj)が文字列になってしまう この辺がJSONの限界かな
710:デフォルトの名無しさん
16/06/15 17:24:42.09 uCNYQdtw.net
一日中こんなところでくだらん連投して何が楽しいの?
仕事でも探せば?
711:デフォルトの名無しさん
16/06/15 17:35:48.15 SSaOcc+i.net
>>690
そうそう。
すでにクローン済みとメモ化するにも、ネストしたオブジェクトの底の方で発見したオブジェクトと、浅い所で発見したオブジェクトに対して、再起だと上にメモを返してやらないと、同一参照にはならんので、割とめんどくさいと思うよ。
吹き飛ばすのが一番、かつ、そんなデータを作らないのが一番と言う所に落ち着くんじゃないかな。
712:デフォルトの名無しさん
16/06/15 18:40:06.70 kCCRbfye.net
一番面倒なのは外部プロパティに加え内部プロパティを持ったビルトインコンストラクタのインスタンスだろう。
それを複製するにはそれぞれのクラスごとに対応しないといけないし、その最たるものである関数は対処不能。
>>690
ちょっと工夫すればJSON APIを活用しつつも循環参照も扱える
>>656みたいに(バグあり)
713:デフォルトの名無しさん
16/06/15 23:17:16.03 wTcNi+2O.net
>>689
> シリアライズでサッサと済ませればいいじゃん
だから、その結果、日付型がおかしくなり関数が消え
undefinedの値がキーごとなくなるのはひどすぎという話。
714:デフォルトの名無しさん
16/06/16 07:45:47.42 oMjTOMdB.net
それで十分な場面はそうでない場面よりずっと多いと思うので、
酷いか酷くないかで言うと酷くないと思う。
715:デフォルトの名無しさん
16/06/16 09:28:45.12 J7Y57E8z.net
>>694
何でもかんでも汎用化しようとするのはヴァカのやる事だし
そもそも込み入った形式のオブジェクトをディープコピーする機会は少ない
適用可能な範囲で簡単に実装できるならそうしたほうがいい
できない範囲にはポリモーフィックに対応すればいい
716:デフォルトの名無しさん
16/06/16 09:30:35.19 u57UUEr0.net
>>696
日付型や関数はundefinedが値として入っているのは
ぜんぜん込み入った形式じゃないですよ?
717:デフォルトの名無しさん
16/06/16 12:30:42.86 TTOq9A9Q.net
>>697
設計が悪いだろ。そりゃデータとロジックが分離できてないとしか言いようが無くないか?
718:デフォルトの名無しさん
16/06/16 15:06:47.71 peThILAI.net
ディープコピー使ったコードも8割方設計がまずい気がする
719:デフォルトの名無しさん
16/06/16 19:02:21.99 ykd7wui8.net
iOS9のSafariでWebを見た時、リーダーが使えず
以下のURLを参考にフォントを拡大して使っています。
iOSのSafariで表示してるページの文字の大きさを自由に変更しよう!
URLリンク(mag.torumade.nu)
ここにあるJavaScriptの+/ーそれぞれの記述ですが、
フォントを多きく/小さくしている箇所は何処でしょうか?
今は2,3回ポチって文字を大きくしています。
出来ればポチったら一発で好みの文字の大きさにするスクリプトにしたいです。
JavaScriptで文字の大きさを買えるのに、試行するのは構いませんので
宜しくお願いします。
JavaScriptは書いたこと無いので、ここでの記述をコピペになると思います。
720:デフォルトの名無しさん
16/06/16 21:35:26.83 DYttMfqr.net
めんどくさいしこれでいいよ
まともな造りしてればまあ読めるだろ
大きさ変えたいなら 20px を好きな値にしな
javascript:document.body.innerHTML+='%3Cstyle%3E*%7Bfont-size:20px!important%7D%3C/style%3E';
721:デフォルトの名無しさん
16/06/16 22:07:33.10 u57UUEr0.net
>>698
> 設計が悪いだろ。そりゃデータとロジックが分離できてないとしか言いようが無くないか?
日付やundefinedはデータですよ?
これをロジックと言い張る人、初めて見たわーwww
722:デフォルトの名無しさん
16/06/17 00:16:54.38 XW0r+pFS.net
>>702
関数、に言ってるんだけど。
とにかく言い負かされたくなくて必死なんだな。
あと、undefinedは正確にはデータではなく、状態。
日付は、日付。Dateクラスは、日付を扱うためのクラスであり、日付の値では無い、あくまで値は、.valueOf()で取得できる値。
ババロア君は馬鹿か無知かどちらかにしとけよ。ババロアすら詰まってないんじゃねえの?
723:デフォルトの名無しさん
16/06/17 00:31:17.80 gkJjvuAc.net
>>703
なんで3つのうち関数にしか言わないの?
残り2つは反論できませんって話かwww
724:デフォルトの名無しさん
16/06/17 00:33:59.24 gkJjvuAc.net
"abc".bold() って実行してみ?
文字列は
725:クラスだって知らないのかな?www
726:デフォルトの名無しさん
16/06/17 00:46:16.36 XW0r+pFS.net
>>704
2つはその、下で反論してるけど。
文字も読めないの?
>>705
.valueOf実行してみ。
薄いラッパーに包まれたただの値だとわかるよ。
727:デフォルトの名無しさん
16/06/17 00:47:44.33 XW0r+pFS.net
>>705
プロトタイプに実装されてるか、それともインスタンスに実装したのかも分けて考えような、ボンクラ。
728:デフォルトの名無しさん
16/06/17 01:18:50.68 gkJjvuAc.net
>>706
日付.valueOf実行してみ。
薄いラッパーに包まれたただの値だとわかるよ。
729:デフォルトの名無しさん
16/06/17 01:20:43.01 gkJjvuAc.net
>>707
> プロトタイプに実装されてるか
String.prototype.hoge = function() {} と定義したものが
"abc".hoge() で呼び出されるな。
プロトタイプに実装されてるわけか。
730:デフォルトの名無しさん
16/06/17 01:38:53.96 MlF9RYHU.net
プリミティブ型とラッパーオブジェクトは別物だから明確に区別しとかないと事故るぞ
例えば以下の様なケース
if(new Boolean(false) && new Number(0)){
//どちらもオブジェクトが存在するのでtrue
//よってここは常に実行される
}
if(false || 0){
//どちらもプリミティブでfalseとして扱われる値
//よってこちらは実行されない
}
731:デフォルトの名無しさん
16/06/17 02:49:55.65 bQl7rsTf.net
>>701
ありがとうございました。
732:デフォルトの名無しさん
16/06/17 09:31:42.05 srh2csoY.net
>>710
いろんなJS質問スレ見てきてるが半年ぶりくらいに
まともな初心者解説のコードが書かれたな。
733:デフォルトの名無しさん
16/06/17 16:34:23.27 6iHig3Yk.net
ゴミが持論書きなぐってるだけのクソスレに何を期待してるの?
734:デフォルトの名無しさん
16/06/17 17:12:33.16 BB7ZCZit.net
動画サイトだけ自動でCSSを切り替えるために、動的に挿入されたiframe, video, object, embed エレメントを検出したいんですが、効率的な方法が思い浮かばず困っています
iframeとvideoはdocumentでイベントリスナ(load, loadedmetadata)すれば検出できるんですが、なぜかobjectとembedちゃんからのお便りが来ません(chrome ver51)
とりあえず暫定的にクリック毎にgetElementsByTagName()で代替しているんですが、
何かもっとスマートな方法ないでしょうか
735:デフォルトの名無しさん
16/06/17 19:02:26.08 Rqj2POSn.net
MutationObserverで逐一tagName調べるのが無難かな
736:デフォルトの名無しさん
16/06/17 19:29:30.69 BB7ZCZit.net
>>715
動画サイトの場合、オプション{childList true, subTree: true}でノード追加を監視すると、コンソールが常時ナイアガラの滝のように・・・
737:デフォルトの名無しさん
16/06/17 19:41:50.28 nZkVhJBc.net
>>713
その通りだね
俺様流カレーライスの作り方みたいなもんだよねw
738:デフォルトの名無しさん
16/06/18 02:23:30.51 zfC6EzMS.net
>>717
その俺様流カレーライスの作り方で、ドヤ顔でハヤシライスの作り方説明して、これが「妥当なカレーライス」とか言っちゃうような俺流deepcopyerが
主みたいなスレだからね。
まともな奴はレスしなくなるっしょw
739:デフォルトの名無しさん
16/06/18 09:38:41.31 Fpexe9SW.net
ハヤシライスというより肉じゃがだと思う
740:デフォルトの名無しさん
16/06/18 09:43:04.22 pG9pCEms.net
"a,b,c".split(",",1)で、
["a","b,c"]を取得したいのですが、["a","b"]になります
どうすrばいいですか
741:デフォルトの名無しさん
16/06/18 10:53:48.22 49KWKmmu.net
<input id="a" type="text">
document.getElementById('a').addEventListener('input', function(e) {
console.log(e);
}, false);
enterキーを押した時だけログがでないんですがどうしてですか?
742:デフォルトの名無しさん
16/06/18 13:22:34.63 z24FpIHh.net
function test1() {
return new Promise(function(resolve, reject) {
// 非同期な処理
};
}
function test2() {
return new Promise(function(resolve, reject) {
// 非同期な処理
};
}
上記の関数を逐次実行したい場合、
Promise.resolve()
.then(() => {
let promise = test1();
promise.then(() => {
console.log('test1 OK');
}).catch(function(e){
console.log('test 1NG');
});
return promise;
})
.then(() => {
let promise = test2();
promise.then(() => {
console.log('test2 OK');
}).catch(function(e){
console.log('test2 NG');
});
return promise;
})
});
って書くってことであっていますか?意図通り動くのですが、回りくどいし見にくい気がして
743:デフォルトの名無しさん
16/06/18 13:28:02.54 z24FpIHh.net
>>721
document.getElementById('a').addEventListener('keydown', function(e) {
console.log(e);
}, false);
keydown にすればenterも拾える
744:デフォルトの名無しさん
16/06/18 13:30:40.39 qpxG5nAO.net
>>722
そんなわけなかろうw
いまゲームしてるからちょっと待てwww
745:デフォルトの名無しさん
16/06/18 13:32:40.70 z24FpIHh.net
>>720
splitだけでその配列を取得するのは無理
746:デフォルトの名無しさん
16/06/18 13:33:55.65 z24FpIHh.net
>>724
お、ありがとうございます
たのんます
747:デフォルトの名無しさん
16/06/18 13:40:53.70 lYop9Jcb.net
>>720
それ戻り値["a"]じゃね?
とりあえず脳内補正で第二引数は2だとするとjavascriptのsplitだとその希望の動作にはならない
第二引数なしでsplitして[t[0],t.slice(1).join(',')]とか
indexOfとsubstring組み合わせて自分で切り出すとか
他にも色々やり方はあるので要求に合った方法を考えて関数化しとけばいいよ
748:デフォルトの名無しさん
16/06/18 13:48:58.73 7whaN/tJ.net
>>720
indexOfでインデックスを取得してslice
749:デフォルトの名無しさん
16/06/18 13:49:03.57 z24FpIHh.net
722ですがこっちですかね、余計見にくいような気もしますが(アロー演算子のせい?)
test1().then(() => {
return test2();
}, () => {
console.log('1のNG');
}).then(() => {
// 1 も 2 も成功
}, () => {
console.log('2のNG');
}).catch(function(e){
console.log('ここにはいつくるんだろう?');
});
750:デフォルトの名無しさん
16/06/18 13:52:05.82 ousMayNp.net
>>722
thenの結果は自動でプロミスに変換されるから、function test2 のなかでプロミスを作らなくておk
シンプルにfunction test2(previousResult) { // 非同期な処理 return resTest2} としておいて
test1
.catch(resTest1 => resCatch1)
.then(test2)
.catch(resTest2 => resCatch2) ~ とつなげればいい
一個目のcatchを省略した場合、 test1でエラーが起きると最後のキャッチにジャンプする
751:デフォルトの名無しさん
16/06/18 13:54:20.50 7whaN/tJ.net
>>721
可能性はいくつかある
- input要素で [Enter] キーを押している
- IME変換時に [Enter] キー
752:デフォルトの名無しさん
16/06/18 13:56:06.15 ousMayNp.net
>>729
thenの第二引数をcatchとして使うと、そのthenで起きたエラーは拾わなあいから、必要ないときはcatchを使ったほうがいいよ 分かり易いから
753:デフォルトの名無しさん
16/06/18 13:56:58.21 qpxG5nAO.net
>>729
ほらよ。ついでに値の渡し方も書いておいたぞ。
thenの戻り値としてPromiseではないものを返せるところにも注意な。(return textの所)
あと、最初はPromise.resolveで始めなくても、いきなりtext1("sample").then でも良い。
function test1(text) {
return Promise.resolve(text);
//return Promise.reject(text);
}
function test2(text) {
return Promise.resolve(text);
//return Promise.reject(text);
}
Promise.resolve("sample")
.then(text => test1(text))
.then(text => {
console.log("test 1 OK:" + text);
return text;
})
.catch(text => {
console.log("test 1 NG:" + text);
return text;
})
.then(text => test2(text))
.then(text => {
console.log("test 2 OK:" + text);
})
.catch(text => {
console.log("test 2 NG:" + text);
});
754:デフォルトの名無しさん
16/06/18 14:06:33.76 qpxG5nAO.net
ただ、一直線に書くとtext1とtext2の
755:範囲なのかわかりづらいから >>722を少し改良したこれでもいい気もしてきたな。 Promise.resolve("sample") .then(text => test1(text) .then(text => { console.log("test 1 OK:" + text); return text; }) .catch(text => { console.log("test 1 NG:" + text); return text; }) ) .then(text => test2(text) .then(text => { console.log("test 2 OK:" + text); }) .catch(text => { console.log("test 2 NG:" + text); }) );
756:デフォルトの名無しさん
16/06/18 14:09:27.96 qpxG5nAO.net
なお、もちろんこう書くこともできるし
function test1(text) {
let p = Promise.resolve(text);
//let p = Promise.reject(text);
return p.then(text => {
console.log("test 1 OK:" + text);
return text;
})
.catch(text => {
console.log("test 1 NG:" + text);
return text;
});
}
function test2(text) {
let p = Promise.resolve(text);
//let p = Promise.reject(text);
return p.then(text => {
console.log("test 2 OK:" + text);
return text;
})
.catch(text => {
console.log("test 2 NG:" + text);
return text;
});
}
Promise.resolve("sample")
.then(text => test1(text))
.then(text => test2(text));
757:デフォルトの名無しさん
16/06/18 14:18:57.19 qpxG5nAO.net
catchをthenの機能に含めて、こういう書き方もできる。
Promise.resolve("sample")
.then(text => test1(text))
.then(text => {
console.log("test 1 OK:" + text);
return text;
}, text => {
console.log("test 1 NG:" + text);
return text;
})
.then(text => test2(text))
.then(text => {
console.log("test 2 OK:" + text);
}, text => {
console.log("test 2 NG:" + text);
});