[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 12/07 09:57 / Filesize : 397 KB / Number-of Response : 1030
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [2016/05/22(日) 19:51:33.37 ID:WwOYSBmy.net]
JavaScript を自ら学ぶ人のための質問スレッドです。
>>2-4のテンプレを読んだ上で質問してください。次スレは>>950>>2のテンプレ案(本スレで改善案があれば考慮)を元に立ててください

■質問を書く上で
(1) 煽り、コード制作依頼等、人を不快にさせる投稿はご遠慮下さい。公序良俗を守った応対を心がけてください。
(2) 他の人に迷惑をかけるスクリプトの質問はご遠慮ください。
  (ブラクラ、[戻る], [閉じる], [クリック] の妨害、画面占有など)
(3) 質問者及び議論を行う人はメール欄を空欄にし、名前にレス番を入れることを強く推奨します。回答者はなりすましを判断できませんので、なりすましが現れても自己責任となります。
(4) 常に自発的に調べる心構えを持ってください。
  具体的には「自分で調べてから質問する」「回答をもらってわからない単語があればGoogle検索してみる」など。
  わからない内容を代わりに調べてくれる回答者をお望みの方は余所で質問してください。
(5) 出来るだけ一般的な用語を使用してください。脳内オレオレ用語は混乱の元です。
(6) 出来るだけサンプルコードを掲示してください。言葉による説明は行き違いが生まれる場合があります。
  ※必ず「問題の事象が再現されること」を確認してください。
   必要な部分だけ切り出したつもりで現象が再現できていなかったケアレスミスがしばしば見られます。
(7) サンプルコードに HTML が含まれる場合は validator.w3.org/ で [Check] してみてください。
(8) 質問を具体的かつ詳細に書くと回答を得られやすいです。>>2の質問テンプレートを活用してみてください。
(9) 時にはあなたが望む「答え」だけでなく、「意見」などが寄せられる場合もあります。

655 名前:デフォルトの名無しさん mailto:sage [2016/06/13(月) 20:36:13.44 ID: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 名前:デフォルトの名無しさん mailto:sage [2016/06/13(月) 21:22:27.21 ID:pgYO3XjB.net]
to infinity and beyond

657 名前:デフォルトの名無しさん mailto:sage [2016/06/13(月) 22:52:41.14 ID: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 名前:デフォルトの名無しさん mailto:sage [2016/06/13(月) 22:57:06.96 ID:O5DunmIw.net]
>>636
> オブジェクト変更するから、変更前の「前回オブジェクト」を持っておきたいとか、
なるほど、その発想はなかったな
私ならPersonかPersonを管理するクラスを作ってその中で履歴を管理しそうだ

659 名前:デフォルトの名無しさん mailto:sage [2016/06/13(月) 23:38:40.69 ID:K+DNMsci.net]
>>639
だから、あのさあ。。
他の言語で考えてみれば?そんな関数は、jsで言う、そのインスタンスのプロトタイプが持つべきで、そのインスタンスが持つべきものじゃないでしょ。
二回目だけど、それはdeepcopyではない。
どうしてもしたければ、laveでもしろ。
問題が理解出来てなさすぎるんじゃないか?

>>640
Personを管理するクラスを作ったなら、そいつが持つのは一体何なんだ?
Personじゃないの?
「Person」と、「Personのコピー」と、「PersonとPersonのコピーを管理するクラス」って無駄すぎるだろ。
どう考えてもPersonを正しくコピー出来るべきで、Personのインスタンス同士を中身を使って比較出来るべきじゃないの?

660 名前:デフォルトの名無しさん mailto:sage [2016/06/13(月) 23:45:19.16 ID:O5DunmIw.net]
>>641
JSONでもdeep copy出来てなかったと思うのだが
否定ばかりであなたの考える最善が何も出てこないな

661 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 00:47:25.44 ID: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 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 02:01:10.19 ID:9x/TacpJ.net]
>>642
最善は、オブジェクトはオブジェクトとして、関数をもたず、単なるデータの塊として、関数とは別に定義して、
stringify/parseで文字列と相互に変換できる、だよ。
ネットワークを経てrpc的なもので関数呼び合うにも便利だし。
値の持ち主が関数を持つのは好きじゃない。
>>643
圧倒するほどのメリットと言えば、それこそAPIやら、socket.ioを経ても素直に透過な所じゃないかな。

663 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 02:03:53.91 ID:M6DJWkXG.net]
>>644
日付が壊れる問題はどうすんの?



664 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 02:06:47.27 ID:M6DJWkXG.net]
あれ?もしかしてまだ日付が壊れる問題の詳細でてなかったの?
日付らしき文字があったからもう情報出てると思ってたw

