1 名前:デフォルトの名無しさん mailto:sage [2012/01/02(月) 05:16:18.29 ] 《ECMAScriptを語るスレ》 1. - 概要 - ECMA-262規格として知られる言語(通称 ECMAScript)についての利用法や言語仕様、 その他四方山話をするスレです。 Standard ECMA-262 ECMAScript Language Specification Edition 5.1 (June 2011) 標準規格(英語) www.ecma-international.org/publications/standards/Ecma-262.htm Annotated ECMAScript 5.1 es5.github.com/ Draft Specification for ES.next (Ecma-262 Edition 6) wiki.ecmascript.org/doku.php?id=harmony:specification_drafts Under Translation of ECMA-262 3rd Edition (日本語訳) www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/ ■前スレ ECMAScript デス 3 toro.2ch.net/test/read.cgi/tech/1190160481/ ■過去スレ JavaScript デス pc5.2ch.net/test/read.cgi/tech/1052273054/ ECMAScript デス 2 pc11.2ch.net/test/read.cgi/tech/1088298991/
8 名前:デフォルトの名無しさん mailto:sage [2012/01/02(月) 10:00:35.85 ] >>989 JSON2.jsでは普通に使われてる書き方だけどな。 まぁ一般的な書き方は(functionの方ではあるけどな。 >>996-998 今回書かれているbに対して、それらの書き方は構文的にもエラー。 しかしb = と代入式が書かれてる時点で括弧なしは構文エラーではなくなる。 つまり単独での実行を例にするのは間違ってる。
9 名前:デフォルトの名無しさん [2012/01/02(月) 10:49:33.00 ] なんで右にもtestを付けるんですか? var test = function test() {};
10 名前:デフォルトの名無しさん mailto:sage [2012/01/02(月) 12:07:04.67 ] name で名前が取り出せるようになるから。
11 名前:デフォルトの名無しさん [2012/01/02(月) 12:14:18.49 ] あ、それだけなんですか。デバッグの時に多少マシになる感じなんですね。
12 名前:デフォルトの名無しさん mailto:sage [2012/01/02(月) 12:15:14.56 ] >>8 言語仕様を読んだこと無い奴がカドクセーとかほざいてるだけだから気にするな。
13 名前:デフォルトの名無しさん mailto:sage [2012/01/02(月) 12:39:13.77 ] そういう流れいらないから
14 名前:デフォルトの名無しさん mailto:sage [2012/01/02(月) 12:45:04.91 ] カッコを付ける習慣がある以上、納得できる理由を出さないと。ただの遠吠えになってるよ。
15 名前:デフォルトの名無しさん mailto:sage [2012/01/02(月) 12:59:11.96 ] お前の習慣なんてしらねーよw
16 名前:think49 ◆bKk/qcAKuM mailto:sage [2012/01/02(月) 19:52:15.67 ] >>前スレ997 ご指摘通り、記憶違いのようでした。お騒がせしました。 >>8 なるほど…。確かに代入演算子で右辺が式であることを保証している為、式文の規定にはとらわれないですね。納得です。 www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/11_Expressions.html#section-11.13 >>9 名前付き関数式は関数内のスコープに影響するので変数名を変更しても自身を参照できるようになります。
17 名前:デフォルトの名無しさん mailto:sage [2012/01/02(月) 20:04:49.43 ] い-635 ちなみに、平成18年度の民主党の収支報告書だが、 電通が 690,150,988円(約6億9千万円) 博報堂が 19,425,964円 (約2千万円) 読売グループ系列(読売広告、読売メディアセンター)が 72,058,917円(約7千万円)なw フライシュマンヒラードジャパンが、1974000円かw フライシュマンの本社はアメリカにあって、アメリカ政界や企業のPRも担当してるユダヤ系の会社だなw ここが「マニュフェスト」っていう横文字を考えたんだなw そういえば、今東電と電力総連がフライシュマンを雇ってるらしいじゃないww 札束で学者ひっぱたいてテレビででたらめ言わせても年寄なんかはまだまだテレビのいうことを信じるからなw
18 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 12:04:33.05 ] >>16 > 変数名を変更しても 「変数が別のものに束縛されても」と言いたいのかな?
19 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 13:43:44.69 ] ECMAScriptの規格に「束縛」なんて用語出てこないけど、何と勘違いしちゃってるの?
20 名前:think49 ◆bKk/qcAKuM mailto:sage [2012/01/03(火) 15:09:33.38 ] >>18 「束縛」はわかりませんが、jsfiddle.net/4ULa3/1/ の「名前付き関数式を利用するパターン」がそれです。 IE8- ではバグがあるので使えませんけどね…。 d.hatena.ne.jp/think49/20110521/1305959222 後学の為に「束縛」を説明(もしくは参考URLの掲示)していただけると嬉しいです。 ぐぐって何となくは理解しましたが、「変数への代入 === 束縛」なのでしょうか。 この前提が正しいと仮定して、束縛することよりも元々の変数の名前で参照できなくなることが鍵のような気がします。
21 名前:デフォルトの名無しさん mailto:sage [2012/01/07(土) 01:12:09.05 ] ES5になってdefineProperty()とか出来て変わったようですが 下記のコードをES5らしく書くなら、どう書いたらいいでしょうか? var O = function (a) { this.o = a; }; O.prototype = { get oooo() { return this.o; } }; var o = new O('oooo!'); o.oooo;
22 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 16:46:09.65 ] >>8 >JSON2.jsでは普通に使われてる書き方だけどな。 hoge = function(){}(); こういうのの話だよね? 無いぞ。どこだよ。
23 名前:デフォルトの名無しさん mailto:sage [2012/01/15(日) 15:53:23.33 ] >>21 var O = Object.create(null, { o: { value: "" }, oooo: { get: function() { return this.o; } } }); var o = Object.create(O, { o: { value: "oooo!"} });
24 名前:デフォルトの名無しさん mailto:sage [2012/02/05(日) 21:17:08.31 ] ttp://d.hatena.ne.jp/oogatta/20111204/1322982897 ES.nextもstrawmanもキモくね?
25 名前:デフォルトの名無しさん mailto:sage [2012/02/06(月) 00:49:49.89 ] Traitだけありゃいいのに最適化がうんたら
26 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 00:39:23.23 ] >>24 実行コンテキストがいちいち変わるのが理解出来ないからクラスベースの 構文糖用意したつもりなんだよ。妥協点がそこだったんだろ。 ところで関数が暗黙にthisプロパティを持たなくなったのは良かったが Function.prototype.bind(cx,args...)で引数のLIST型書きかえれるようにしたのはやめて欲しかった。 Callオブジェクトを撲滅できない以上ここら辺は積極的に隠蔽すべきだと思うんだが。 __proto__プロパティがダメでObject.define*がいい理由も根拠がわからん。
27 名前:デフォルトの名無しさん mailto:sage [2012/03/07(水) 21:34:12.90 ] __proto__がいいと思う理由は何?
28 名前:デフォルトの名無しさん mailto:sage [2012/03/08(木) 21:27:21.83 ] function Foo() {}; function Bar() {}; var f1 = new Foo(); f1.constructor === Foo.prototype.constructor; // Foo Foo.prototype = new Bar(); var f2 = new Foo(); f2.constructor === Object.getPrototypeOf(Foo.prototype).constructor; // Bar f1.constructor !== f2.constructor; // Foo !== Bar Foo.prototypeの参照先が変わったのに、 なぜf1.constructorはFooを指しているんでしょうか。
29 名前:デフォルトの名無しさん mailto:sage [2012/03/08(木) 23:46:27.29 ] newはprototypeのコピーであって参照じゃないっしょ
30 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 02:34:50.33 ] >>29 言われて本読みなおしてググってやっと理解できました。 ありがとうございます。
31 名前:デフォルトの名無しさん mailto:sage [2012/03/15(木) 01:18:49.40 ] ECMAScript Language Specification ECMA-262 6th Edition - DRAFT people.mozilla.org/~jorendorff/es6-draft.html 読みやすくてイイ!
32 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 17:13:23.76 ] JavaScriptではperlの ( $foo, $bar ) = split( /,/ ); みたいな書き方は出来ない? (リストの左辺値)
33 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 17:13:59.06 ] >>32 すんません。ECMAScriptでした。
34 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 17:53:59.26 ] 実装による 以上
35 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 20:34:52.67 ] >>34 仕様の話に実装で答えても…
36 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 20:38:43.62 ] ES5.1までの仕様にはないかな 6以降で入れるみたいな話しがちらほら Fxはたしか実装してた気がする
37 名前:デフォルトの名無しさん mailto:sage [2012/03/25(日) 00:11:46.03 ] FirefoxはJavaScript1.7で導入してて https://developer.mozilla.org/ja/New_in_JavaScript_1.7 分割代入 (destructuring assignment) って名前がついてる
38 名前:デフォルトの名無しさん mailto:sage [2012/03/25(日) 07:09:48.00 ] CoffeeScript使え
39 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 14:24:18.92 ] 32です。ありがとうございました。 ってことは、配列の内容を個々に変数にバラすには 1個ずつ代入するしか方法がない、ってことでしょうかね。
40 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 15:40:12.32 ] だからFFでできるしCS使う手もあるっていってるじゃん
41 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 23:09:58.48 ] isnt演算子のセンスのなさ isnt = is not = is! でよかったじゃん
42 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 09:34:12.46 ] それは分かりづらいから無い
43 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 21:08:23.71 ] Dだと!is
44 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 00:37:15.88 ] >>40 ES3縛りっつー前提だもんで。 結局こんなん書きました。1個ずつ代入してることには変りはないですが。 ary2lc( [ 'yy', 'mm', 'dd' ], "2012/03/28".split("/") ); function ary2lc( to, from ) { for( var i=0; i<to.length; i++ ) { eval( to[i] + " = " + from[i] ); } }
45 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 09:42:07.10 ] CoffeeScriptはES3デスよ……
46 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 21:57:40.92 ] >>45 すんません。よく知りませんでした。 勉強します。
47 名前:デフォルトの名無しさん mailto:sage [2012/04/27(金) 12:03:13.48 ] ところでes6のletとconstはふざけてんのアレ?
48 名前:デフォルトの名無しさん mailto:sage [2012/04/27(金) 14:32:16.75 ] letはいろんな書き方できるから? 何がどうふざけてるか書いてくれないかな
49 名前:デフォルトの名無しさん mailto:sage [2012/04/27(金) 22:41:57.09 ] そういう感性は俺にはなかった。 letもconstもプログラム言語にはあって然るべき機能だと思うけど。
50 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 08:03:01.79 ] >>48 ,49 jsのブロックは見た目はブロックスコープに見えるけど言語仕様上ブロックスコープはないからブロックのセマンティックスはただの複文。 複文は複数の文を一つの文とみなすことしかやってない。var定義はプロトタイプベース言語としてのメタな文脈においてmozillaはvarバインドと呼んでるんだけど varバインドは関数スコープで変数を束縛する。このときjsではスタックフレームもオブジェクトなのでプロトタイプベースから見ればスロット集合の実体を持ってて ローカル変数はスタックフレームオブジェクトのスロットに束縛する。このときtry-catchの変数だけは実装上varとは別のスロット集合に束縛してスコープが別になってる。 それを仕様に取り込んだのがletでvarバインドに対してletバインドと呼んだりする。let文はその文で定義された変数はその文中のみ有効というwith文の置き換え。 let式のexpの部分は暗黙のブロックに囲まれるのでlet文の構文糖。ブロック中のlet定義は複文によって一つとみなされるので複文中の文から letは見えるけど複文の実行が終われば他のコードからは見えなくなって結果letバインドされた変数はGCされる。 あくまでブロックスコープなんてものはなくてイメージとしてはカンマ結合(let a,=1,b=2;)みたいなもんだと思えばいい。 最新のドラフトを追ってないんで変更があるかもしれないけどes6のlet,constはdeclarationといってletバインディングされる。 es6はjsの仕様に合わせずブロックスコープを仕様にしたせいでletがブロック直下にしか置けなくなった。 letはwithの抹殺以外に旧時代のスコープを新たに作るために無名関数を使うコードを完全に置き換える目的もあったのにes6の仕様だと let文とlet式が使えなくなってそれが直接的にできなくなった。他にもif直下にlet置けないからどんなに単独のifが短くて一行で書き たくてもブロックで囲むコーディングルールを言語仕様が強制してしまったり、letはブロック直下以外禁止なのでforの初期化子に 置けないから本末転倒になってる。これを回避するにはforをブロックで囲んでその直下にlet定義するしかない。es5のfor-initializerが 消えたのはこれに無理やり合わせるため。 ほかにもconstがletバインドだから関数スコープじゃなくなって関数の頭で条件に応じて初期化内容を変えるのに
51 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 08:04:38.56 ] function f(){ if(cond) const x=1; print(x);//!condならundefined } function f2(){ if(cond){ const c=//hogehoge }else{ const c=//fugafuga } //色々長い処理 print(c);//!condならfugafuga } がif(cond){ const x=1; print(x) }else{ const x=undefined; print(x) }かconst x cond ? 1 : undefined;と function f2(){ if(cond){ const c=//hogehoge //色々長い処理 print(c); }else{ const c=//fugafuga //色々長い処理 print(c); } になる。ほかにもconstは最適化のために初期化子必須になったんだけどこれは元々ある変数の初期化を伴わない定義の デフォルトはundefined valueという仕様にesでlet文法作るときのミスで合わせられなくなったせいで未初期化の constはundefined valueに束縛されずに2度目の代入が出来てしまうため、建前は最適化のためと言ってるけど初期化子必須に したせいでconstの値がundefined valueになるときconst c = undefinedかconst c = void(0)としなきゃいけなくなったから cに入る値が実行時まで遅延されて逆に最適化が難しくなってる。globalのプロパティundefinedはundefined valueじゃなくて プロパティだから[[get]]するまで値が確定しないのとvoid(0)も[[call]]しないと確定しないのが原因。 jsの元からある仕様だとconstは初期化いらないから、しない場合はundefined valueに束縛されて定義時に値が確定して最適化出来る。
52 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 08:06:50.90 ] これは最適化云々より変数の値がundefined valueになることを明確に主張するコードとしてわざとこう書くもんだった。 あとfunctionDeclarationがletバインドになったから既存の実装と全く互換性がなく関数定義をifブロックで囲むと外から見えなくなる。 #ifdefしたい時はif-elseでコード全体を囲む必要がある。#ifdefした関数使うコードがifとelseで2パスあるわけ。 es6のブロックスコープは本来はブロックスコープじゃないものをブロックスコープとして仕様にしたからコンテキスト依存になって制限のほうが多くなってるんだよ。 ecma-262は乱立する実装の最小公倍数の共通化とマシンリソースやセキュリティの都合があるから、極力実装に首突っ込まないよう 配慮されてたのに3.1派が主流になってから既存の実装と互換性がないのと最適化ばかり考えて実装の都合に制限された仕様になってるのがふざけてるって話。 nextやharmonyのbrendan eichの提案見てるとnetscape草案のjs2.0にあったのばかりだしMapやWeakMapだって3.1派が昔拒否したライブラリだし元に戻そうとしてるのは分かるよ。 仕様と実装の説明すると長いな。まあ、そういうこと。
53 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 09:54:55.97 ] ガチで長いぞw
54 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 17:45:52.49 ] >>50 長過ぎるのと意味が分からんところがあるけど > このときtry-catchの変数だけは実装上varとは別のスロット集合に束縛してスコープが別になってる。 とりあえず、↑これはcatch内だけだね。 > letはブロック直下以外禁止なのでforの初期化子に > 置けないから本末転倒になってる。これを回避するにはforをブロックで囲んでその直下にlet定義するしかない。 んなこたーない。仕様的にもちゃんと置けるよ。 他は後でつっこむ
55 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 18:55:45.44 ] >>50-52 "をまとめると ブロックはスコープじゃなくて唯の複文 letはスコープ作るために導入された letはundefined valueで初期化されない letでundefined valueで初期化されるよえに=undefined、=void(0)などと書くと最適化されにくくなる弊害がある ってこと?
56 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 20:34:09.47 ] let文、let式がなければ var foo = 0; { let foo = foo; alert(foo); } とかではまるやつが出てくるのは目に見えてるしな
57 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 22:07:39.07 ] letは色んな事出来すぎるからだめなんだよなぁ 何であんなに色んな記法を作ったのか
58 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 01:30:12.11 ] >>51 > ほかにもconstは最適化のために初期化子必須になったんだけどこれは元々ある変数の初期化を伴わない定義の constやletを初期化せずに宣言するのはバグの元だろ。どの言語でも言える事だけどローカル変数は 宣言と同時に絶対初期化するべき。 > 未初期化のconst constは初期化必須って言っているのに、未初期化って矛盾してるぞ。その時はどんな値になってるんだ? 単純に未初期化のconstは、その時点で実行時エラーになる気がするが。
59 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 01:39:48.38 ] constもletもJavaScriptの構造を理解している人に取っては必要ないものだよ 他言語メインの人がなんとなく使うときにハマるからあった方がいいねってもの
60 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 01:40:25.53 ] const hoge; hoge = "後から代入できちゃう"; ってことなんじゃねーの? undefinedな定数にしたくて初期値省略してるのに、代入されたら台無しだよっていう
61 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 02:01:05.13 ] constな変数(定数)をundefinedにする意味は全くないと思うけど、単純に未定義 って事もあるから、どっちでもいいか。 constな変数は絶対に初期化しとけって事だな。
62 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 07:14:17.62 ] >>60 これってできるの? うちのchromeさんだと出来ないんだけど 正確には代入してもconstされた値は上書きできないがエラーも出ない #エラー出ないのはちょっとなー const hoge = "aaaa"; hoge = "bbb"; // ここでbbbはが返る alert(hoge); // ここで表示されるのはaaaa const moge; moge = "ccc"; // ここではcccが返る alert(moge); // ここではundefinedが返る 正直な話言語仕様的には3.1で十分で 5,6なんかはは楽にするために拡張されると解釈してる
63 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 07:56:25.15 ] JavaScriptって、一見代入とかができたように見えて、実はできない、という 場合ってスルーしちゃうじゃない。昔から。 foo = "foo" foo.bar = "baz" alert(foo.bar) // undefined
64 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 08:00:51.12 ] 何のためのstrict modeなんですかねえ
65 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 08:13:31.96 ] たとえばJavaだと、参照される前に確実に1回だけ初期化される変数は、 finalだけど初期値なし、にできるけどな。 要するにundefinedってのは、名前が未定義って意味じゃなくて、初期化されてない値 (unititializeとすべき?)って意味だから、「undefinedな定数」なんて無理だから、って ことじゃね?
66 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 08:27:47.33 ] >>63 これは foo.bar にアクセスした時点で新たに String オブジェクトが生成されて そっちの bar プロパティに代入してるだけだから、 代入が失敗しているわけではないと思う
67 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 13:19:34.99 ] >>66 イミフ
68 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 13:20:57.64 ] fxでも失敗するね const hoge; hoge = "aaaa"; // aaaa hoge; // undefined
69 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 13:26:20.85 ] >>67 仕様書を読んでみるといい
70 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 13:41:28.54 ] 6ドラフトの12.2.1 Let and Const Declarations 読んだけどわからん そんなこと書いてあるかな?
71 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 14:11:35.11 ] すごくおおざっぱに説明すると、プリミティブに対してオブジェクトとして アクセスしようとすると、オブジェクトが作られて、それに対してアクセスする、 というのが言語仕様。 だから、その作られたオブジェクトの属性として設定されるけど、そのオブジェクトに アクセスする方法がないし、元の変数は元のプリミティブを指したままなので…… というのが >>63 で起きてること。
72 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 22:57:50.88 ] ゴミな仕様だな
73 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 12:10:26.90 ] 普通に例外吐いて止まってくれるだけでだいぶ助かるんだが
74 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 13:06:49.34 ] strict mode + Object.sealed でおk
75 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 15:41:31.94 ] foo.bar() みたいな明らかに一文が終了してるときもセミコロンいるやん。 if(foo) a+b; みたいなコード書くヤツのほうを撲滅しろよ。
76 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 16:27:47.76 ] 波括弧を必須にするだけでよかったのにな
77 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 16:59:47.58 ] ;の省略とかややこしくなるだけだからいらんわ
78 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 17:09:36.40 ] セミコロン省略はそこまで混乱しないだろ
79 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 18:12:22.52 ] 多分シェルでも全ての行末にセミコロンを付けるような人なんだろう
80 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 21:28:42.23 ] セミコロン省略はあっていい 自分も付けるか気分と見やすさと必須性で決める 基本は全く無駄な物だから付けない
81 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 22:12:51.55 ] 必要ないならなくなってるよ。必要だから残ってる。 httpを使うことを考えると無くせない。
82 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 07:52:42.83 ] 俺は実際全くセミコロン付けないで書けている。よって必要ない。 改行せず一行に詰め込む時にだけ必要、という主張だね。
83 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 08:48:23.26 ] そんなことは言ってない 必要ないところで省略した方が逆に見栄えもよく感じられて 問題もないこともあるから省略できていいって言ってる セミコロンは必要、だけど省略も必要 わかる?
84 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 08:57:11.06 ] 省略したほうがいい場面ってどこだよ array.filter(function(v) { return v % 2 == 0 }); みたいに関数本体が一文で済むところなら セミコロンなしでもいいかなという気はするけど、 それ以外になんかあるか?
85 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 09:25:23.96 ] 一律つけた方が法則がシンプルな分 見栄えもいいよ セミコロンの場合実害が少ないからなくても困らないけど
86 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 09:46:43.49 ] メモ帳で長いコード書くとき カッチリしたもう変更がないだろう機械的なコードはセミコロンで固めて 個性的な変更しまくりのふわふわしたコードには付けないな
87 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 09:49:49.99 ] >>84 いや、むしろそういうごちゃごちゃした1行には付けるべきだろ。 a=1 b=2+a みたいなのには必要ない、もしくは、 a=1;b=2+a; にする。
88 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 09:54:58.57 ] >>86 こーいう、背後に哲学が感じられる使い分けが コードから読み取れれば問題ない 無分別に一貫性なくつけたりつけなかったり は醜いし読みにくい。 考えなさっぽさが滲みでてみっともないし。
89 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 10:28:52.18 ] スマホで作ってるとセミコロン付ける付けないとインデントはかなり悩む それはそうとMathやStringが拡張される話で今盛り上がってるのは個人的にもありがたいんだけど 数の進数やbit数に関しての拡張と現在milli秒で扱ってる範囲ををmicro秒にして欲しいんだけど そういう話は挙がってないの?
90 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 11:54:26.69 ] なんでもかんでもマイクロ秒管理したら 既存APIが遅くなるんでねーの?
91 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 12:18:42.55 ] OSから取得するナノ秒までで約60bit マイクロ秒までで約50bit ミリ秒までで約40bit 全部64bit整数使ってるだろうから変わりないのでは?
92 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 14:11:47.69 ] 非力な組み込みでもecmascript使うんだから標準で仕様化したらだめだ。
93 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 14:45:30.95 ] 非力というか万が一タイマーがサポートしてないのなら0埋めで返せばいいだけじゃない? スクロールとか描画なんかの演算とタイマー設定をもう少し正確にやりたいだけでしょ? まあディスプレイ付きのデバイスなら今時間違いなくマイクロ秒まではサポートしてるタイマー使ってるはずだけど
94 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 18:40:05.14 ] セミコロン問題は、一応プラグマのopen issueのままです。 wiki.ecmascript.org/doku.php?id=harmony:pragmas
95 名前:デフォルトの名無しさん mailto:sage [2012/05/02(水) 00:11:18.62 ] >>93 だから、ECMAScriptなんつー総本山規格じゃなくて、ディスプレイ付デバイスで動かすような実装のレベルで 何とかしてよってのが>>92 なんじゃねーの。
96 名前:デフォルトの名無しさん mailto:sage [2012/05/02(水) 05:02:25.84 ] マイクロ秒単位のタイマは、むしろ非力な組み込みでの需要の方が大きいんじゃねーの なんにせよ非リアルタイムな環境でのマイクロ秒タイマは 信用ならない精度になるだろ そういう話をするとしたらQueryPerformanceCounter的な高精度カウンタを新設して 自前でポーリングしれって感じになるんじゃねえかな
97 名前:デフォルトの名無しさん mailto:sage [2012/05/03(木) 08:04:21.13 ] コンストラクタを呼び出すとき applyを使って引数を配列で指定したいときがあるんだけど可能かな? 例えばコンストラクタが var C = (function(){ var c = 0; return function (a,b) { this.a = a; this.b = b; alert([a,b,++c]); }; })(); として、とりあえず以下はダメだった。 var o = new C.apply(null, args); var o = new (C.apply(null, args)); var o = (new C).apply(null, args); エラー var o = C.apply(new C, args); コンスタラクタが二回呼ばれる oが返されない var o = new C(); C.apply(o, args); コンスタラクタが二回呼ばれる var o = {}; C.apply(o, args); oがCのインスタンスにならない アイデアあったらヨロ
98 名前:デフォルトの名無しさん mailto:sage [2012/05/03(木) 08:34:31.35 ] >>97 Function#bind を活用してみてください。
99 名前:デフォルトの名無しさん mailto:sage [2012/05/03(木) 09:00:22.22 ] >>98 それじゃ無理だろ。 そもそもbindさせるオブジェクトを これから作ろうって話な訳だし。 evalして無理やりパースするくらいじゃね?
100 名前:デフォルトの名無しさん mailto:sage [2012/05/03(木) 11:47:48.86 ] >>97 もともとそのコンストラクタをどう使うつもりなのか
101 名前:デフォルトの名無しさん mailto:sage [2012/05/03(木) 12:58:18.91 ] >>97 これがしたいんだろ? calleeと分割代入使うか__parent__書き換えるからecma標準じゃできんぞ。 calleeはYコンビネータにして分割代入はカリー化してループ回すと出来るかもしれんがこんな所じゃ貼れんよ。 function getConstructor(){ var c = 0; return (function ([a,b]) { this.a = a; this.b = b; print([a,b,++c]); }).bind(arguments.callee, Array.prototype.slice.call(arguments)); }; var cons = getConstructor(1,2); var o = new cons();
102 名前:デフォルトの名無しさん mailto:sage [2012/05/03(木) 13:59:28.01 ] >>97 ES5仕様のbindがあるならこんなんでどうよ? function applyNew(ctor, args) { var a2 = [null]; a2.push.apply(a2, args); return new (ctor.bind.apply(ctor, a2)); } applyNew(C, [2,3]);
103 名前:デフォルトの名無しさん mailto:sage [2012/05/03(木) 14:19:49.87 ] それじゃapplyNewの戻り値が関数になるし[2,3]がインスタンスにバインドされない。 隠蔽したいのはCのvar c=0だけだと思う。
104 名前:デフォルトの名無しさん mailto:sage [2012/05/03(木) 14:32:30.10 ] いい忘れた。 a2.push.apply(a2, args)じゃなくてArray.prototype.push.apply(a2, args)じゃね?
105 名前:デフォルトの名無しさん mailto:sage [2012/05/03(木) 15:32:29.16 ] >>100 基本的には「コンストラクタを呼び出す時に apply的な呼び出しは可能なのか」ということ。 限定的な使い方ではなくクロージャとかになっていても 問題ないような記法が自分では見つけられなかった。 あるコンストラクタのユーティリティ関数を作るときに 関数内からコンストラクタを呼び出す際、 引数の数が一定じゃない場合などは配列で渡せるとシンプルだなと思ったので。 強引な代替案なら思い付くんだけど ハッとするようなスマートな記法をお持ちの方がいたら 勉強になるなと思ったですw
106 名前:デフォルトの名無しさん mailto:sage [2012/05/03(木) 17:23:25.41 ] >apply的な呼び出しは可能なのか 関数の仮引数を分割代入するだけだからnextが標準化されるまで待つよろし。 (function ({"a": a, "b": b}){return a+b;}).call(thisObj, {a : 1, b : 2})//->3 (function ([a,b]){return a+b;}).apply(thisObj, [1,2]);//->3 >クロージャとかになっていても thisがレキシカルじゃないから元から出来るけどecmaが許さない。
107 名前:デフォルトの名無しさん mailto:sage [2012/05/03(木) 17:54:48.87 ] 言っておくが >>102 でできるからな。
108 名前:デフォルトの名無しさん mailto:sage [2012/05/03(木) 20:53:52.00 ] >>107 jqueryとかのbindメソッドじゃダメだよね? 現時点で実装してる処理系ってFirefoxくらい?