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);
});
758:デフォルトの名無しさん
16/06/18 14:27:30.76 lYop9Jcb.net
>>729
まずtest1とtest2の中の非同期でresolve(戻り値)またはreject(エラーの原因)を呼んでる事は前提とすると
function err(e){console.error(e);};
function finish(val){console.info("終了",val);};
test1().then(test2).then(finish).catch(err);
thenで第二引数を渡さなければrejectもcatchに飛ぶのでこれで充分なはずだけど?
759:デフォルトの名無しさん
16/06/18 14:30:46.97 qpxG5nAO.net
.then(text => test1(text)) は
.then(test1) これでよかったな。
760:デフォルトの名無しさん
16/06/18 14:38:51.52 qpxG5nAO.net
他にもいろいろ書き換えてみたけど、これが俺の中でベストかな
Promise.resolve("sample")
.then(test1)
.then(text => {
console.log("test 1 OK:" + text);
return text;
}, text => {
console.log("test 1 NG:" + text);
return text;
}
)
.then(test2)
.then(text => {
console.log("test 2 OK:" + text);
}, text => {
console.log("test 2 NG:" + text);
}
);
761:デフォルトの名無しさん
16/06/18 14:51:32.54 z24FpIHh.net
皆さんありがとうございます。
まだ若干こんがらがってますが、理解がだいぶマシになりました。
test2はプロミスにしなくてOKということですが、
test2を単独で使用する可能性がある場合は今のままでも大丈夫ですよね...?
762:デフォルトの名無しさん
16/06/18 14:52:59.75 z24FpIHh.net
皆さんのを参考に
function test1(text) {
return new Promise(function(resolve, reject) {
setTimeout(() => {
reject(text);
}, 1000);
});
}
function test2(text) {
return Promise.resolve(text);
}
Promise.resolve("sample")
test1("test")
.then(text => {
console.log("test 1 ok " + text);
return text;
}, text => {
console.log("test 1 ng " + text);
return text;
})
.then(test2)
.then(text => {
console.log("test 2 ok " + text);
})
.catch(text => {
console.log("test 2 ng " + text);
});
こういうのを書いてみたのですが、
test1でrejectしてもそのままtest2に入ってきましたが、これはこういうものでしょうか?
763:デフォルトの名無しさん
16/06/18 14:54:43.38 z24FpIHh.net
すみません、>>741の Promise.resolve("sample")は不要ですね
764:デフォルトの名無しさん
16/06/18 15:02:45.38 qpxG5nAO.net
>>741
> test1でrejectしてもそのままtest2に入ってきましたが、これはこういうものでしょうか?
あれ?そういう仕様だと思ってたよw
じゃあ書き換えが必要だね。
いまゲームしてるから(ry
765:デフォルトの名無しさん
16/06/18 15:15:57.87 HfDVf1Az.net
>>741
URLリンク(www.html5rocks.com)
766:デフォルトの名無しさん
16/06/18 15:28:56.46 z24FpIHh.net
何度もすみません。
>>743-744
ありがとうございます、そのサイト見てたはずですが見落としていました
だいたい理解できました。
一連の質問は解決ということで問題ないです。
皆さんありがとうございました。
767:デフォルトの名無しさん
16/06/18 23:31:55.96 aNvZce14.net
imeオンオフに関わらずEnterキーが入力されたか確認する方法を教えてください
768:デフォルトの名無しさん
16/06/19 01:39:49.43 XpUIM/8a.net
>>746
IME周りはブラウザ毎に実装が違ったりして面倒なので全てのブラウザで動くとは保証出来んが
keydownでキーコード229,0,13を拾えばだいたい拾えるんじゃないかね?
769:デフォルトの名無しさん
16/06/19 01:54:37.93 jkRTuMFS.net
おしんとひこうきぴゅんぴゅん
770:デフォルトの名無しさん
16/06/19 15:42:45.26 j/5yp6z/.net
古いソフトのプラグイン頼まれたんだけど新しめのESで追加された機能がほとんど使えなくて難儀してる
よくわからないんだけどこういうのって作者が対応すれば使えるようになるの?
VSなんかだと参照突っ込むだけで機能使えるようになるけど
そういうお手軽はお話じゃないんかね
771:デフォルトの名無しさん
16/06/19 19:29:55.99 fmRoj+h3.net
なんのエンジン使ってるか知らんが例えばV8でも無理でーす
奴らは自分のブラウザで動けばいいので毎日のように互換性壊しまくりのスケ~
772:デフォルトの名無しさん
16/06/20 18:11:29.60 tys3WiX6.net
javaでいうTreeSetを使いたいのですが、ありますか?
773:デフォルトの名無しさん
16/06/20 18:48:32.16 hRWj67CX.net
(非数字)文字列ならオブジェクトのプロパティとして加えていって列挙すればソートされてる
774:デフォルトの名無しさん
16/06/21 00:26:47.70 qdV120KE.net
リンクをクリックするとJavaScriptでページ遷移するウェブページで、遷移する先のURLを事前に取得する方法はありますか?
意図としてはページに飛ばされる前にどこに飛ぶのか判断したいためです。
775:デフォルトの名無しさん
16/06/21 00:47:36.70 Zouo8B6w.net
>>753
JavaScriptでページ遷移するなら遷移先URLもJavaScriptで分かっているはずなのだが
776:デフォルトの名無しさん
16/06/21 08:14:40.47 vlWZNI1X.net
>>754
最終的な遷移先のURLを鯖側で生成してたらわからんけど
777:デフォルトの名無しさん
16/06/21 09:06:55.19 zhgdBgoI.net
>>754
説明が足らずすみません。
他者が作ったウェブサイトの環境で、ブラウザの拡張機能などで自前のJavaScriptを実行して判断したいということでした。
そういうことだと>>755さんの言うとおり、他者のサーバで生成してるからわからないってことになりそうですね。
778:デフォルトの名無しさん
16/06/21 11:17:04.95 Zouo8B6w.net
>>756
URLの生成規則を探すとか、JavaScriptコードを読んでコードから遷移先URLを得る、とか一概には言えないと思う
779:デフォルトの名無しさん
16/06/21 12:14:28.77 VoVagir1.net
>>756
クライアントが移動先を知ってるなら取る方法はない訳ではないが
鯖側でリダイレクトさせる場合にはAjaxでリンクを踏んで戻った内容からリダイレクト先をスクレイピングするとかしないと無理だろうね
つまり画面遷移をせずにリンク先を取得する事は可能、鯖と通信せずにリンク先を取得する事は不可能なケースがある
クライアント上で動作している以上、クライアントが知らない情報は取得出来ない
780:デフォルトの名無しさん
16/06/21 13:29:33.82 NcocGzZA.net
いや、どこに跳ぶかを判断したいくらいなのだから、
いろんな方法・想定で常識的な範囲で全て判断できると言えるだろう
781:デフォルトの名無しさん
16/06/21 19:00:28.03 s0xSal8K.net
VBのFormsみたいなフレームワークってないすか?
デザイナでペタペタ配置してロジックは画面オブジェクトにハンドラを書くだけ的なやつです
782:デフォルトの名無しさん
16/06/21 19:02:39.48 rJ2mr4JY.net
>>760
ホームページビルダで出来ない?
使ったことないから知らんが
783:デフォルトの名無しさん
16/06/21 20:02:34.86 zhgdBgoI.net
>>757
>>758
丁寧に回答していただきありがとうございます。
リンククリック時のJavaScriptからレスポンスを解析してURLを取得できるかを試してみます。
784:デフォルトの名無しさん
16/06/21 22:07:52.39 8xYufxWO.net
var fs = require('fs');
var data = "write text test!";
fs.writeFile('writetest.txt', data , function (err) {
console.log(err);
});
785:デフォルトの名無しさん
16/06/21 22:09:11.15 8xYufxWO.net
このくらいのプログラムをNodejsで作ってNodejs上ではもちろん動きましたが
786:デフォルトの名無しさん
16/06/21 22:14:12.35 8xYufxWO.net
webpack上では動きません。
先にNodistを入れたのですがUpdateすると依存関係のエラーが多かったので
Nodejp単体で入れることにしました。
ところが
npm install webpack -g とかするとなぜかNodistのフォルダに入ってしまいます。
そのせいでビルドができてないのでしょうか。
経験のある方お願いします。
スレ違いなら誘導していただけるとありがたいです。
787:デフォルトの名無しさん
16/06/21 23:28:49.59 8xYufxWO.net
変換したものは長くてここに表示しきれないですが
require is not defined
と出ますね。
一応webpackは通したのですが。
ブラウザはFirefoxです。
788:デフォルトの名無しさん
16/06/22 00:14:59.67 azjhZ3WA.net
javaScriptのSetってSetとWeakSetしかないんですか?
SortedSetが欲しいです
789:デフォルトの名無しさん
16/06/22 07:19:51.98 cIEa5wGZ.net
ソートっていろんな種類があるからねぇ。
自分で作ったら?
790:デフォルトの名無しさん
16/06/22 11:58:39.11 q9pILfZy.net
Nodist を アンインストールしてその後、 Node.jsを入れたのですが
npm root -g としてモジュールがインストールされるディレクトリを見ると
C:\Program Files (x86)\Nodist\bin\node_modules
なっています。
環境変数も見ましたがNodistの残骸が残っているようにはありません。
どこにNodistの情報が残っているのでしょうか。
791:デフォルトの名無しさん
16/06/22 14:53:18.59 q9pILfZy.net
ユーザーディレクトの下にprefixの設定が残っていたようです。
792:デフォルトの名無しさん
16/06/22 14:58:05.09 q9pILfZy.net
npm config lsで調べて上記のことが分かったのですが、未だに
require is not defined
のエラーが解決されません。
/***/ },
/* 2 */
/***/ function(module, exports) {
module.exports = require("fs");
/***/ }
/******/ ]);
どうもコメントばかりついていてうまく変換されたように見えません見えません。
793:デフォルトの名無しさん
16/06/22 21:00:04.72 /0SrxieV.net
誰としゃべってんのこいつ
794:デフォルトの名無しさん
16/06/23 00:00:47.49 wmr/9KTO.net
>>769-771
恐らく環境変数node_pathがNodistのディレクトリのままだろうから書き換え
あとfsのようなNode.js用モジュールはWebpackでバンドルできないはず
Webpackからファイル読みたい場合はLoader使って事前に含めるしかない
795:デフォルトの名無しさん
16/06/23 01:13:09.29 Lewr0A8P.net
ありがとうございます。
Webpackからは基本できないのですね。
set コマンドでは
NODE_PATH=C:\Users\habu\AppData\Roaming\npm\node_modules
アンインストーラーを使っても環境変数を調べてもどうにもならなかったので
アンインストーラーが削除し忘れた
"C:\Users\xxxx\.npmrc"
を手動で削除したらパスの通ったところにモジュールをインストールするようになりました。
796:デフォルトの名無しさん
16/06/23 12:30:54.99 TKILd+kM.net
IE11,Edge,Firefox,Chrome,safari,Operaの6つのブラウザを同時に起動してるんですが
javascriptを更新したらブラウザに切り替えてページ更新するのが面倒くさいんですが
ファイルが更新されたら自動的に更新する方法ありませんか?
797:デフォルトの名無しさん
16/06/23 12:33:06.98 p9xHkbsy.net
>>775
定期的にリロードするようにしたら良いんじゃないの?
798:デフォルトの名無しさん
16/06/23 14:14:01.07 1rhmo8jO.net
ファイルを監視して更新があったらブラウザのウィンドウをアクティブにしてリロード操作(F5?)のイベントを送るツールでも作ればいいんでない?
799:デフォルトの名無しさん
16/06/23 15:28:59.42 it3byhHh.net
>>775
簡単に出来ますよ
800:デフォルトの名無しさん
16/06/24 11:16:15.69 M5Y9qYOR.net
>>773
いまいち例が無くてどのローダーを使えばテキストファイル出力ができるのか
分からないです。
ホームページで確認してraw-loaderがUTF-8に出力するみたいなことを書かれていた
GreasemonkeyからinnerTextをテキストファイルに出力したいだけなのですが
かなり敷居が高いようですね。
色々なサイトで実験されている
801:デフォルトの名無しさん
16/06/24 11:22:06.51 M5Y9qYOR.net
みたいなのですが、セキュリティがらみなので改善(改悪?)されてできなくなったところが多いです。
raw-loaderの使い方の例がもう少しサンプルで出されているサイトがあればいいのですが。
あと、少し2ちゃん専用のソフトの使い方になれてなくて間違えて文章を途切れ途切れに
送ってしまったことをお詫びします。
802:デフォルトの名無しさん
16/06/24 12:30:59.24 V/itJnf4.net
Loaderは読み込んでバンドルするだけで書き込みはできないよ
ブラウザから書き込みしたいなら拡張機能のAPIを探すしかない
803:デフォルトの名無しさん
16/06/24 14:35:52.18 M5Y9qYOR.net
>>781
そうなんですか。どこを探しても無理なわけですね。
拡張機能と言うのはブラウザの拡張機能ですか?
煮詰まったので今のところはローカルにapacheでサーバーを立てて
PHPでアクセスすることを考えています。
それでだめなら拡張機能のAPIを探すことを考えています。
804:デフォルトの名無しさん
16/06/24 23:07:00.20 qTbX1cTa.net
プログラミングに詳しい方々がいると聞いて質問しにきました。
初心者なので説明力、知識が乏しいですが申し訳ありません。
私は、不特定多数の人が画像をサイト上のみで「読み込み→編集→ダウンロード」を全てできる画像編集サイトを作ろうと思っていて、
色々調べている内にImageMagickと言うプログラムにたどり着きました。
ですが使い方などが全くわからず、困っております。現在xサーバーを利用していてホームページを取得しています。
xサーバーは公式で既にImageMagickがインストールされているということです。(この事についてもいまいち分かりません)
どなたか分かりやすく画像編集サイトの作り方を教えていただけませんでしょうか。
OSはwin7 64bitです。
本当に困っています。
805:デフォルトの名無しさん
16/06/24 23:12:05.32 Fo67yJqk.net
>>783
PHPで作った方がいいと思うよ
PHP板行ったら?
スレリンク(tech板)
806:デフォルトの名無しさん
16/06/24 23:14:07.58 qTbX1cTa.net
>>784
PHP板にてここで聞いた方がいいと言われ、質問いましました
807:デフォルトの名無しさん
16/06/24 23:14:44.48 Fo67yJqk.net
>>785
jsじゃ無理だよ
PHPじゃないと出来ない
808:デフォルトの名無しさん
16/06/24 23:16:31.66 Fo67yJqk.net
一番簡単に作れるのは、Ruby
Rubyスレ行ってみたらどうだ?
809:デフォルトの名無しさん
16/06/24 23:28:09.79 V/itJnf4.net
>>782
その通りブラウザ拡張機能のAPI
でもローカルにHttpd立てていいなら>>763の弄って使えばいいんじゃない
どうせグリモンで動かすUserScriptからHTTPでやり取りするんだろうし
>>783
まず画像を読み込んで編集して保存するのはJSで出来る
画像を不特定多数でどう扱うのかによってはサーバー側の実装も必要だけど
これもNode.jsを使えばJSで作れる、因みにこっちはPHPでも作れる
ただ作り方となると手順が膨大だから一々説明してられん
「JavaScript ファイル読み込み」など一つずつググって勉強するしかない
810:デフォルトの名無しさん
16/06/25 11:12:38.28 FcXCwkAU.net
textareaで入力した位置を知る方法ありませんか?
811:デフォルトの名無しさん
16/06/25 11:24:52.49 YFtEcFF6.net
>>789
コピペなんかも含めると、入力される前の文字列をバッファしておいて、今回文字列と一番最初に差異が発生する文字まで素直に比較するほうが早いんじゃないかな。
812:デフォルトの名無しさん
16/06/25 18:02:11.94 4KOaD2nt.net
>>789
selection とか range で調べるよろし
>>790
aaa => aaaa どこだと思う?
813:デフォルトの名無しさん
16/06/26 00:07:56.02 nF43cUdI.net
いつもは、ネットと、日経ソフトウェアを毎月買ってるから、
日経ソフトウェアのJavascript特集しか読まないんだけど、
久しぶりに書店でJavascriptの本あさってたら、
JAVAの本と混同してJavascripの本が並べてあった。
何十人かに試したことあるが、プログラム興味ない人がらみたら、
JAVA=Javascripの省略して言うとJAVA
Javascrip=JAVAの正式名称
って認識しかしてないからな。
814:デフォルトの名無しさん
16/06/26 05:07:36.84 G2D2TVQW.net
コードの問題。
例えば旅行本だと国別に区切られてるが、プログラミング言語にはそれがない。
815:デフォルトの名無しさん
16/06/26 05:45:31.43 FIFPZYCa.net
>>792
自分の住んでる地元の一番大きい本屋もまんまこれだった
CとかVBAとか有名な言語は分類札付けて、カテゴリ分かれてるのに
JavaScriptだけJavaの所に全部突っ込まれてる
816:デフォルトの名無しさん
16/06/26 08:11:55.58 lQezokMe.net
JQueryを使ってテキストフォームを扱っていますが、項目数が増えさらにページ遷移が増えました。
JQueryよりもそういうことを扱うことに長けたフレームワークみたいなのがあればそちらに移りたいのですが何かそういったことを補助してくれるようなものはありませんか?
817:デフォルトの名無しさん
16/06/26 10:40:37.56 TQCRDnYp.net
>>795
具体的に何がしたいのかがわかならい
エスパーするとJQueryの使い方がわからないってことかな?
818:デフォルトの名無しさん
16/06/26 11:55:24.56 9G4pt3CC.net
DOM書き換えでのページ管理に限界を感じてるからjQuery捨てたいみたいな感じ?
学習コストかかるだろうけど、流行ってるReactとか
819:デフォルトの名無しさん
16/06/26 12:24:25.89 rwwPSVEU.net
どうも使い方が分かっていない人が多いよね
センスがないとでも言うのだろうかw
820:デフォルトの名無しさん
16/06/26 12:39:49.80 AVATszy2.net
ライブラリ質問はスレ違いといいたいところだが、テンプレが改変されてたんだった
Web制作板の荒れようをみるにプログラム板にもライブラリスレを持ってくるべきなんだろうが、統合する流れでいいのかね
あるいは、べつにスレを立てるべきか
821:デフォルトの名無しさん
16/06/26 12:51:24.25 mFfhShD5.net
vol.120でまともなテンプレで建て直していいんじゃね
あっちのライブラリスレもこの板に移す話はあったんだけどよくわからんな
822:デフォルトの名無しさん
16/06/26 14:02:23.24 8VkrGxxn.net
reactの質問はどこでしたらいいですか?
823:デフォルトの名無しさん
16/06/26 15:09:43.72 Tksz8qNK.net
>>801
Yahoo知恵袋がおすすめ
824:デフォルトの名無しさん
16/06/26 15:12:21.33 GJBR8D9H.net
>>802
javaの道(掲示板)がおすすめ
825:デフォルトの名無しさん
16/06/26 20:07:37.03 YbtLHjt0.net
<img src=x onerror='alert(1)'></img>
みたいにHTMLエンティティがエスケープされてるテキストノードをtextContentで参照するとエスケープが解除されるので、innerHTMLに代入した瞬間にalertが鳴るよって記事をどっかで見たんだけど、
誰か見覚えあってURLわかる人おらんかのう
826:デフォルトの名無しさん
16/06/26 20:28:22.69 nF43cUdI.net
自分の作ってるwebアプリでエラー原因調べて、質問するって
難しいんだよな
問題を書き出すって骨の折れる作業だし
827:デフォルトの名無しさん
16/06/26 22:32:25.10 D+buTpss.net
>>800
立て直すとスレが乱立するからこのスレに新しいテンプレを貼り付ける程度で十分かと
問題はライブラリスレもここに統合するか、別スレに独立させるか
828:デフォルトの名無しさん
16/06/26 22:58:59.69 oKpI3hc9.net
重複が嫌なら一個飛ばして121にするとか
本来荒らしの立てたスレを再利用するってのはよくないし、まあ今はずるずる来てるけど
829:デフォルトの名無しさん
16/06/26 23:29:46.97 S5Kwqidr.net
むやみに別スレ建てんなよWeb製作版の二の舞いになる
スルーすればいいだけ
830:デフォルトの名無しさん
16/06/26 23:30:12.91 yAtATLvz.net
>>805
ブレークポイントを適度に付けて、デバッグする。
変数の内容も見る。
エラーメッセージで検索する
C/C++以外の言語は、シャローコピーするから、破壊的変更をするときは要注意!
831:デフォルトの名無しさん
16/06/27 00:44:37.06 Azx2VHQP.net
JSはDOM絡みのテスト書くのが特にしんどい
書いてもElectronで動いたのがwebkitじゃダメでしたとかままあるし
>>806
復活したWeb板のライブラリスレもぼちぼち伸びてきてるし
また潰されるかあるいは埋まりそうになるまで保留でいいんじゃない
832:デフォルトの名無しさん
16/06/27 00:51:43.37 Qt/WCn3i.net
JSにかぎらずUIのテストっていうのは難しいんだよ。
833:デフォルトの名無しさん
16/06/27 04:38:11.54 Hl6kI6LE.net
別にJSじゃなくてもDOMのテストは難しいしね
JSにはDOMしかないわけでもないし
834:534
16/06/27 12:24:43.46 oBcOOaIt.net
>>534 なんですが、プログラム板なのにコードが潰れることにもやっとしたので、スレにjs-beautifyとhighlight.jsを掛けるchrome拡張を作ってみました
試作機1号ができたのでさっそく試してみたんですが・・・
2chのコメのなかにコーディングのカラースキームが混在してる違和感が凄いww
URLリンク(i.imgur.com)
URLリンク(i.imgur.com)
URLリンク(i.imgur.com)
URLリンク(i.imgur.com)
835:デフォルトの名無しさん
16/06/27 19:39:44.45 jJ8qgrxg.net
<a href="~hoge.pdf">PDF</a>
上記のようにHTMLでPDFのリンクを作成しPDFをダウンロードさせたいのですが、IEのみ同一タブでPDFが表示されてしまいダウンロードできません。
IEの設定を変更することなく、HTMLとjavascriptだけでIEでもダウンロードできるようにしたいのですが、何か良い方法はありませんでしょうか。
ちなみに、以下の4ブラウザ全てでダウンロード可能にしたいです。
・IE11
・chrome
・firefox
・safari(mac)
よろしくお願いします。
836:デフォルトの名無しさん
16/06/27 20:20:31.97 Hl6kI6LE.net
ChromeとFirefoxだけで我慢しんさい
837:デフォルトの名無しさん
16/06/27 20:45:40.58 Qt/WCn3i.net
>>814
普通はHTTPヘッダで制御する。
つまりウェブサーバーかサーバー側のアプリ
あんたがクライアントアプリしか書けないとか
サーバーいじる能力がないなら諦めなさい
838:デフォルトの名無しさん
16/06/27 20:59:41.80 zoQ6BtW7.net
>>815
>>816
やはり無理なんですね……
ありがとうございます!
839:デフォルトの名無しさん
16/06/27 21:24:55.66 zcQLvEgn.net
var xhr = new XMLHttpRequest();
xhr.open("GET", "hoge.pdf");
xhr.responseType = "blob";
xhr.addEventListener("load", function(){
var blob = new Blob([xhr.response]);
window.navigator.msSaveBlob(blob, "hoge.pdf");
});
xhr.send();
840:デフォルトの名無しさん
16/06/28 15:38:36.90 +n63MTqJ.net
「できる」と「やっていい」は別だよな
最低限のモラルも守れないようじゃねぇ
まあdownload属性のエミュなら良いと思うよ
841:デフォルトの名無しさん
16/06/28 16:46:50.81 YVMoIJVb.net
URLリンク(jsdo.it)
のページのサンプロコード、20行目で見かけたのですが、
この場合のvideoの前後にあるスラッシュはどういう意味があるのでしょうか?
if( !/video/.test(file.type) ){
!video.test(file.type)
ではダメなのでしょうか
842:デフォルトの名無しさん
16/06/28 17:09:49.76 +pusRZvt.net
/で囲まれてるのは正規表現
この場合file.typeに"video"って文字列が含まれてるかみてる
843:デフォルトの名無しさん
16/06/28 18:04:00.99 YVMoIJVb.net
>>821
なるほど、ありがとうございます
844:デフォルトの名無しさん
16/06/29 11:29:03.86 VdhPxYFi.net
>>819
わりと素で聞きたいんだけど、このケースのどの部分がモラルに反してるの?
他のブラウザがdownload属性でできることを、IEができないから代替策探してるだけだよね
845:デフォルトの名無しさん
16/06/29 16:17:09.72 L39nkKa/.net
function fileListDirectory(files) {
var ファイル数 = files.length;
var ファイル名 = new Array();
var パス = new Array();
for (i=0; i<ファイル数; i++) {
ファイル名[i] = files[i].name;
パス[i] = files[i].webkitRelativePath; // 行A
}
}
これでフォルダの全てのファイルのパスがわかるんだが
これを絶対パスにするにはどうすればいいんだ?
846:デフォルトの名無しさん
16/06/29 21:48:19.77 ViUTH2Wh.net
JQueryの$って関数ですか?連想配列ですか?
$(hoge)が出来るというのは関数だと思うんですが、$.foo(bar)が出来るというのは連想配列だと思います
一体何なんですか?あのキモイ未知の変数は
847:デフォルトの名無しさん
16/06/29 22:21:45.97 uR/sla0B.net
関数もオブジェクトだからな
848:デフォルトの名無しさん
16/06/29 22:29:13.21 ViUTH2Wh.net
つまり
hoge=function(){
//処理
}
hoge.a=function(){
//処理
}
hoge.b=function(){
//処理
}
って事ですか?
849:デフォルトの名無しさん
16/06/29 22:45:16.05 11RiuwSN.net
>>825
jQueryは関係ありません。
あなたはJavaScript自体がわかっていません。
そしてオブジェクト指向もわかっていません。
「オブジェクト指向言語であるJavaScriptは、関数もオブジェクトです。」
この一言で理解できますかね?w
function foo(a, b, c) {} という関数を作ったら関数もオブジェクトなんだから
console.log(foo.name) とか ※nameは非標準だけれどだいたい使える
console.log(foo.length) とか ※関数の引数の数
foo.toString() とか ※ソースコードを返す。
標準でできるんですよ。
850:デフォルトの名無しさん
16/06/29 22:48:52.04 11RiuwSN.net
真のオブジェクト指向言語は何でもオブジェクトであるって
考え方ができるかどうかですねw
JavaScriptではオブジェクトではないものもあるけれど、
どちらかと言えばオブジェクトであるものが多い方
真のオブジェクト指向に近づくほど
なんでもオブジェクトになる。
851:デフォルトの名無しさん
16/06/29 22:52:05.42 0EN53mtK.net
>>828
そんな事出来るのかよ
凄い
852:デフォルトの名無しさん
16/06/30 00:37:24.48 s9p3Net1.net
だからnullもオブジェクトにしたまま放置なんですね(白目)
853:デフォルトの名無しさん
16/06/30 01:51:26.57 RtLNL8Qe.net
Functionオブジェクトも、大本のObjectオブジェクトから派生している。
Objectは、処理(メソッド)・状態(プロパティ)を持つ
関数型言語ではオブジェクトは、1級市民オブジェクト(First Class Object)と言って、
持ち運べたり、関数の引数に渡したり、関数から戻り値として返したりできる
つまり、Functionはオブジェクトだから、持ち運んで、後で呼べる(遅延・コールバック)
クラス・無名クラス・クロージャ・ラムダも同じで、オブジェクト。
primitive 以外は、すべてオブジェクト
854:デフォルトの名無しさん
16/06/30 11:12:43.81 bL1n9aIG.net
一級市民オブジェクトw
855:デフォルトの名無しさん
16/06/30 12:54:42.82 EibH/T4h.net
JapScript
856:デフォルトの名無しさん
16/06/30 12:55:18.07 s9p3Net1.net
一級市民オブジェクトとか和訳した人センスあるわw 嫌いじゃない
で�
857:燔a訳で覚えるとググるとき大変じゃね
858:デフォルトの名無しさん
16/06/30 13:18:07.02 bL1n9aIG.net
>>835
ググった結果、驚愕の真実が・・・
ファーストクラスオブジェクト: 約 1,520 件
第一級オブジェクト: 約 1,400 件
一級市民オブジェクト: 約 49 件
少なすぎじゃね?
Googleぶっこわれてんのか?
859:デフォルトの名無しさん
16/06/30 13:41:53.09 9tXhK5Ll.net
First Classで市民が出てくる当たり英語というか教養がないな
860:デフォルトの名無しさん
16/06/30 14:17:10.15 bL1n9aIG.net
>>837
逆かもよ
URLリンク(ja.wikipedia.org)
> 第一級オブジェクト
>
> 第一級オブジェクト(ファーストクラスオブジェクト、first-class object)は、(略)
> (略)
> この言葉は1960年代にChristopher Stracheyによって「functions as first-class citizens」という文脈で初めて使われた。
861:デフォルトの名無しさん
16/06/30 14:32:43.41 WQ4EC21M.net
上級市民オブジェクトにしろ
862:デフォルトの名無しさん
16/06/30 19:06:07.78 nv8TDX79.net
> 関数型言語ではオブジェクトは、1級市民オブジェクト(First Class Object)と言って、
この訳がおかしい、といわれてるだけ
一級市民を名乗るなら "citizens" を入れればいい
- 一級市民のような関数(functions as first-class citizens)
- 第一級オブジェクト(First Class Object)
863:デフォルトの名無しさん
16/06/30 22:26:27.40 s/7LoWQJ.net
そもそも、「functions as first-class citizens」の訳は「第一級市民関数」ではないよな
「第一級市民関数」と呼ぶなら "functions of first-class citizens" と書いてもらわんと
ただし、as から of になると「一級市民に属する関数」の意味になって本質と全く異なる表現になる
何をもって「一級市民」が出てきたのかをよく考えるといい
864:デフォルトの名無しさん
16/07/01 10:57:22.28 2ngPRN1W.net
ofはないわー
865:デフォルトの名無しさん
16/07/01 13:26:49.33 swuu46hd.net
>>842
どう書くのが正しい?
866:デフォルトの名無しさん
16/07/01 14:26:32.24 GE+MZRxs.net
普通に、asは、としての、でしょ。
867:デフォルトの名無しさん
16/07/02 18:28:16.22 m2NwGvL3.net
は?「としての」?
「としての」なんて日常生活で殆ど使わないし
意味もぱっとしないだろ
「としての」「としての」「としての」
用意にゲシュタルト崩壊するだろ?
868:デフォルトの名無しさん
16/07/02 18:47:47.96 hHp4sSVy.net
「一級市民としての関数」?
869:デフォルトの名無しさん
16/07/02 20:14:00.55 AmR+G6iW.net
普通に使うだろ。
プロジェクトの担当としての回答はこうですが、理想論としては確かに認めます、とか。
低い次元の日常生活してるな。
そもそも、イギリスでのfirst-class citizenとsecond-class citizenの違い知ってりゃ理解出来るだろうけど、そういう教養も無いんだろうし。
言っとくと、British citizen otherwise than by descentと、British citizen by descentだからな。
「誰かから受け継いだものではない『英国市民』」と「誰かから受け継いだ(にすぎない)『英国市民』」の違い。
だから、何かから作られたものではない関数含めるオブジェクトを一級市民になぞらえ、そうではないものを二級市民になぞらえてる。
どっかのスレで論破されて発狂してた奴そっくりだな。
870:デフォルトの名無しさん
16/07/02 20:18:56.43 AmR+G6iW.net
あ、これ書いたらわかりやすいかな。
・イギリスで産まれれば一級市民
・親がイギリス人(一級市民)でも、イギリス�
871:相Oで産まれれば二級市民、 ・親がイギリス人でも、二級市民であれば、イギリス国外で産んだ場合国籍を与えることは出来ない
872:デフォルトの名無しさん
16/07/02 20:31:38.20 /wal4gbU.net
一級市民とはニートじゃなくて
ちゃんと税金を払ってる人のことですよ
873:デフォルトの名無しさん
16/07/03 04:16:19.31 +KSQOYrq.net
>>847
それは普通では無いな。
意地を張らずに自分の非を認めろよ。
低い次元の日常生活してる奴には無理かもな。
874:デフォルトの名無しさん
16/07/03 10:44:20.95 xMv6BMC9.net
マスタースレーブとかひどい言い方だよな。
お前らは所詮使い捨ての奴隷よ。
875:デフォルトの名無しさん
16/07/03 12:12:49.74 btJwgGWt.net
>>850
普通でしょw
とりあえず言いかえせば良いと思ってるんだろうけど。
876:デフォルトの名無しさん
16/07/03 13:30:07.63 oNgHKg4C.net
今まで、スラッシュ/ってコントロール文字だから、
var moji="\/";
って具合にエスケープするって認識でいたのですが、
good parts P11に
「/とコントロール文字を除くすべてのユニコード文字」
って書いてあるのですが、
スラッシュ/ってコントロール文字ではないのですか?
877:デフォルトの名無しさん
16/07/03 14:14:39.57 A4NkGxi2.net
コントロール文字がなんなのかも知らないのかw
878:デフォルトの名無しさん
16/07/03 14:16:55.67 A4NkGxi2.net
表示したら音がなる文字があるっていったら
へぇーって言うんだろうなw
879:デフォルトの名無しさん
16/07/03 14:43:21.41 JMRewaFc.net
さすがに若い奴がBEL(0x7) 知らんかったとしても仕方なかろうと思うがなぁ
880:デフォルトの名無しさん
16/07/03 16:11:02.52 YeoQWaDz.net
ゆとりはどうしてググらないのか
881:デフォルトの名無しさん
16/07/03 16:11:29.21 qk7lGSjH.net
>>857
ジジイの方がググらねーけどな
882:デフォルトの名無しさん
16/07/03 16:18:36.85 YeoQWaDz.net
はえーよゆとり、びびるわ
もしかしてBotでも仕掛けてある?
883:デフォルトの名無しさん
16/07/03 16:41:53.92 5c1HtZx3.net
反応が気になって常にリロードしてんのかな
SNSのやりすぎ
884:デフォルトの名無しさん
16/07/03 16:53:17.69 YeoQWaDz.net
しかしググれば分かることを質問されてもな。
もしそれで俺の時まで回答を待っていたのなら、完全に病気だな。
885:デフォルトの名無しさん
16/07/03 19:28:43.02 +KSQOYrq.net
>>852
普通じゃないでしょw
とりあえず言いはれば良いと思ってるんだろうけど。
886:デフォルトの名無しさん
16/07/03 21:31:43.21 EZH9raf4.net
立場を明示せず発言するのは危険だぞ?
887:デフォルトの名無しさん
16/07/03 21:51:09.80 A4NkGxi2.net
>>863
じゃあお前から立場を明示してくれ
888:デフォルトの名無しさん
16/07/03 22:03:40.88 EZH9raf4.net
>>864
俺個人としては痛い子がこれ以上恥を上塗りするのがかわいそうだと思ったから発言した
一人の社会人としては、個人の発言を会社の見解と取られるリスクは避けたいので個人的な発言には必ず私個人としてはと前置きするのが普通だと思う
これでいいか?
889:デフォルトの名無しさん
16/07/03 22:10:11.68 A4NkGxi2.net
>>865
お前なんか可哀想だな。
休日の書き込みなのに、
会社の顔色をうかがってるんだね。
会社第一の人生って感じがするよ。
会社が悪く思われるからこんなことはできん!ってな。
890:デフォルトの名無しさん
16/07/03 22:21:47.90 EZH9raf4.net
>>866
そうか、まあどちらが可哀想かは見解の相違だな
ところで何故そんなにイラついてるんだ?
腹でも減ってるのか?ちゃんと食わんと体に悪いぞ?
891:デフォルトの名無しさん
16/07/03 22:23:43.44 A4NkGxi2.net
>>867
いらついてるのお前じゃね?w
なんで俺がいらついていることにしたいか知らんけどw
892:デフォルトの名無しさん
16/07/03 22:26:30.67 EZH9raf4.net
>>868
そうか、まあイラついてないならいいんだ
話題をすり替えてまで攻撃的な言葉を向けて来たから
何かイラついてるのかと思ったんだ、まあ気にするな
893:デフォルトの名無しさん
16/07/03 22:28:43.96 A4NkGxi2.net
話題をすり替えてっているなら、お前が話題をすり替えてるじゃんw
894:デフォルトの名無しさん
16/07/03 22:30:05.90 A4NkGxi2.net
あと気づいてないようだが、俺は上のだれとも違うよw
お前は一体誰と戦ってるんだ?w
俺は遊べそうと思ったから遊んでるだけだw
895:デフォルトの名無しさん
16/07/03 22:37:55.93 EZH9raf4.net
コントロール文字知らない子を馬鹿にしてた痛い奴だろ?
まあ俺は相手は誰でもいいんよ、反応のいい馬鹿をからかうのが楽しいだけだから
では寝る、スレ汚し失礼した
896:デフォルトの名無しさん
16/07/03 22:51:46.92 YeoQWaDz.net
コントロール文字を知らないゆとりも、ググれないゆとりも、馬鹿にされて然るべき。
おかしな擁護をするからゆとりはゆとりのまま。それはゆとりのためにもよくない。
897:デフォルトの名無しさん
16/07/04 04:44:18.07 gPjkHcng.net
コントロール文字を知らない若人は雇うかもしれないが
人を馬鹿にする奴は雇わない
898:デフォルトの名無しさん
16/07/04 07:56:58.66 Nc/f1szG.net
>>874
確かに!
899:デフォルトの名無しさん
16/07/04 21:07:56.31 xBEl8jJ1.net
と思う意識高い系ゆとりであった
いよいよここもゆとり汚染が酷いな
そうやって自分の周りを自分より馬鹿で固めて安心しているうちはゆとりのままだね
じきに会社が潰れるからそれでいいと思うけど
資本主義はゆとりを特別扱いしてはくれない
君らがコントロール文字すら知らない中年になるのは数年後さ
若いという言い訳が通用しなくなった時にどうなるか見物だね
900:デフォルトの名無しさん
16/07/04 22:32:04.97 vRFMByUM.net
>>876
コントロール文字を知らない中年と
他人を馬鹿にする事しかしない中年
確実に後者の方が害悪だな
901:デフォルトの名無しさん
16/07/04 22:52:08.82 xBEl8jJ1.net
それが正しいかどうかは社会が決めてくれる。
君らが正しければ再就職先はあるだろうし、間違っていれば無いだけの話だ。
ここで言い争う意味はない。楽しみに待てばいい。
902:デフォルトの名無しさん
16/07/04 22:55:17.69 0oVcG5wM.net
今まで、スラッシュ/ってコントロール文字だから、
var moji="\/";
って具合にエスケープするって認識でいたのですが?
903:デフォルトの名無しさん
16/07/04 23:07:56.13 xBEl8jJ1.net
ID:EZH9raf4
>>874
>>875
>>877
俺らの対応に文句を言っているお前らが答えろよ。
当然知っているからその態度なんだろ?
それで放置するのなら俺らに文句を言う筋はないよ。
もっともゆとりにはこの「筋」ってのが通じなくて困るんだが。
904:デフォルトの名無しさん
16/07/04 23:15:25.46 2qwL8Tkv.net
コントロール文字がわからなくてぐぐってみたんだが、制御文字(control character)の事か!
なぜ、controlだけカタカナにするんだろう?
コントロールキャラクタの方がまだ分かる
905:デフォルトの名無しさん
16/07/04 23:27:23.31 vyHh0WrX.net
ルー大柴に尋ねてくれ
906:デフォルトの名無しさん
16/07/04 23:50:51.04 SuUmocnF.net
URLリンク(www.kogures.com)
これ使ってフォルダ読み込んでいるんだけど
指定する場所が毎回同じだから最初からそこを指定するにはどうすればいいんだろう?
わかる人いたら教えて下さい。
907:デフォルトの名無しさん
16/07/05 00:16:53.06 50xvo8fd.net
>>853
元々ハードを制御する為に使われていたASCIIコードの先頭32文字を指していた言葉、改行や前述されたBELなど通常の文字として画面表示されないもの
Unicodeではこの32文字に加えて第14面の追加特殊用途面などに更に多くの制御文字がマッピングされている
なおスラッシュは/という文字なのでコントロール文字ではないし、エスケープが必要かと制御文字どうかには直接的な関連性はない
>>881
本当はコントロールキャラクターと表記したいが多くの日本人はキャラクターという言葉から文字を連想しないから文字と置き換えたのではないかね?
908:デフォルトの名無しさん
16/07/05 00:24:24.40 aq1IVl4D.net
まあ確かに、コントがロール(役割)なキャラクターって思っちゃうわな。
909:デフォルトの名無しさん
16/07/05 01:58:08.99 94G9IfNv.net
>>883
<p>~</p> はいらないので、コメントにするか、削除する
コメントにする場合、<!-- と --> で囲む。
ただし、コメントの中に、コメントは含められないため、<!-- 行C --> を削除する
<!--
<p>
~
</p>
-->
<script>
fileListDilectory("フォルダ名")
function fileListDilectory(files) {
<script>タグと、function~の間に、fileListDilectory("フォルダ名")を追加する。
フォルダ名は、半角ダブルクォーテーションで囲む
910:デフォルトの名無しさん
16/07/05 02:14:24.57 iQZ7PuWs.net
>>884
どちらかといえば、「制御文字」が広く知られていると思うのだが
911:デフォルトの名無しさん
16/07/05 03:12:34.89 gnmCE5Y/.net
結構勘違いされてるけどHTMLのコメントアウトって<!--で開始で-->で終了じゃなくて
<!と>の中にある--で開始で--で終了だから
<!ここはコメントじゃない--ここはコメント--ここはコメントじゃない>
912:デフォルトの名無しさん
16/07/05 03:15:48.89 gnmCE5Y/.net
<!------>
↑これコメント閉じてない
913:デフォルトの名無しさん
16/07/05 03:31:12.38 94G9IfNv.net
Effective JavaScript という本の項目45で、
オブジェクトを辞書として使う際、キーに、hasOwnProperty, __proto__ などを使うと、
既存のプロパティが上書きされて、バグるというのは本当なの?
var dict = { hasOwnProperty : null, __proto__ : null }
>>889
<!-- と --> の間では、-- は使えない
914:デフォルトの名無しさん
16/07/05 04:05:49.05 gnmCE5Y/.net
>>890
だから>>888なんだってば
915:デフォルトの名無しさん
16/07/05 04:07:46.52 Dhx8/uPE.net
最近仕様が変更されてコメント内の二重ハイフンも OK になった
URLリンク(github.com)
916:デフォルトの名無しさん
16/07/05 14:28:39.06 eormrIAE.net
>>888
そんなことはない
URLリンク(html.spec.whatwg.org)
その理屈が認められるならDOCTYPE宣言にもコメントを埋め込み可能になる
<!DOCTYPE html--コメント-->
917:デフォルトの名無しさん
16/07/05 14:49:36.44 eormrIAE.net
>>890
あなたが Object.prototype 上のプロパティを使いたいなら(自分自身で生み出した)バグといえるし、そうでなければバグではない
そもそも、__proto__ に null を代入しているのだからプロトタイプチェーンを辿れないのは当然の事だ
自分が何をしているのかを理解していればそれがバグとなる由もない
var dict = { hasOwnProperty : null, __proto__ : null };
Object.prototype.hasOwnProperty.call(dict, 'hasOwnProperty'); // true
dict.hasOwnProperty('hasOwnProperty'); // TypeError: dict.hasOwnProperty is not a function
dict.valueOf(); // TypeError: dict.valueOf is not a function
918:デフォルトの名無しさん
16/07/05 16:01:54.40 50xvo8fd.net
>>891
w3cのhtml5勧告によると、<!--の4文字シーケンスで始まり-->の3文字シーケンスで終わるときっぱり書いてある
以下出典と該当する部分の引用
URLリンク(www.w3.org)
8.1.6 Comments
Comments must start with the four character sequence U+003C LESS-THAN SIGN, U+0021 EXCLAMATION MARK, U+002D HYPHEN-MINUS, U+002D HYPHEN-MINUS (<!--).
(ここに中身について云々あるが中略)
Finally, the comment must be ended by the three character sequence U+002D HYPHEN-MINUS, U+002D HYPHEN-MINUS, U+003E GREATER-THAN SIGN (-->).
919:890
16/07/05 23:08:07.75 94G9IfNv.net
>>894
入力されたデータを、オブジェクトのハッシュとして扱った際、バグらないのかな?
または、これを利用して、システムを壊したりするとか
920:デフォルトの名無しさん
16/07/05 23:17:50.58 eormrIAE.net
>>896
それはそういう設計にしているプログラマが悪い
プロパティに何でも代入可能なハッシュ値ならプロトタイプ上のプロパティが上書きされる事も考慮すべきだ
Object.keys, Object.prototype.hasOwnProperty.call で回避できるからな
あるいは new Map でも使えばいい
921:853
16/07/05 23:21:29.77 fKNXFIY8.net
オレ、27歳だけど、コントロール文字にスラッシュ入るって
言ってたら、まずいですか?
922:デフォルトの名無しさん
16/07/05 23:49:25.07 Coapt2bz.net
『JavaScript: The Good Parts』(P11)の文字列リテラルの説明は意味が分からん
" (</ とコントロール文字を除くすべてのユニコード文字> | <エスケープ文字>)* "
なぜ "/" (スラッシュ) を除く?
ES6 を読んだが、"/" が許可されないようには読めん
URLリンク(www.ecma-international.org)
『JavaScript: The Good Parts』の説明では """ が許可されるように読めるが、実際そんなことはなく、SyntaxError になる
<" とコントロール文字を除くすべてのユニコード文字> であるべきだと思うのだが
923:853
16/07/06 00:00:08.69 zGLlF+Oq.net
実は、アマゾンで売ってるkindleの電子版のgood partsでは
String
""で囲まれた文字列は、
any unicode character except
" and \ and control character
''で囲まれた文字列は、
any unicode character except
" and \ and control character
となっており、日本語版のgood partsとは書いてあることが違う
英語版にはexcept / とは書いてない。
オライリーの公式には、ここの訂正がない。
ってなってるんだけど、もちろん、このスレの住民は
英語版のgood partsくらい普通に読んでるんで、
気づいているはず
924:デフォルトの名無しさん
16/07/06 00:02:33.66 Np1SAbRe.net
>>899
運が良かったな。誤字って予想ぐらいすぐにおもいつけよ
URLリンク(bdcampbell.net)