まあぐぐればすぐに分かるよね?って話。

JavaScriptのDeepCopyでJSON.parse/stringifyを使ってはいけない
qiita.com/seihmd/items/74fa9792d05278a2e898

665 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 02:11:20.97 ID:M6DJWkXG.net]
>>644
> 最善は、オブジェクトはオブジェクトとして、関数をもたず、単なるデータの塊として、関数とは別に定義して、
> stringify/parseで文字列と相互に変換できる、だよ。

理由がないよね。

> ネットワークを経てrpc的なもので関数呼び合うにも便利だし。
今はDeep Copyの話をしている。
シリアライズの話なら別でやれ

666 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 02:24:34.32 ID:TbEnZJwB.net]
>>645-646
なんでこういう事いう奴のJSON.parse/stringifyには第二引数がないんだろう?w

667 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 02:31:07.43 ID:M6DJWkXG.net]
JSON.parse/stringifyには第二引数で頑張ればできるという誤解が
広まらないように先に言っておくと、これはNumber、String、Booleanにしか
対応できません。

668 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 04:26:35.95 ID:TbEnZJwB.net]
>>649
嘘吐くなよ試しちまったじゃねぇかw

parseに渡すreviverは文字列を受け取って問題なくオブジェクトを返せるし
stringifyに渡すreplacerはオブジェクトを受け取って任意の文字列に変換出来る
別にコピーのためだけに局所的に使うならreplacerは正しいjsonを吐く必要もないしな
復元のための情報山盛りにして吐き出せばいい

Dateとundefinedを試してコピー出来たのは確認した
Functionとクロージャはスコープの問題があるのでシャローコピーにせざるを得ないが
同一スコープ内でstringify/parseをするならreviverでオリジナルから参照をコピーするのは簡単だ
ただまあここまでやるのはシリアライザとデシリアライザを自前で実装するのと変わらんからオブジェクトを直接弄った方が早いなw

ところでディープコピーってjQueryからextendメソッドをパクって来るんじゃダメなんか?
循環参照で死ぬので他のライブラリのでもいいがディープコピーを実現しようとしてるライブラリは少なくないと思うんだが

669 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 09:05:34.57 ID:BcKyLCvc.net]
>>634
「js button click event」で検索!

670 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 09:26:05.33 ID:VOPCCsis.net]
>>651
「いやです!>_<」

671 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 09:30:58.95 ID: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 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 09:41:30.57 ID:DODkZCvX.net]
>>643の obj を JSON.stringify(obj); すると SyntaxError になるな

673 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 10:11:55.55 ID:dYSnVaKQ.net]
>>653
最適解が「シャローコピー」となる、その主語はなに?
何に関して議論してるの?



674 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 10:29:28.31 ID:ScASA3Ww.net]
別にJSON使ってもいいと思うけど、
別の手としてはMessageChannel使えば非同期で循環参照も扱える
まあJSONも少し手を加えれば循環参照を扱えるが
昔作ったこんな感じで
ideone.com/Zxp7kN

昔関数も扱えないかと考えたことがある
まあちょっとコピーとは感じが違うが、NodeとブラウザでWSを使いオブジェクトを共有しようと思っていた。
その時はオブジェクト情報を送るのではなく影となるProxyを使い、
操作を原本に問い合わせることでだいたい可能という判断になった。
原本に与える影響を最小限にして、あたかもでディープコピーされたかのように振る舞うのも
まあ巧みなProxyとレシーバーを守るメソッド定義に気をつけていれば可能な範疇だろう

675 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 11:59:42.69 ID:9x/TacpJ.net]
>>653
頭おかしいのかな。
そうだと言ってるんだよ。
データと操作と、操作のためのオブジェクトは別個に考えるべきだと。
最適解として、シリアライズ不可能な物はシャローコピーする、は、
お前の運用に対する無難な妥協点であって、ディープコピーじゃないよ。
だからlave使えって。

676 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 12:02:10.51 ID:9x/TacpJ.net]
>>654
toJSON実装しとけ。

677 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 12:50:00.83 ID:DODkZCvX.net]
>>655
シリアライズ不可能なオブジェクト

>>657
「あなたの考えるdeep copyかどうか」はどうでもいいんだがな
「あなたの考えるあなたの為のdeep copy」が私にとっては使えないし、逆もしかりというだけなんだが
で、「あなたの考えるdeep copy」と「私の考えるdeep copy」の仕様が違うだけ
laveとは何のことだ?

>>658
toJSONとは?

678 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 12:51:12.47 ID:DODkZCvX.net]
追記
「ディープコピーじゃないよ」といわれてもあなたの中ではそうなんだろう、としか言いようがない

679 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 13:11:10.09 ID:dYSnVaKQ.net]
>>659
> シリアライズ不可能なオブジェクト
それ、そもそも問題設定がおかしくないか?

もともとはオブジェクトをコピーするときの話で、その目的・実現方法による分類として
シャローコピーとディープコピーがある。

シリアライズ不可能なオブジェクトでもシャローコピーで良い場合もあれば悪い場合もある。
それは目的によって異なるというだけのこと。

680 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 13:20:14.73 ID:dYSnVaKQ.net]
>>689からも話が続いてるとして、
> 一口にdeep copyといってもいろいろ問題があるわけで「この問題にあなたはどう考えているのか?」
> この問題は個々がdeep copyする状況によって解決策が変わるだろうからあなたの考えがな聞きたかった

つまり、ディープコピーしたいんだが、ある項目についてはそれが難しいという話でしょ?
で、その問題解決の最適解がシャローコピー?

>>636
> オブジェクト変更するから、変更前の「前回オブジェクト」を持っておきたいとか、
> 保存ボタン押すときに、保存の必要性あるか確認したいから、オブジェクトと退避オブジェクトを比較したい、その退避オブジェクトを作るとか
目的でディープコピーをしたいのだという人と、根本的に議論がかみ合ってない。

681 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 13:22:09.03 ID:9x/TacpJ.net]
>>659
deepcopyの定義から考えような。勝手キーワードじゃないよ。
https://en.m.wikipedia.org/wiki/Object_copying#Deep_copy

laveはこれ。
https://github.com/jed/lave/blob/master/README.md

toJSON
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

>>660
お前の中でしか違わないよ。

682 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 16:09:36.89 ID:9x/TacpJ.net]
まぁ、===で比較したいから、インスタンスは唯一の存在であってほしいから、これは「俺のdeep copy」とか言われても困るわな。
絶対地雷踏み抜くわ。
同名のtaroオブジェクトとかで苦笑いしておくべきだったか。

683 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 17:54:57.29 ID:DODkZCvX.net]
>>663
あなたの主張はわかった



684 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 18:07:30.48 ID:dYSnVaKQ.net]
あなたの主張はわかった。
=> でもそれは間違ってる
=> 私が間違っていた
=> あなたも正しいが、私の主張も正しい
のどれだろうか。

685 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 18:47:33.56 ID:9x/TacpJ.net]
>>665
無知を省みて自分の至らぬ所を認め、その上で正しい知識を入れ直さないと、
技術者として致命的な場面がやってくるよ。
匿名で出来る間にやっておけばいかがかな。

686 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 19:35:30.53 ID:TG3hSyiU.net]
一般論からは、複製するオブジェクトを利用している文脈に固有のデータは
複製されない方がよいだろう(一時的な管理データなど

よって、何を複製すべきかは複製した結果を利用する文脈に依存する
元と同じ文脈で利用する場合でも、すべてのデータを複製した方が
いいとは限らない( id みたいに重複すると困るものなど

687 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 22:10:43.05 ID:VJ/4c5wE.net]
ディープコピーは滅多に使わないな
マップした結果が偶々ディープコピーと同じ結果になる事はあるけど
転送はJsonXmlバイナリのどれかのシリアライズだし

688 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 23:14:40.87 ID:9x/TacpJ.net]
一般論としては、ってのがよくわからんが、そんなものをデータに持ち込むからじゃないの?

689 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 23:28:10.46 ID:M6DJWkXG.net]
ディープコピーとシリアライズは別の機能。
ディープコピーにシリアライズ用の関数を使うのは間違い。

それだけの話だろ

690 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 00:12:34.59 ID:cIXZs8w1.net]
>>671
そりゃおっしゃる通り。
一番元々の要件に対して、「手軽で早い」解決策。
そこから、変なものをdeepcopyだと寝言言う奴があらわれてこうなっただけ。
cloneとequalsを定義すべきだと思うよ。「正しい実装」では。

691 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 00:19:47.28 ID: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 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 01:25:24.86 ID:Iz/1ukPU.net]
ディープコピーといっても様々じゃない?
構造下のオブジェクトは再作成することになるが、
関数に限ってはクロージャの面からも参照コピーした方がいい。
しかしそうなると関数オブジェクトのプロパティの取り回しが困る。
他にも非列挙やシンボルの扱いもあるし一般的に何が正しいかなんてない。

693 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 02:03:52.98 ID:wTcNi+2O.net]
>>674
例えそうだとしても日付が壊れるとか
undefinedが消えるだとかいうのは問題外



694 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 04:32:57.44 ID:Iz/1ukPU.net]
そっとしてそれはギャグで言ってるのかな?

695 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 08:08:29.44 ID:SSaOcc+i.net]
>>673
ディープコピー全体に対して、すべてをシリアライズで解決するのは正しいか間違いか、
って話であって、
少なくともconcat使うような配列やらなんやらでは、シリアライズで必要十分だねと。
訳わからん前提を持ち出して、あまつさえディープコピーではないものをディープコピーと言い出した奴は気が狂ってると思うけど。
だから、何度かclone/equalsの話もしてんじゃん。

お前、自分が何故叩かれたか理解してないの?

>>675
そんな形で持つからだろ。

696 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 08:56:16.37 ID:FEVYup+X.net]
javascript業界は素人ばっかりだな
参照型のディープコピーの実装は大きく分けて3つ
プロパティの自動マッピング、シリアライズ、明示的なコピー関数
実行効率や制約の多さはともかくとして工数的にはシリアライズを利用する方法は有力な選択肢だよ
もちろんそもそも論としてディープコピーなんかそんなに使わないってのがあるけどね

697 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 09:05:04.59 ID:wTcNi+2O.net]
> 参照型のディープコピーの実装は大きく分けて3つ
> プロパティの自動マッピング、シリアライズ、明示的なコピー関数

オレオレ定義すんなよ。
見苦しいんだよ。

698 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 09:08:01.05 ID:wTcNi+2O.net]
> 工数的には
どこぞのライブラリを使えばいい。

699 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 11:46:17.65 ID:SSaOcc+i.net]
>>679
これ、オレオレ定義か?
CoRしたいなら1つめ、あとはごく当たり前な実装だと思うけど。

700 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 13:00:32.42 ID:RkIC2p5j.net]
>>681
一般にディープコピーするのにシリアライズは必要ないんじゃない?
無駄な処理を挟んでいるだけに見える

701 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 13:11:48.27 ID:SSaOcc+i.net]
>>682
javascriptみたいな、オブジェクトのプロパティの型がプリミティブだって保証が無い言語で、
制限事項少なめで一発でコピーするには楽だと思うけどなぁ。

702 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 13:37:00.47 ID:RkIC2p5j.net]
>>683
JavaScriptの場合、JSONが楽に実装できることは否定しないよ
サーバにデータを送るならシリアライズする意味はあるけど、ディープコピーする為だけにシリアライズする必要はないってだけ
シリアライズしたフォーマット(JSON)の制約を受けるわけだし、シリアライズする時点で目的と手段が一致してないように見える
Object.keysやfor-ofで列挙したキーを順番にコピーしていく方がどう考えても制約が少ない

703 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 14:34:35.52 ID:KXw+rbZw.net]
なんかディープコピーはあれもこれもちゃんとして超完璧じゃないといけないみたいな人がいるけど
どのライブラリとってみてもそれなりな実装しかしてないんだよね。
>>684とか制約が少ない(キリッ
って言うけどそこまでしてその制約の少なさを求める妥当性を一切言わない。



704 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 15:00:16.56 ID:RkIC2p5j.net]
>>685
「制約が少ない」は>>683の「制限事項少なめ」に反論しただけ
上の方で「ディープコピーじゃないよ」云々の人がいたし、ディープコピーのクオリティを向上させる流れだと思ったんだけどね
それなりの実装でいいなら各々が自分の好きなように実装すればいいし、他人の実装を否定する必要もないね

705 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 15:03:11.81 ID:KXw+rbZw.net]
どんだけ頑張ってもそれなりの実装にしかならないから決め手がなくて問題なんでしょ。

706 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 15:39:36.39 ID:SSaOcc+i.net]
>>684
for ofで、オブジェクトなら再帰的に、とやると、今度は参照が循環してしまった場合に備えて、メモ化する必要が出てきたりと、制限事項を制限事項とするためにとても面倒な段取りを踏まないといかんのよ。
そういう意味では、やっぱりインスタンス各自に任せるのが一番なのかもしれんよ。
cloneを必ず実装して、その中の実装でも、どんなオブジェクトも自力ではコピーせずに、cloneを呼び出すようにして、呼び出せるcloneが無い場合、死ぬかないしは参照のコピーとなる可能性があるとワーニング吐くとくとか。
.toJSON実装しときゃstringifyだと割と解決するんだけどね。

707 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 15:42:17.53 ID:TAanDQJ+.net]
>>684
ディープコピーの実装する為だけに面倒くさいだけのツマラナイコード書く必要なくね?
シリアライズでサッサと済ませればいいじゃん

708 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 16:25:26.27 ID: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 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 17:24:42.09 ID:uCNYQdtw.net]
一日中こんなところでくだらん連投して何が楽しいの?
仕事でも探せば?

711 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 17:35:48.15 ID:SSaOcc+i.net]
>>690
そうそう。
すでにクローン済みとメモ化するにも、ネストしたオブジェクトの底の方で発見したオブジェクトと、浅い所で発見したオブジェクトに対して、再起だと上にメモを返してやらないと、同一参照にはならんので、割とめんどくさいと思うよ。

吹き飛ばすのが一番、かつ、そんなデータを作らないのが一番と言う所に落ち着くんじゃないかな。

712 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 18:40:06.70 ID:kCCRbfye.net]
一番面倒なのは外部プロパティに加え内部プロパティを持ったビルトインコンストラクタのインスタンスだろう。
それを複製するにはそれぞれのクラスごとに対応しないといけないし、その最たるものである関数は対処不能。

>>690
ちょっと工夫すればJSON APIを活用しつつも循環参照も扱える
>>656みたいに(バグあり)

713 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 23:17:16.03 ID:wTcNi+2O.net]
>>689
> シリアライズでサッサと済ませればいいじゃん

だから、その結果、日付型がおかしくなり関数が消え
undefinedの値がキーごとなくなるのはひどすぎという話。



714 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 07:45:47.42 ID:oMjTOMdB.net]
それで十分な場面はそうでない場面よりずっと多いと思うので、
酷いか酷くないかで言うと酷くないと思う。

715 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 09:28:45.12 ID:J7Y57E8z.net]
>>694
何でもかんでも汎用化しようとするのはヴァカのやる事だし
そもそも込み入った形式のオブジェクトをディープコピーする機会は少ない
適用可能な範囲で簡単に実装できるならそうしたほうがいい
できない範囲にはポリモーフィックに対応すればいい

716 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 09:30:35.19 ID:u57UUEr0.net]
>>696
日付型や関数はundefinedが値として入っているのは
ぜんぜん込み入った形式じゃないですよ?

717 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 12:30:42.86 ID:TTOq9A9Q.net]
>>697
設計が悪いだろ。そりゃデータとロジックが分離できてないとしか言いようが無くないか?

718 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 15:06:47.71 ID:peThILAI.net]
ディープコピー使ったコードも8割方設計がまずい気がする

719 名前:デフォルトの名無しさん [2016/06/16(木) 19:02:21.99 ID:ykd7wui8.net]
iOS9のSafariでWebを見た時、リーダーが使えず
以下のURLを参考にフォントを拡大して使っています。
iOSのSafariで表示してるページの文字の大きさを自由に変更しよう!
mag.torumade.nu/?p=7260
ここにあるJavaScriptの+/ーそれぞれの記述ですが、
フォントを多きく/小さくしている箇所は何処でしょうか?
今は2,3回ポチって文字を大きくしています。
出来ればポチったら一発で好みの文字の大きさにするスクリプトにしたいです。

JavaScriptで文字の大きさを買えるのに、試行するのは構いませんので
宜しくお願いします。
JavaScriptは書いたこと無いので、ここでの記述をコピペになると思います。

720 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 21:35:26.83 ID:DYttMfqr.net]
めんどくさいしこれでいいよ
まともな造りしてればまあ読めるだろ
大きさ変えたいなら 20px を好きな値にしな

javascript:document.body.innerHTML+='%3Cstyle%3E*%7Bfont-size:20px!important%7D%3C/style%3E';

721 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 22:07:33.10 ID:u57UUEr0.net]
>>698
> 設計が悪いだろ。そりゃデータとロジックが分離できてないとしか言いようが無くないか?

日付やundefinedはデータですよ?
これをロジックと言い張る人、初めて見たわーwww

722 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 00:16:54.38 ID:XW0r+pFS.net]
>>702
関数、に言ってるんだけど。
とにかく言い負かされたくなくて必死なんだな。
あと、undefinedは正確にはデータではなく、状態。
日付は、日付。Dateクラスは、日付を扱うためのクラスであり、日付の値では無い、あくまで値は、.valueOf()で取得できる値。

ババロア君は馬鹿か無知かどちらかにしとけよ。ババロアすら詰まってないんじゃねえの?

723 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 00:31:17.80 ID:gkJjvuAc.net]
>>703
なんで3つのうち関数にしか言わないの?

残り2つは反論できませんって話かwww



724 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 00:33:59.24 ID:gkJjvuAc.net]
"abc".bold() って実行してみ?
文字列は

725 名前:クラスだって知らないのかな?www []
[ここ壊れてます]

726 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 00:46:16.36 ID:XW0r+pFS.net]
>>704
2つはその、下で反論してるけど。
文字も読めないの?

>>705
.valueOf実行してみ。
薄いラッパーに包まれたただの値だとわかるよ。

727 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 00:47:44.33 ID:XW0r+pFS.net]
>>705
プロトタイプに実装されてるか、それともインスタンスに実装したのかも分けて考えような、ボンクラ。

728 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 01:18:50.68 ID:gkJjvuAc.net]
>>706
日付.valueOf実行してみ。
薄いラッパーに包まれたただの値だとわかるよ。

729 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 01:20:43.01 ID:gkJjvuAc.net]
>>707
> プロトタイプに実装されてるか
String.prototype.hoge = function() {} と定義したものが
"abc".hoge() で呼び出されるな。
プロトタイプに実装されてるわけか。

730 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 01:38:53.96 ID:MlF9RYHU.net]
プリミティブ型とラッパーオブジェクトは別物だから明確に区別しとかないと事故るぞ
例えば以下の様なケース

if(new Boolean(false) && new Number(0)){
//どちらもオブジェクトが存在するのでtrue
//よってここは常に実行される
}
if(false || 0){
//どちらもプリミティブでfalseとして扱われる値
//よってこちらは実行されない
}

731 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 02:49:55.65 ID:bQl7rsTf.net]
>>701
ありがとうございました。

732 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 09:31:42.05 ID:srh2csoY.net]
>>710
いろんなJS質問スレ見てきてるが半年ぶりくらいに
まともな初心者解説のコードが書かれたな。

733 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 16:34:23.27 ID:6iHig3Yk.net]
ゴミが持論書きなぐってるだけのクソスレに何を期待してるの?



734 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 17:12:33.16 ID:BB7ZCZit.net]
動画サイトだけ自動でCSSを切り替えるために、動的に挿入されたiframe, video, object, embed エレメントを検出したいんですが、効率的な方法が思い浮かばず困っています
iframeとvideoはdocumentでイベントリスナ(load, loadedmetadata)すれば検出できるんですが、なぜかobjectとembedちゃんからのお便りが来ません(chrome ver51)
とりあえず暫定的にクリック毎にgetElementsByTagName()で代替しているんですが、
何かもっとスマートな方法ないでしょうか

735 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 19:02:26.08 ID:Rqj2POSn.net]
MutationObserverで逐一tagName調べるのが無難かな

736 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 19:29:30.69 ID:BB7ZCZit.net]
>>715
動画サイトの場合、オプション{childList true, subTree: true}でノード追加を監視すると、コンソールが常時ナイアガラの滝のように・・・

737 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 19:41:50.28 ID:nZkVhJBc.net]
>>713
その通りだね
俺様流カレーライスの作り方みたいなもんだよねw

738 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 02:23:30.51 ID:zfC6EzMS.net]
>>717
その俺様流カレーライスの作り方で、ドヤ顔でハヤシライスの作り方説明して、これが「妥当なカレーライス」とか言っちゃうような俺流deepcopyerが
主みたいなスレだからね。
まともな奴はレスしなくなるっしょw

739 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 09:38:41.31 ID:Fpexe9SW.net]
ハヤシライスというより肉じゃがだと思う

740 名前:デフォルトの名無しさん mailto:!sage [2016/06/18(土) 09:43:04.22 ID:pG9pCEms.net]
"a,b,c".split(",",1)で、
["a","b,c"]を取得したいのですが、["a","b"]になります
どうすrばいいですか

741 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 10:53:48.22 ID:49KWKmmu.net]
<input id="a" type="text">
document.getElementById('a').addEventListener('input', function(e) {
console.log(e);
}, false);

enterキーを押した時だけログがでないんですがどうしてですか?

742 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:22:34.63 ID: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 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:28:02.54 ID:z24FpIHh.net]
>>721
document.getElementById('a').addEventListener('keydown', function(e) {
  console.log(e);
}, false);

keydown にすればenterも拾える



744 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:30:40.39 ID:qpxG5nAO.net]
>>722
そんなわけなかろうw
いまゲームしてるからちょっと待てwww

745 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:32:40.70 ID:z24FpIHh.net]
>>720
splitだけでその配列を取得するのは無理

746 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:33:55.65 ID:z24FpIHh.net]
>>724
お、ありがとうございます
たのんます

747 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:40:53.70 ID:lYop9Jcb.net]
>>720
それ戻り値["a"]じゃね?
とりあえず脳内補正で第二引数は2だとするとjavascriptのsplitだとその希望の動作にはならない

第二引数なしでsplitして[t[0],t.slice(1).join(',')]とか
indexOfとsubstring組み合わせて自分で切り出すとか
他にも色々やり方はあるので要求に合った方法を考えて関数化しとけばいいよ

748 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:48:58.73 ID:7whaN/tJ.net]
>>720
indexOfでインデックスを取得してslice

749 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:49:03.57 ID:z24FpIHh.net]
722ですがこっちですかね、余計見にくいような気もしますが(アロー演算子のせい?)

test1().then(() => {
   return test2();
}, () => {
   console.log('1のNG');
}).then(() => {
   // 1 も 2 も成功
}, () => {
   console.log('2のNG');
}).catch(function(e){
   console.log('ここにはいつくるんだろう?');
});

750 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:52:05.82 ID:ousMayNp.net]
>>722
thenの結果は自動でプロミスに変換されるから、function test2 のなかでプロミスを作らなくておk

シンプルにfunction test2(previousResult) { // 非同期な処理 return resTest2} としておいて

test1
.catch(resTest1 => resCatch1)
.then(test2)
.catch(resTest2 => resCatch2) 〜 とつなげればいい

一個目のcatchを省略した場合、 test1でエラーが起きると最後のキャッチにジャンプする

751 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:54:20.50 ID:7whaN/tJ.net]
>>721
可能性はいくつかある
- input要素で [Enter] キーを押している
- IME変換時に [Enter] キー

752 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:56:06.15 ID:ousMayNp.net]
>>729
thenの第二引数をcatchとして使うと、そのthenで起きたエラーは拾わなあいから、必要ないときはcatchを使ったほうがいいよ 分かり易いから

753 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 13:56:58.21 ID: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 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 14:06:33.76 ID: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);
  })
);
[]
[ここ壊れてます]






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<397KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef