2. - JavaScriptについて -
JavaScriptは動的Webページ作成専用言語ではありません。
このスレでは、★言語★としてのECMAScript(JavaScript、JScript等)の話題を扱います。
ブラウザ環境でのJavaScriptはWeb製作板へ。ASP、CGIなどはWebProg板へ。
●スレ違い●なレスの例
+ JavaScriptによるWebページの挙動実現に関する疑問/質問、は、
■スレ違い■です。→Web製作板へどうぞ
+ Webブラウザの動作挙動に関するの疑問/質問 は、
■スレ違い■です。→Web製作板へどうぞ
+ そのほか、Webページ作成に限定した内容の疑問/質問 は、
■スレ違い■です。→Web製作板へどうぞ
■参考■[Web製作板] + JavaScript の質問用スレッド vol.94 +
http://toro.2ch.net/test/read.cgi/hp/1325400523/ ※JavaScriptが板違いと言いたい人へ
運営サイドから次のような見解が出ています。
|459 飛べない削除屋 ★ sage :04/05/30 15:38 ID:???
|>>458
|ローカルルールにはひどく単純化されて書かれていますが、
|Javascript という言語そのものが板違いなのではありません。
|用途によって板違いかどうかを判断してください。
ここまでテンプレ リンク切れの修正や実装の補足などをした
>>989 JSON2.jsでは普通に使われてる書き方だけどな。
まぁ一般的な書き方は(functionの方ではあるけどな。
>>996-998 今回書かれているbに対して、それらの書き方は構文的にもエラー。
しかしb = と代入式が書かれてる時点で括弧なしは構文エラーではなくなる。
つまり単独での実行を例にするのは間違ってる。
9 :
デフォルトの名無しさん :2012/01/02(月) 10:49:33.00
なんで右にもtestを付けるんですか? var test = function test() {};
name で名前が取り出せるようになるから。
11 :
デフォルトの名無しさん :2012/01/02(月) 12:14:18.49
あ、それだけなんですか。デバッグの時に多少マシになる感じなんですね。
>>8 言語仕様を読んだこと無い奴がカドクセーとかほざいてるだけだから気にするな。
そういう流れいらないから
カッコを付ける習慣がある以上、納得できる理由を出さないと。ただの遠吠えになってるよ。
お前の習慣なんてしらねーよw
い-635 ちなみに、平成18年度の民主党の収支報告書だが、 電通が 690,150,988円(約6億9千万円) 博報堂が 19,425,964円 (約2千万円) 読売グループ系列(読売広告、読売メディアセンター)が 72,058,917円(約7千万円)なw フライシュマンヒラードジャパンが、1974000円かw フライシュマンの本社はアメリカにあって、アメリカ政界や企業のPRも担当してるユダヤ系の会社だなw ここが「マニュフェスト」っていう横文字を考えたんだなw そういえば、今東電と電力総連がフライシュマンを雇ってるらしいじゃないww 札束で学者ひっぱたいてテレビででたらめ言わせても年寄なんかはまだまだテレビのいうことを信じるからなw
>>16 > 変数名を変更しても
「変数が別のものに束縛されても」と言いたいのかな?
ECMAScriptの規格に「束縛」なんて用語出てこないけど、何と勘違いしちゃってるの?
ES5になってdefineProperty()とか出来て変わったようですが 下記のコードをES5らしく書くなら、どう書いたらいいでしょうか? var O = function (a) { this.o = a; }; O.prototype = { get oooo() { return this.o; } }; var o = new O('oooo!'); o.oooo;
>>8 >JSON2.jsでは普通に使われてる書き方だけどな。
hoge = function(){}();
こういうのの話だよね?
無いぞ。どこだよ。
>>21 var O = Object.create(null, {
o: { value: "" },
oooo: { get: function() { return this.o; } }
});
var o = Object.create(O, {
o: { value: "oooo!"}
});
Traitだけありゃいいのに最適化がうんたら
>>24 実行コンテキストがいちいち変わるのが理解出来ないからクラスベースの
構文糖用意したつもりなんだよ。妥協点がそこだったんだろ。
ところで関数が暗黙にthisプロパティを持たなくなったのは良かったが
Function.prototype.bind(cx,args...)で引数のLIST型書きかえれるようにしたのはやめて欲しかった。
Callオブジェクトを撲滅できない以上ここら辺は積極的に隠蔽すべきだと思うんだが。
__proto__プロパティがダメでObject.define*がいい理由も根拠がわからん。
__proto__がいいと思う理由は何?
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を指しているんでしょうか。
newはprototypeのコピーであって参照じゃないっしょ
>>29 言われて本読みなおしてググってやっと理解できました。
ありがとうございます。
JavaScriptではperlの ( $foo, $bar ) = split( /,/ ); みたいな書き方は出来ない? (リストの左辺値)
>>32 すんません。ECMAScriptでした。
実装による 以上
ES5.1までの仕様にはないかな 6以降で入れるみたいな話しがちらほら Fxはたしか実装してた気がする
CoffeeScript使え
32です。ありがとうございました。 ってことは、配列の内容を個々に変数にバラすには 1個ずつ代入するしか方法がない、ってことでしょうかね。
だからFFでできるしCS使う手もあるっていってるじゃん
isnt演算子のセンスのなさ isnt = is not = is! でよかったじゃん
それは分かりづらいから無い
Dだと!is
>>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] );
}
}
CoffeeScriptはES3デスよ……
>>45 すんません。よく知りませんでした。
勉強します。
ところでes6のletとconstはふざけてんのアレ?
letはいろんな書き方できるから? 何がどうふざけてるか書いてくれないかな
そういう感性は俺にはなかった。 letもconstもプログラム言語にはあって然るべき機能だと思うけど。
>>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バインドだから関数スコープじゃなくなって関数の頭で条件に応じて初期化内容を変えるのに
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に束縛されて定義時に値が確定して最適化出来る。
これは最適化云々より変数の値が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派が昔拒否したライブラリだし元に戻そうとしてるのは分かるよ。 仕様と実装の説明すると長いな。まあ、そういうこと。
ガチで長いぞw
>>50 長過ぎるのと意味が分からんところがあるけど
> このときtry-catchの変数だけは実装上varとは別のスロット集合に束縛してスコープが別になってる。
とりあえず、↑これはcatch内だけだね。
> letはブロック直下以外禁止なのでforの初期化子に
> 置けないから本末転倒になってる。これを回避するにはforをブロックで囲んでその直下にlet定義するしかない。
んなこたーない。仕様的にもちゃんと置けるよ。
他は後でつっこむ
>>50-52 "をまとめると
ブロックはスコープじゃなくて唯の複文
letはスコープ作るために導入された
letはundefined valueで初期化されない
letでundefined valueで初期化されるよえに=undefined、=void(0)などと書くと最適化されにくくなる弊害がある
ってこと?
let文、let式がなければ var foo = 0; { let foo = foo; alert(foo); } とかではまるやつが出てくるのは目に見えてるしな
letは色んな事出来すぎるからだめなんだよなぁ 何であんなに色んな記法を作ったのか
>>51 > ほかにもconstは最適化のために初期化子必須になったんだけどこれは元々ある変数の初期化を伴わない定義の
constやletを初期化せずに宣言するのはバグの元だろ。どの言語でも言える事だけどローカル変数は
宣言と同時に絶対初期化するべき。
> 未初期化のconst
constは初期化必須って言っているのに、未初期化って矛盾してるぞ。その時はどんな値になってるんだ?
単純に未初期化のconstは、その時点で実行時エラーになる気がするが。
constもletもJavaScriptの構造を理解している人に取っては必要ないものだよ 他言語メインの人がなんとなく使うときにハマるからあった方がいいねってもの
const hoge; hoge = "後から代入できちゃう"; ってことなんじゃねーの? undefinedな定数にしたくて初期値省略してるのに、代入されたら台無しだよっていう
constな変数(定数)をundefinedにする意味は全くないと思うけど、単純に未定義 って事もあるから、どっちでもいいか。 constな変数は絶対に初期化しとけって事だな。
>>60 これってできるの?
うちのchromeさんだと出来ないんだけど
正確には代入してもconstされた値は上書きできないがエラーも出ない
#エラー出ないのはちょっとなー
const hoge = "aaaa";
hoge = "bbb"; // ここでbbbはが返る
alert(hoge); // ここで表示されるのはaaaa
const moge;
moge = "ccc"; // ここではcccが返る
alert(moge); // ここではundefinedが返る
正直な話言語仕様的には3.1で十分で
5,6なんかはは楽にするために拡張されると解釈してる
JavaScriptって、一見代入とかができたように見えて、実はできない、という 場合ってスルーしちゃうじゃない。昔から。 foo = "foo" foo.bar = "baz" alert(foo.bar) // undefined
何のためのstrict modeなんですかねえ
たとえばJavaだと、参照される前に確実に1回だけ初期化される変数は、 finalだけど初期値なし、にできるけどな。 要するにundefinedってのは、名前が未定義って意味じゃなくて、初期化されてない値 (unititializeとすべき?)って意味だから、「undefinedな定数」なんて無理だから、って ことじゃね?
>>63 これは foo.bar にアクセスした時点で新たに String オブジェクトが生成されて
そっちの bar プロパティに代入してるだけだから、
代入が失敗しているわけではないと思う
fxでも失敗するね const hoge; hoge = "aaaa"; // aaaa hoge; // undefined
6ドラフトの12.2.1 Let and Const Declarations 読んだけどわからん そんなこと書いてあるかな?
すごくおおざっぱに説明すると、プリミティブに対してオブジェクトとして
アクセスしようとすると、オブジェクトが作られて、それに対してアクセスする、
というのが言語仕様。
だから、その作られたオブジェクトの属性として設定されるけど、そのオブジェクトに
アクセスする方法がないし、元の変数は元のプリミティブを指したままなので……
というのが
>>63 で起きてること。
ゴミな仕様だな
普通に例外吐いて止まってくれるだけでだいぶ助かるんだが
strict mode + Object.sealed でおk
foo.bar() みたいな明らかに一文が終了してるときもセミコロンいるやん。 if(foo) a+b; みたいなコード書くヤツのほうを撲滅しろよ。
波括弧を必須にするだけでよかったのにな
;の省略とかややこしくなるだけだからいらんわ
セミコロン省略はそこまで混乱しないだろ
多分シェルでも全ての行末にセミコロンを付けるような人なんだろう
セミコロン省略はあっていい 自分も付けるか気分と見やすさと必須性で決める 基本は全く無駄な物だから付けない
必要ないならなくなってるよ。必要だから残ってる。 httpを使うことを考えると無くせない。
俺は実際全くセミコロン付けないで書けている。よって必要ない。 改行せず一行に詰め込む時にだけ必要、という主張だね。
そんなことは言ってない 必要ないところで省略した方が逆に見栄えもよく感じられて 問題もないこともあるから省略できていいって言ってる セミコロンは必要、だけど省略も必要 わかる?
省略したほうがいい場面ってどこだよ array.filter(function(v) { return v % 2 == 0 }); みたいに関数本体が一文で済むところなら セミコロンなしでもいいかなという気はするけど、 それ以外になんかあるか?
一律つけた方が法則がシンプルな分 見栄えもいいよ セミコロンの場合実害が少ないからなくても困らないけど
メモ帳で長いコード書くとき カッチリしたもう変更がないだろう機械的なコードはセミコロンで固めて 個性的な変更しまくりのふわふわしたコードには付けないな
>>84 いや、むしろそういうごちゃごちゃした1行には付けるべきだろ。
a=1
b=2+a
みたいなのには必要ない、もしくは、
a=1;b=2+a;
にする。
>>86 こーいう、背後に哲学が感じられる使い分けが
コードから読み取れれば問題ない
無分別に一貫性なくつけたりつけなかったり
は醜いし読みにくい。
考えなさっぽさが滲みでてみっともないし。
スマホで作ってるとセミコロン付ける付けないとインデントはかなり悩む それはそうとMathやStringが拡張される話で今盛り上がってるのは個人的にもありがたいんだけど 数の進数やbit数に関しての拡張と現在milli秒で扱ってる範囲ををmicro秒にして欲しいんだけど そういう話は挙がってないの?
なんでもかんでもマイクロ秒管理したら 既存APIが遅くなるんでねーの?
OSから取得するナノ秒までで約60bit マイクロ秒までで約50bit ミリ秒までで約40bit 全部64bit整数使ってるだろうから変わりないのでは?
非力な組み込みでもecmascript使うんだから標準で仕様化したらだめだ。
非力というか万が一タイマーがサポートしてないのなら0埋めで返せばいいだけじゃない? スクロールとか描画なんかの演算とタイマー設定をもう少し正確にやりたいだけでしょ? まあディスプレイ付きのデバイスなら今時間違いなくマイクロ秒まではサポートしてるタイマー使ってるはずだけど
>>93 だから、ECMAScriptなんつー総本山規格じゃなくて、ディスプレイ付デバイスで動かすような実装のレベルで
何とかしてよってのが
>>92 なんじゃねーの。
マイクロ秒単位のタイマは、むしろ非力な組み込みでの需要の方が大きいんじゃねーの なんにせよ非リアルタイムな環境でのマイクロ秒タイマは 信用ならない精度になるだろ そういう話をするとしたらQueryPerformanceCounter的な高精度カウンタを新設して 自前でポーリングしれって感じになるんじゃねえかな
コンストラクタを呼び出すとき 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のインスタンスにならない アイデアあったらヨロ
>>97 Function#bind を活用してみてください。
>>98 それじゃ無理だろ。
そもそもbindさせるオブジェクトを
これから作ろうって話な訳だし。
evalして無理やりパースするくらいじゃね?
>>97 もともとそのコンストラクタをどう使うつもりなのか
>>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();
>>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]);
それじゃapplyNewの戻り値が関数になるし[2,3]がインスタンスにバインドされない。 隠蔽したいのはCのvar c=0だけだと思う。
いい忘れた。 a2.push.apply(a2, args)じゃなくてArray.prototype.push.apply(a2, args)じゃね?
>>100 基本的には「コンストラクタを呼び出す時に
apply的な呼び出しは可能なのか」ということ。
限定的な使い方ではなくクロージャとかになっていても
問題ないような記法が自分では見つけられなかった。
あるコンストラクタのユーティリティ関数を作るときに
関数内からコンストラクタを呼び出す際、
引数の数が一定じゃない場合などは配列で渡せるとシンプルだなと思ったので。
強引な代替案なら思い付くんだけど
ハッとするようなスマートな記法をお持ちの方がいたら
勉強になるなと思ったですw
>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 jqueryとかのbindメソッドじゃダメだよね?
現時点で実装してる処理系ってFirefoxくらい?
ES5だからIE9以上を含む全てじゃね? IEはしらんがFxやらGoogleChromeやらOperaは実装済のはず
110 :
97 :2012/05/03(木) 23:41:34.06
>>102 ありがとう!
勉強になったよ
pushの結合もオレには新しかったw
concatより早いんかな
あとで調べてみようっと
形だけなら別にbind 要らねんじゃね? var Func = (function(){ var c = 0; return function (a,b) { this.a = a; this.b = b; alert([a,b,++c]); }; })(); function applyNew (C, args) { function F() {}; F.prototype = C.prototype; var o = new F(); C.apply(o, args); o.constructor = C; return o; } var args = ["A", "B"]; var o1 = applyNew(Func, args); var o2 = applyNew(Func, args); var o3 = applyNew(Func, args); alert(o1 instanceof Func)
__proto__使わずに同じ事する懐かしの方法だな。
>>105 はnew(C.apply(...))の形式が取りたいって最初の要件は良かったのか?
最初の要件かそもそも、不明確なので
>>112 実引数に配列を渡したいだけかと思ってたが。
>コンストラクタを呼び出すときapplyを使って引数を配列で指定したい
これが要件で
>として、とりあえず以下はダメだった。
>var o = new C.apply(null, args);
>var o = new (C.apply(null, args));
>var o = (new C).apply(null, args);
>コンスタラクタが二回呼ばれる
>oが返されない
>oがCのインスタンスにならない
これを解決したいって話だったが
>>97
素晴らしい。
お兄ちゃん、感心しているだけじゃなくてちゃんと読まないとダメだよ?
あー毒舌な妹がこんなところにまで
なあお前ら。 関数が結合されるのがヤダヤダ!って場合は__parent__の代わりにbind使えばいいが__proto__はどうするよ? あと自己反映のときのcalleeとか。harmonyにProxyがあるのにcalleeがダメな理由てなんだ?
>>122 そこ色々間違ってるから鵜呑みにしないほうがいいぞ。
>>123 どこがどう間違っているのか分からないとあなたの情報を鵜呑みに出来ない
>>123 ご指摘ありがとう
よろしければ、より参考になる資料を示して頂けると嬉しい
古い情報も相当残ってるけどwiki.ecmascript.orgが確実。
>>126 古い情報が相当残っているのに確実とする理屈がわからない
結局、どこが間違っているかも言及なしだしあてにはできないなー
128 :
デフォルトの名無しさん :2012/06/15(金) 08:25:24.62
書いた本人は分かってるんだろうけど書き方がイマイチだから読む人がちゃんと分からないのではってことかな? いずれにしろ1つのサイトだけあてにするのはダメ
そらそうよwww これでもう復活はないなw 嫌いじゃないけどちょっと無理がありすぎたんだw
ダメなところを改善したいBrendan EichといじりたくないTC39の戦いはまだまだつづく!
AS3が一番とばっちりだよな。 先走りすぎたせいでJS2とも別モンになっちまったしhaXeの方がJS2に近いくらいだわ。
Q. JS2とは?
ActionScript3は、少し先走りすぎだったし、 Mozillaに提供した実装Tamarinのコードの質が悪く、 仕様の安易な部分と合わせて、反対派を団結させてしまったね。 結局Mozilla.orgでもTamarinを利用するTraceMonkeyプロジェクトはなくなったし。 ECMAScript 4で議論された機能については、議論継続中だからいいんだけども。
議論継続中て言ったてこれだろ? >Tentative addition of Class Definitions Syntax and Semantics in 13.5 based upon Maximally Minimal Strawman. NOTE-Classes do not yet have full consensus within TC39 and may not survive. 11.1.5 make super references illegal in method definitions within object literals >removed <| and TriangleLiterals subtypingのないjs1.xにclass definition入れたってFoo.prototype={}やObject.definePropertiesの構文糖でしかないし 1.xの延長である以上型変換が暗黙の強制型変換しかないから2.0と違ってタイプルーズで真の structural typeでないから言語仕様の問題は解決できないだろ。HarmonyやStrawmanにある型付き前提の仕様入れる気無いだろTC39。 10年無駄にして最初ゴネたimport,exportとライブラリ強化入れただけだけどその間に 本来的に必要なのはclassじゃなくてsubtypeというのを少しでも認識させたのが唯一の功績だよ。
ECMAScript 4に戻ってやり直すのが皆一番幸せになるわ
つか明らかにJavaScriptの土管化が進行中な件 ウェブのC言語と言えば聞こえはいいが、要は誰も直で書きたがらないってことだからな。 そういう用途に応えるためにLLJSとか開き直ったものも出してきてるしw
そして 問題点1:土管としては低効率 問題点2:土管が土管化を嫌がっていらんことするリスク
それって土管って表現するの?
6の仕様を見ていると結構いい感じだな。早いとこ普及してほしいよ。一応仕様のリリースは来年らしいけど。
141 :
デフォルトの名無しさん :2012/09/10(月) 09:02:29.57
>JavaScriptの土管化 >JavaScriptの土管化 >JavaScriptの土管化 >JavaScriptの土管化 >JavaScriptの土管化 >JavaScriptの土管化 >JavaScriptの土管化 >JavaScriptの土管化 >JavaScriptの土管化
ECMAScript6にいつのまにかclassが追加されててワロタw
どうやら6/15のDraftに追加されたようだ。
さがしたら
>>135 で話題になってたけど、言ってる意味がわからん。。
ちょっと勉強するか。
しかし仕様書を見てもよくわからんな。。 もう少し土管化するまで待つか
土管化が何を指してるのかさっぱりだ
言語設計は最初からモダンだけどな。 ライブラリ設計は古かったけど。(殆ど無いに等しいし)
147 :
デフォルトの名無しさん :2012/10/14(日) 16:38:50.03
ECMAScriptの最新 = TypeScriptなの?
私も興味があります 現在策定中のECMAScriptとTypeScriptの相違はどの程度なのでしょうか?
マージされることがあるとしても、バージョン二つくらい後だろ。 クラス仕様については、ECMAScriptとほぼ同じ機能になってるな。 違いは組み込みかライブラリ化の違いくらい。
>>149 ありがとうございます
そうなると、あと10年位掛かりそうな・・・
オプショナルな静的型付けとかジェネリックとか、次の仕様に取り込まれないかな
ECMAScript4の失敗を忘れたのか? そこまでやるならいっそ新しい言語にしてくれたほうがマシ 糞みたいな互換性やら名前やらとはさっさとおさらばしたいぜ
ECMAScript4の失敗についてはよく知らないけど TypeScriptはJavaScriptの上位互換だよ TypeScriptのように、既存のJavaScriptが動くように仕様を拡張したら問題ないのでは?
>>153 の記事を読んでの感想。
ECMAScript 4の失敗というのは、ECMAScript 4の仕様自体の問題というよりも、
Adobe、Mozilla、Opera、Google陣営と、Microsoft、Yahoo!陣営による政治的な問題
という色彩が強いように感じた。
例えば、ECMAScript 4が決裂した2008年当時は、Microsoftは「Web標準」を軽視し、
Silverlightを普及させようとしていたのではなかったか。
つまり、当時のMicrosoftは、Silverlightを普及させるために、JavaScriptが高機能になるのを嫌った。
一方、JavaScriptの重要性を認識していたMozillaやGoogleなどは、JavaScriptを大幅に拡張したかった。
そうした各陣営の様々な政治的な思惑があって、ECMAScript 4は決裂したように思う。
しかし、今は、Microsoftも「Web標準」にシフトして、業界全体でJavaScriptの重要性に対する認識が
共有されるようになったのではないか。
Webサイトに限らず、デスクトップアプリケーションやモバイルアプリ、サーバーサイドにまで
JavaScriptが使われている。
そうした中で、JavaScriptによる開発が行いやすいよう、ECMAScript 4のような大規模な拡張が
JavaScriptには求められているし、こうした要求に異を唱える陣営は今はもういないのではないか。
だから、合意に達するのであれば、慎重かつ大胆にECMAScript 6の仕様を拡張してほしいというのが、私の考え。
MicrosoftはMicrosoftで思惑あったと思うが、 ・AdobeがActionScriptをECMAScript4にしようとしていた。 ・既に広く広まったECMAScript3との互換性の問題が軽視。 古いコードをどうやって実行するのか議論が深まらないまま。 ・ECMAScript4の新機能の多くがActionScriptをコピーしただけで、 入れることの是非、設計詳細部の議論が深まらないまま。 ・ActionScriptの機能の多くが実装者の思いつきで設計。(Adobeの公開MLに残ってる) ・参照実装であるtamarinのコードの質の低さ。 というわけでストップになった。 ただしECMAScript4で導入されそうになった機能は捨てられたわけでなく、 多くは議論を深めてから入れる方向で考えられている。 Webの現状を考えると時間をかけるのが妥当と判断された。 それはBrandenの声明にもはっきり書かれている。
>>155 ActionScriptはECMAScript 4を元に作られたと思っていたのですが、
実際は逆で、ActionScriptを元にECMAScript 4の仕様を決めようとしていたということでしょうか?
ECMAScript 4は2回決裂しているようなので、そこらへんの前後関係は良く分かりませんが、
少なくとも2回目の決裂に関しては、Adobeの強引さとActionScriptの出来が問題になったということですかね。
ECMAScript 6に関してはしっかり議論して合意に達してほしいですね。
便利な機能が入ることを期待しつつ、時間が掛かることをもどかしく思ったりしつつ、
末端プログラマとして、仕様策定者に期待したいです。
>実際は逆で、ActionScriptを元にECMAScript 4の仕様を決めようとしていたということでしょうか? ドラフトを先走って実装しただけ
>>159 ちなみにBrendan Eichのスライド
typescript出たばかりなのに、No Classかよw
tcp/ipみたく実装できてから仕様が固まるのかな
164 :
デフォルトの名無しさん :2012/11/14(水) 10:34:30.08
結果論かもしれないが、ECMAScript 4を捨てたのは明らかな失策だろう。
議論議論と、皆いつからそんなに会議好きになったのかな。
この記事がとても興味深いんだけど。
第二次世界大戦中のライフハック「仕事を進まなくさせる8ヵ条」
http://akihitok.typepad.jp/blog/2008/06/8-411f.html > 1. 何事をするにも「通常のルート」を通して行うように主張せよ。
> 決断を早めるためのショートカットを認めるな。
> 2. 「スピーチ」を行え。できる限り頻繁に、長い話をすること。
> 長い逸話や自分の経験を持ちだして、主張のポイントを解説せよ。
> 「愛国的」な主張をちりばめることを躊躇するな。
> 3. 可能な限りの事象を委員会に持ち込み、「さらなる調査と熟考」
> を求めよ。委員会のメンバーはできるだけ多く(少なくとも5人以上)すること。
> 4. できる限り頻繁に、無関係なテーマを持ち出すこと。
> 5. 議事録や連絡用文書、決議書などにおいて、細かい言葉遣いに
> ついて議論せよ。
> 6. 以前の会議で決まったことを再び持ち出し、その妥当性について
> 改めて問い直せ。
> 7. 「警告」せよ。他の人々に「理性的」になることを求め、将来やっかいな
> 問題を引き起こさないよう、早急な決断を避けるよう主張せよ。
> 8. あらゆる決断の妥当性を問え。ある決定が自分たちの管轄にあるのか
> どうか、また組織上層部のポリシーと相反しないかどうかなどを問題にせよ。
まさにウェブ標準そのものじゃないですかね。
> 「愛国的」な主張をちりばめることを躊躇するな。
オープンウェブ()の理想を語るとかですかね、この辺に対応するのは。
165 :
デフォルトの名無しさん :2012/11/14(水) 10:41:03.03
>>159 他人事ながら心配になるのは、そのスライドが現実化するよりも
Firefoxのシェアがゼロになる方がおそらく早いってことなんだが。
StatCounter等のデータ参照。特にモバイルでシェアゼロだしな。
Googleもいつまで養ってくれるんだか。
危機感があるから、ウェブの未来だのFirefox OSだの大々的にぶちあげてるんだろうけれど。
ちょっと昔なら逆転不可能そうに見えたブラウザ市場をChromeがガツガツ食い込んで行ったのは 裏を返せば、どのブラウザにだってまだまだシェア伸ばすチャンスはいくらでもあるってことの証明だしな
おまいらスレチなんで各ブラウザの専スレでやってくれないかー
そこはブラウザの専スレじゃなくてブラウザ戦争スレに誘導だろ
|┃三 ,ィ, (fー–─‐- 、、 |┃. ,イ/〃 ヾ= 、 |┃ N { \ |┃ ト.l ヽ l ガラッ.|┃ 、ゝ丶 ,..ィ从 | |┃ \`.、_ _,. _彡’ノリ__,.ゝ、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |┃三 `ゞf‐>n;ハ二r^ァnj< y=レヽ < 話は聞かせてもらったぞ! |┃. |fjl、 ` ̄リj^ヾ)  ̄´ ノ レ リ | Operaは滅亡する! |┃三 ヾl.`ー- べl,- ` ー-‐’ ,ン \____________ |┃ l r─‐-、 /:| |┃三 ト、 `二¨´ ,.イ | |┃ _亅::ヽ、 ./ i :ト、 |┃ -‐”「 F′:: `:ー ‘´ ,.’ フ >ー、 |┃ ト、ヾ;、..__ , ‘_,./ /l
>>164 かなり勘違いしてる。
>>165 これ、まだ現実味ない事ばかり書いてるわけじゃなくて、
既に確定しているversion 6や既に現実になっていることが多い。
Javascriptが共通基盤になるって話がちょっと盛ってあるくらい。
正直Windowsみたいに一社独占になった方が開発は楽になるけどね。 今後はいろいろなOSとブラウザが乱立するんだろうね。
> 正直Windowsみたいに一社独占になった方が開発は楽になるけどね。 一生Adobe信者になれば楽になれるぞ
そういやアドベはブラウザは作らないのかね。 作って普及させれば全て無駄にならないのに。
Flashプラグインあるじゃん。これさえあれば既存の全ブラウザ乗っ取ったも同然。
すでにIE10が乗っ取れてないわけだが
なんかe4xが死にそう interpolationは便利だったのに
>>178 ごめん、E4Xをサポートしているのは、ブラウザではFirefoxぐらいか?
もっと早くに死んでるべきものだった。 XML literal syntax(笑)
セキュリティの問題さえなければ便利だったんだけどね innerHTML(笑)は標準化さえされてないし、DOMは超冗長だし
E4Xってヒアドキュメントに使うもんだと思ってた っていうかこれからヒアドキュメントどうすればいいんや・・・
>>182 ちゃんと勧告まで進めばいいな
DOM4は大丈夫そうだけど、その関連規格はコケそうで怖い
DOMの仕様は5つもW3C Noteになった前例があるし
>>183 ES6 Template Strings
>>186 何この気持ち悪い構文
普通にWYSIWYGリテラルでいいのに・・・
Perlとシェルを合体させたような変な構文だな
XML literalの百倍マシ。Javascriptっぽいし。
JXONってDOMなんだな
>>186 #演算子やん
191 :
デフォルトの名無しさん :2013/01/01(火) 13:04:46.41
typescriptて散々実装しねぇって駄々捏ねてたのにes4の先行実装だな。 15年早かったらes5なんてなかったのに。
trait使えばできるだろ>多重継承 ES.nextに入ってなかったっけ?
VBScriptでweb上の画像を取得するスクリプトをいくつか書いたのだけど、 ブラウザをIE8からFireFoxに変えたら正常に動作しなくなった。 それで結局全部Jscriptに書き換えるはめになってしまった。 WSHの動作環境はブラウザに依存するもんなんでしょうか? 画像の取得に使用したcomはWinHttp.WinHttpRequest.5.1とMSXML2.XMLHTTP3.0、 使用OSはXPです。
バッチリ依存します。そもそも、それらのAPIは標準化されていません OperaだろうとGoogle Chromeだろうと動かないでしょう
>>195 ありがとう。
テキストは取得できるのに画像が取得できないという症状でした。
JScriptにしたら問題なく動作するようになりました。
しかしそのJScriptでさえ、JavaScriptの「方言」と呼ばれたりしています。
う〜む……、
現実の世界では英語が国際的に標準語の地位を固めて久しいですが、
プログラムの世界は混沌としていますね。
そのJScriptがクソなだけだ 英語が標準語ならJScriptはラテン語だろう
MicrosoftがJScriptとかいう謎なクソ言語を作っただけの話で、 そこまでややこしい話ではない。 とりあえずIEをメインにして開発するのをやめれば 自然とそれなりに標準に沿ったものになる
199 :
196 :2013/01/05(土) 23:50:29.96
>>198 移植そのものは2ヶ月ほどの作業だったのですが、
その後のデバッグにみっちり1月半かかってしまいました。
それにしても、OSは世界標準なのに、実装されているバッチスクリプトが方言って……(泣)
MSはWeb関連では失敗続きで弱小メーカーだからね。 真に世界標準なのはOffice(Excel,Word)であって、WindowsはOfficeの抱き合わせ販売 といっても過言ではない。(過言かも…) だから、Officeの呪縛がない個人PCだとWindowsでなくてもそれほど困らないし。
OfficeもWineで動くから実はWindowsは全く必要ない…?
確かにそうだね。ただ、Webアプリが充実してくるとOSの重要性は無くなっていって どうでもよくなりそうだね。 少なくとも会社のPCは、惰性でWindowsをずっと使っていくと思われる。
海外じゃ公的機関が予算削減のためにOpenOfficeを使ってるだろ
es6どんどん糞になっていくよな proxyとAPI強化しか要らん どこに行こうとしてるんだ
>>204 letとかオプション引数とか=>とかが要らないわけない。
早くES6が普及してほしい。
たまにはremoveされた<| と TriangleLiterals のことも思い出してあげてください
意味が分からん。いきなり何を言ってるんだお前は
es6でconstが導入されるけど、functionの引数にもconst指定できればいいけど。
const引数か、あったら便利かもな
逆に無いと引数が変更されるのかがわからないし、 精神衛生上よくないよね。是非ともあってほしい機能だ。
プロパティが変更できるんじゃ意味ないだろ
>>211 constってプロパティが変更出来るのか?
そもそも、C++みたいにconstメソッドとかの指定が無いから、
メソッドが内部を変更してしまうかも分からないね。
つうか、今一俺が仕様を分かってないな…
今のFirefoxに実装されてるconstは、 const指定した変数が指すオブジェクトを別のオブジェクトには変更できないけど、 const指定した変数が指すオブジェクトの中身は変更できるね これを関数引数に指定できても意味無いな
じゃあconstの存在意義って何よ
constはプリミティブ型にしか意味なさそう。 オブジェクトを本当にconstにするには、Object.seal(obj)を使う必要があるんだろうね。
インタプリタでconstは厳密な実装が難しい。ましてevalのある言語。
>>216 オブジェクトを書き込み不可にしたいのならそう。
通常、constは参照の方の属性。
>>217 それは違うんじゃないかな?Object.seal()とかあるわけだし。
それにしても、es6になっても癖のある言語である事に変わりないね。俺は好きだがw
>>219 const引数修飾子はオブジェクトの属性ではないのです。
>>220 >>217 はインタプリタの一般論で言ってたから、そんなわけないとObject.seal()
を例にして否定したんだよ。
一部でも難しければ、全体が難しいんじゃないかな?
じゃあどうやってObject.seal()実装してるの、って話だろ 別に一部も全部も難しくないって
はあ? Property descriptorで全てのpropertyをflexible: falseにして、 新規propertyを作れなくするんだけど?
flexibleは名前変わったしsealじゃなくてfeezeだよ インタプリタでconst難しいのはあってるけど
226 :
デフォルトの名無しさん :2013/02/01(金) 22:14:26.55
代入した時にエラーを吐くならともかく 完全にスルーするってどういう意味があるのかサッパリでござる バグの元にしかならんと思うんだが
そんなあなたにstrict mode
>>226 pageをリロードしたときに二重定義エラーになるからだろ。
リロードしたときに一々コンテキスト毎再生成してたら遅いだろ。
標準化されたstrict modeはfatal-warnings modeの挙動取り込んだんだから
>>227 の言う通りデバッグのときだけstrict mode使えば良いじゃん。
それよかletになつたから#ifdefとして使えんのが痛い。
他のも標準化範囲半端だから不便だけどfor ofとextraとコレクションやっと入ったんだ喜べ!
JScriptから、要素数が65536の配列に見える オブジェクトをC#で作っています。 x[1]=2とか、y=x[1]と書くと、IReflect.GetFieldではなく IReflect.GetFieldsですべてのメンバを取得してから "1"という名前のフィールドを探しているようです。 GetFieldsを呼び出された時点では、 目的のフィールド名が分からないので フィールド名が"0"〜"65535"のFieldInfo配列を返したら InvokeMemberまでに数秒かかってしまいます。 要素数に関わらない時間で呼び出せるようにする 方法はありませんか?
proxy
>>230 ちょうどおいらもC#でjscript等で使用されることを想定してるオブジェクトを設計してるんだけど
IExpandoとかIReflectとか実装する意味ある?(面倒くさい)
もうできること限定しちゃって
コレクションもコレクションクラス作っちゃってやったほうが楽じゃね?
x.Set( 1, 2 );
y = x.Item( 1 );
で妥協しちゃだめ?
234 :
230 :2013/04/04(木) 12:31:59.48
setメソッドでは妥協したくないところです。 IReflect.InvokeMemberに"[DISPID=0]"というメンバに対する処理を書いて x(1)=2、y=x(1)というのは実装できました。 今のところ、これ以上の策がなく、妥協してるところです。 IExpandoを実装するとx[1]=2は実装できたんですが y=x[1]に対応しようとすると、 230に書いた課題が残るんですよ。 コレクションではなくて、UART経由で0〜65535のアドレスを持つ レジスタへの読み書きなので、GetFieldsを呼び出された時点で 求めるメンバ名が取得できれば良いんですけどね。
es6 draft 15.4.4 >is not an Array exotic object なん、だと・・・往生際が悪いぞ!マスター・アジア! わざわざ下線引くからには皆考えることは同じだな。 あと、MappedArgumentsObjectがjs1.2のarguments objectと同じ仕様じゃん。caller無くした代わりか。 つか上がってるpdf3月なのにもう古い。
30%の確率で0、70%の確率で1を返すプログラムを教えてください
if ( (new Date()).getSeconds() % 3 ){ return 1; }else{ return 0; }
>>239 それなら Date.getTime() % 3 の方がGC的によい
そもそもそれ70%のコードじゃなくね
これはひどい
>>240 ほとんどのシステムで時計見るのは遅いよw
>>237 課題はできた?
亀だが。
f();
とすることで取り出せるから。
上のは全然できてないから、これちゃんと提出してね。
var f = (function () {
var b = this.a,
l = b.length,
r = function (l) {
return Math.floor(Math.random() * l);
};
return b[r(l)];
}).bind(
(function (a) {
var r = [],
i = 0;
a.forEach(function (m, v) {
for (i = 0; i < m; i += 1)
r.push(v);
});
return {a: r};
}([3, 7]))
);
>>237 var f = function() {
var base = 10000000;
var r = Math.floor(Math.random() * 10 * base);
return r < 3 * base ? 0 : 1;
};
// 検証コード
var zero = 0;
var one = 0;
for (i = 0; i < 10000000; ++i) {
var result = f();
if (result == 0) {
++zero;
}
if (result == 1) {
++one;
}
}
print(zero / (zero + one)); // => 0.2999617
print(one / (zero + one)); // => 0.7000383
少し間違った var f = function() { var base = 10000000; var r = Math.floor(Math.random() * 10 * base + 1); return r < 3 * base ? 0 : 1; };
>>244 ,245
↑
こいつらは何がしたいわけ?
どっかのアホなスレと勘違いしてるんだろ
(function (x) { y=2; print(x,y); function(x){x=10;y=20;print(x,y)}; print(x,y)})(1) [出力] 1 2 10 20 1 20 これ一体どう実装されているんだろう? クロージャの生成で変数テーブルの参照を共有するのだろうから yの変更が反映されるのは至極真っ当。 xの変更が反映されないのは、引数については変数捕捉されないように細工がされている? a.クロージャ生成時に見えていた変数テーブル b.クロージャ引数用の変数テーブル この2つを持っていて、変数評価時に走査している? さらにクロージャの中でクロージャ生成する場合は a,bを合わせて新たに1つのaにしているんだろうか。
>>249 単純に4行目のfunction宣言内で新しい環境が作られているからじゃね?
つまり3行目と5行目のprint呼び出しに現れるxは、
1行目のfunction宣言の環境内で束縛されているけれど、
4行目はのprint呼び出しは(新しい)別の環境内にあるx(の束縛)を参照している
4行目が function(x){x+=10;y=20;print(x,y)}; だとどうよ
>a,bを合わせて新たに1つのaにしているんだろうか。 スタックみたいにテーブルを重ねていくんじゃね
>>249 たまたま名前が同じだが以下と同じだ。
(function (x) {
y=2;
print(x,y);
function(z){z=10;y=20;print(z,y)};
print(x,y)})(1)
名前が同じだけで別のものだ。
scopeって考えを理解できてない。
>>249 出力結果おかしくない?
4行目は即時関数じゃないから、実行されないと思うんだけど。
実行環境によっては、それで実行されるのか?
それ以外は453が正解だと思うが。
変数yとかzがグローバル変数だし 4行目が名前無しの関数宣言?してるだけだし もうなんかプログラム的にめちゃくちゃ
zはグローバルじゃない。
トップレベルで束縛されている変数を「グローバル変数」と呼び、
それ以外のすべての変数を「ローカル変数」と呼ぶとすれば、
>>256 が言うようにzはグローバル変数じゃないし、それどころか
>>249 ,253ともすべての変数がローカル変数だったりする
で、あるクロージャ(ここでは環境と同義)について、
自クロージャ内で束縛されている変数を「束縛変数」と呼び、
より外側のクロージャで束縛されている変数を「自由変数」と呼ぶとすれば、
>>249 の場合
[外側のクロージャ内] x(仮引数): 束縛変数, y: 束縛変数
[内側のクロージャ内] x(仮引数): 束縛変数, y: 自由変数
>>253 の場合
[外側のクロージャ内] x(仮引数): 束縛変数, y: 束縛変数
[内側のクロージャ内] x: 自由変数, y: 自由変数, z(仮引数): 束縛変数
となる
258 :
デフォルトの名無しさん :2013/07/26(金) NY:AN:NY.AN
259 :
255 :2013/07/26(金) NY:AN:NY.AN
>>256-257 ごめんzはちょっと見落としてたよ
でもyはグローバル変数だろ?
仮引数じゃなければ、varつけて宣言してない変数はトップレベルに束縛されてしまうはず
なのでyはグローバル変数じゃない?
内側のクロージャの宣言はChromeとかだとエラーになるな そもそも呼び出してないんで実行結果にまったく影響無いが これが実行できてしまう環境ってなんなの?
え、関数が関数返せない処理系なんかあるの?
関数が何かを返すなら少なくともreturn文が必要だな
>>249 と
>>253 はreturnも無いし関数の戻り値も参照してないけど
(function(){var abc; abc=function(){};})(); (function(){function abc(){};})(); (function(){function(){};})(); firefoxもchromeも三つ目だけシンタックスエラーになるね 無名関数の定義は式の右辺値になってないとだめなのかな 関数宣言と紛らわしいからか
式の右辺値とか関係無いか 関数宣言になっちゃって、その場合は無名じゃダメってことなのかね
265 :
デフォルトの名無しさん :2013/07/26(金) NY:AN:NY.AN
SyntaxError: function statement requires a name が出るから多分そうだね
IEはドキュメントモードによってはエラーにならんのか わらえるw
wshはエラー出ないね
Edition 3rdしか見てないけどECMA-262の仕様的にはfunction(){function(){};}はエラー
JScriptだから(震え声)
>>249 コードが間違ってないなら結合オブジェクト実装しちゃったんだろう
どうやら、6の仕様が確定するのは今年末で、最終的にリリースされるのは来年末らしいな。 もうちょっと早くなんなかったのかね。
・なぜ匿名関数呼び出しの際function(){}を括弧でくるまなければいけないのか ・なぜreturnがいるのか ファンクショナルなことしてると助長になりすぎ
うが抜けた
うはどこに入るのか
助う長
・なぜ「う」がいるのか
277 :
デフォルトの名無しさん :2013/08/04(日) NY:AN:NY.AN
鵜飼のためにうは存在する。
278 :
デフォルトの名無しさん :2013/08/05(月) NY:AN:NY.AN
>>272 functionの前にvoidとか ! とか適当な単項演算子を書けば
括弧でくるまなくても良くなる
ほんとにファンクショナルなことやってるなら、 function(){}を括弧でくくる必要なんてほとんど無いはずなんだけどね。 returnは面倒くさいけど。
関数リテラル使って関数オブジェクトを複数作ると、一般的にメモリ上はどうなるんだろう。 関数オブジェクトが持つのはクロージャだけなのかコード部分(text領域)も複製されるのか。 関数リテラルによる関数複製のコストが知りたい。
ソース嫁
実装による、としか言いようがない。そしてこのスレはスレタイによれば標準規格についてのスレ。 ただ、ひとつ言っておくなら、textというのはバイナリコードを指す用語だから、 インタプリタには基本的にはそんなものはない。
>>280 関数宣言でも最適化でインライン展開するから実装者以外が気にすることじゃないな。
ariguments.calleeが遅いとか嘘で仕様からなくしたいだけだし。
>>282 純粋なインタプリタなんて素のspidermonkeyくらいじゃね?
標準準拠でさ、関数コンテキストでDontDelete属性付けずに変数定義するの方法てないよな? esじゃなくてもActivationオブジェクトとる方法ないけどさ。
286 :
デフォルトの名無しさん :2013/09/02(月) 19:24:58.91
JavaScriptに出来ないことなんてあるわけ無いだろ eval('var abc = 123') delete abc //true
287 :
デフォルトの名無しさん :2013/09/02(月) 20:20:57.78
このスレって思い出話しかすること無い寂れた言語スレに比べて いくらでも話題にできることあるはずなのに過疎りすぎじゃね
>>286 evalがあったか、忘れてた。MZ-700ばりに不可能はないな。
Variable Instantiation時にCallになきゃc(`Д´と⌒c)つ彡ヤダヤダ
じゃないけどstrict mode時には使えなさそうだ。
未修飾でdeleteするとstrict modeで例外出るしDontDelete付かないことは想定してなさそうだよね。
ここら辺つめが甘いっていうか。さすが付け焼刃のes5っていうか。
>>287 仕事で使ってる土方が言語仕様全く理解してないからこっちに用無いでしょ。
プロトタイプベースだし、動的extentのくせにレキシカルクロージャ出来るとか、
es5になってプロパティの定義(属性の指定)がsmalltalkっぽくなったとか知らん人間からはobj-cくらいキモいんじゃない?
プロパティの削除は無くてはならないけど トップレベル変数を削除する必要のある機械なんて皆無でしょ 所によって宣言されていたり宣言が解除されていたり出来るのは変
>>289 静的型付け言語とかそういうのから見ればプロパティの削除どころか追加さえも変って事になるんじゃね?
プロパティの削除は機能として無くてはならないけど 関数スコープの変数宣言の解除とか使い道がないように思うんだけど 何百行もあるような関数でならまだあるのかな
>>289 >トップレベル変数を削除する必要のある機械なんて皆無でしょ
トップレベルの変数を削除なんて誰も言ってないだろ?strict modeで未修飾のdeleteならコンテキスト関係ないぞ。
どれのこと言ってんのか分からんから次の
>所によって宣言されていたり宣言が解除されていたり出来るのは変
が曖昧だが・・・プロパティが追加されたり削除されたりするのは動的言語では当たり前の仕組み。
当たり前である以上、議論する意味はなくない?ダックタイピングが型理論的にどういう分類になるか議論するのと同じことだろ。
変数はプロパティとは違うだろ そりゃvar xはJSの内部概念的には__scope__.xだけど
概念じゃなくて言語仕様でVOのプロパティなんだけど。何がVOになるかは定義されてないけどVOは定義されてる。
うん、でもプロパティとは違うから。
うん、でもプロパティとは違うから。
297 :
デフォルトの名無しさん :2013/09/04(水) 03:10:06.27
うん、でもプロパティとは違うからw
>>289 >>293 >>295 >>290 想定してるパラダイムが一致してないのに、
「俺の想定するECMAScriptのパラダイムではこうだ!」
って主張しても何の意味も無いだろ。
「ECMAScriptの仕様上、
過去どう定義されていて、
過去どう解釈されていて、
現在どう定義されていて、
現在どう解釈されるべきで、
将来どう定義されるべきで、
将来どう解釈されるべきなのか」
あーこりゃ仕様に目が眩んで現実が見えてない
>>299 いや
>>289 >>293 >>295 の人らも俺々仕様に目が眩んで現実が見えてないって話だよ。
「〜と定義・解釈されるべき」だとしても「現状〜と定義されている」事にはならんだろ。
コレで話が通じてなかったらどうにもならん。
お前が言うな
近頃のエンジンは再帰を末尾最適化してくれるらしいんだけど その最適化がどういうコードならできて、どういうコードなら妨害してしまうのか知りたい 自分たまにボードゲーム作るんだけど、 そっちではスタックオーバーフロー見なくなったけど ちょっとしたフィボナッチで起こったりするし まあコードの書き方が悪いんだろうけど
ES6のArrayTypeってパフォーマンスのいい多重配列が定義できるってのはわかるんだけど、 単配列としてもアクセスできるってことなんだろうか? var Uint8_10x10Array = new ArrayType(new ArrayType(uint8, 10), 10) var arr = new Uint8_10x10Array() arr[2][3] = 50 Uint8_10x10Array.storage(arr).buffer[2*10+3] //50??
ES6サポート遅いな…… privateとか今年中に実装されんのかな
再来月ラストコールなのに 中身の無い項目のあるドラフトとか、議論内容見てると非常に不安になってくる
5.1thの和訳ってないんですか?
変に英文キーワードの混じった和訳のほうが読みにくいと思うよ
>>307 一応ある(もちろん非公式・未保証)
忍者規制でURL直書きできないんで↓で:
www.webzoit.net/hp/it/internet/homepage/script/ecmascript/ecma262_51/
一日ぶりに来て伸びてるかと思えばなんだこれ。
>>290 =298=301
あんた誰だよ。
ついでに言うとVOは名前だけEnvironment Record Specification Typesに変わってるぞ.
>>305 privateてdraft落ちてなかったっけ?
symbolがユーザー定義できなくなっただろ。
間違いなく採用はされる、Symbolとprivateをどうまとめるかの議論がもっと必要そうなだけ。 でもES7にしようとは誰も思ってないと思う。 HTMLのように1年毎くらいでES6.1、6.2と出る可能性がかなり高いかもしれない。
>>312 それharmony、古い。draftが出てる。
Symbolまわりは今グドグドやっててworking draftに入ったり外れたりしてる。
>>314 いや、今のドラフトに乗ってないことなんて百も承知なんだけど。
そうは言ってもV8には既に仮実装されてるし、早期に採用される可能性が高い。
むしろされない理由がない。話し合いが足らないだけで採用する方向では合意取れてるんだし。
この頃は機能も増えて各進行度もバラバラドラフトだけじゃ追い切れないよ。
ちゃんとコミュニティの情勢も読まなきゃ。
ES.nextという言葉が使われだしてからもう実質Living Standardになってる 合意が取れてもドラフトに載せられるまでまとめるのが間に合わなくなりつつあるしあてにはできない
317 :
デフォルトの名無しさん :2013/09/06(金) 13:06:46.25
「あーこりゃ仕様に目が眩んで現実が見えてない」ってやつか
Number.MAX_SAFE_INTEGERとか 2^53±1のどの値にするかやプロパティ名になにが適切かが 決まるだけでもだいぶかかったしな
昨今一番もてはやされてるかもしれない言語が 十年ぶりに大きく変わろうとしているのに この過疎りようはどうにかならんのかねぇ
320 :
デフォルトの名無しさん :2013/09/06(金) 22:43:40.90
ここ本スレじゃねぇし。 誰もECMAScriptなんて呼ばねぇよ。
ここよりも盛り上がってる本スレが存在するとな!? 是非教えてもらいたいw
JavaScriptで検索ぐらいしようよw
今まではその役割も兼ねてきたがこれからはTypeScriptって言われてる
JavaScriptで検索してもここよりもスレNo少なくて最近の書き込み数も劣ってるスレしか見つからんな
2ch全体ならWeb制作版の質問スレが一番賑わってるかね
それを言うのなら、 ウェブプログラム版じゃね? なんでプログラム板と分かれてるのか知らないけど
屁理屈乙 そこ質問スレだから 俺も仕方ないから底で議論したりしてるけど 本来NGだから
今月のミーティングでは細かくはあるけど非常によく使う部分に関わる重要な部分が決まるみたいだな
多分unique symbols/private namesはES6に間に合って どちらもユーザー定義出来ると思う
<| とか妙な記号の並び使うのはどうなのよ
339 :
デフォルトの名無しさん :2013/09/17(火) 12:09:02.13
obj = { a: 1 } obj.= { b: 2 } obj //{ a: 1, b: 2 } が欲しい
演算子も1つじゃ足りなかったら、オーバーライドしなくても2つ3つと組み合わせればいくらでも作れるのね そう言えば細菌は主にsortで使う、-1,0,1を返す<=>演算子が提案されてたね
んなもん大昔からPerlにあるわけだが
harmony:proposalsのページ情報がくっそ古くて役たたねえな
配列内包は
[ x for (x of a) if (x.color === ‘blue’) ]
[ square(x) for (x of [1,2,3,4,5]) ]
[ [i,j] for (i of rows) for (j of columns) ]
じゃなくて今はこうだろ
[ for (x of a) if (x.color === ‘blue’) x ]
[ for (x of [1,2,3,4,5]) square(x) ]
[ for (i of rows) for (j of columns) [i,j] ]
http://wiki.ecmascript.org/doku.php?id=harmony:array_comprehensions
for ofはfor each inでよかったのにって思ってるのは俺だけか? E4Xから取り込んでソースコード互換を残して欲しかった。
for-each-inはfor-inと同様にプロトイプも辿る 配列にも安全に使えないぽっと出のポンコツ内部イテレータもどきだったでしょ for-ofは正真正銘の外部イテレータでES6の中核機能 月とすっぽんくらい、ほんとに全然違う JSは汎用的な言語だからE4XはES標準に組み込まれるまではいかないだろう
346 :
デフォルトの名無しさん :2013/09/18(水) 06:52:13.60
347 :
デフォルトの名無しさん :2013/09/18(水) 21:46:30.03
>>344 いやいや、シンタックスをfor each inにしてセマンティックスをfor ofにしてくれって意味。
動作が違うんだからソース互換守れないじゃん 何いってんのよ
ES6だと念願(?)だった配列のクローンがこんな簡単にできるのな。
a1 = [1,2,3,2,1]
a2 = [...a1] //[1,2,3,2,1]
でも現状のドラフトの仕様だとこれは配列にしか適応できない?
ここでも挙がってるがFirefoxの実装のようにいてレートしてくれる方がいいのにな。
http://esdiscuss.org/topic/set-to-array-conversions そしたらこんな使い方もできるのに。
a3 = [...new Set(a1)] //[1,2,3] 重複排除
m1 = new Map()
m2 = new Map([...m1]) //Mapのクローン
このスレ過疎り気味だけど お陰で最初の方を見るとES4の分析がいろいろされてて面白いな ES6は時間を書けるだけのものになったのか、 また行き過ぎてないかを考えるのにちょうどいい
>>354 > ES6だと念願(?)だった配列のクローンがこんな簡単にできるのな。
え? 適当なライブラリの関数使えば、
今でも簡単にできるんじゃね?
たかが配列のコピーに何でライブラリ入れなきゃいけないんだってことだろjk
配列のコピーだけでプログラムが終わることなんて無いだろ? ライブラリを入れるだけで、配列のコピー以外も含めて圧倒的に生産性が上がる。 目的と手段を履き違えてないか?
まあ今の仕様だと多重配列にはsliceと同じ問題があるけど
arr.slice()よりはカッコイイって事だな
イテレータブルなのを全部展開してくれれば
多重配列も一発クローンできるのにね
まあそれでもES6なら多重配列のコピーが従来よりも簡単に、且つ正確に定義できる
Array.clone = (...a) => a.map((v) => Array.isArray(v) ? Array.clone(...v) : v);
var arr2 = Array.clone(arr1);
>>358 流石にその発言はないわ
cloneするのに一番わかり易い文法って知ってるか? b = clone(a) これだよ?
関数オーバーライドが出来ないんだからそれはない
>>359 より短く書けたw
更に古いブラウザにまで対応。
最強じゃね?
var _ = require('lodash');
var arr2 = _.clone(arr1);
お前がそう思うんならそうなんだろう、お前の中ではな
JavaScriptスレから移住してきた人にはスマンが ここは標準仕様をメインで語るスレなのよ ライブラリの話禁止というわけではないが そういう話の流れじゃそもそもないのよな
Array.isArrayがないと別コンテキストのオブジェクトが本当にArrayか見分けるのは難しいんじゃないか?
>>359 よりこっちの方が良かった
Array.clone = x => Array.isArray(x) ? x.map(Array.clone) : x;
TC39勢力 30% コミュニティの流れに関わる Google 15% 基礎構文や仕様の流れに関わる Mozilla 35% 仕様の具体的な部分に関わる Microsoft, Apple, Intel, jQuery 20% 専門的な仕様の詳細に関わる その他凄い人、偉い人
TC39 3大勢力 1/3 【ハンドル・ブレーキ】 Webを牛耳る者として、三人称視点で情報や意見を提供する、情報・管理係 Google 1/3 【エンジン・アクセル】 早期実装者及び専門家として、一人称視点で仕様を策定する、規格・運用係 Mozilla, その他凄い人、偉い人 1/3 【モーター・ギア】 企業団体として、ニ人称視点であれこれ注文する、文句・要求係 Microsoft, Apple, Intel, jQuery
>>371 Promiseならそれとほぼ同じ物が
jQuery標準でついてるし、
nodeでも使える。
ん?だから何? 標準と標準じゃない物同列に語られてももの凄く困惑するんだけど…
var date = new Date() var [Y,M,D,h,m,s] = date.toLocaleString('ja-JP').match(/\d+/g) // [2013,9,21,2,49,05]
>>373 JavaScriptの世界では、標準ではないものも
広く使わわれている。
つまり、Promise が普通の世界に
俺達は生きているわけ。
そこに標準でPromise がきても
劇的な変化はないってこと。
> Node.jsの雰囲気を丸ごと変えてしまう力もあるかも知れないし、
> FirefoxOSのアプリとか、これからの出るものに凄く影響を与えるに違いない
標準じゃないものを使っているごく普通の人たちは
標準を待っているお前よりも未来に生きている。
劇的に変わるのは、標準を待っている人たちだけ。
>>375 標準で無いもの(拡張)は利用する側が自分で選択できる。
標準は全ての実装が準拠しようとするため選択できない。
一つの拡張が標準になると競合する拡張が潰れたりもする。
拡張を闇雲に取り込めば標準自体が肥大化する問題も起きる。
標準に取り入れるってのは全ての環境で半強制的にそれを導入させるに等しい。
先進的であればそれで良いのであれば安定版も標準化も必要ない。
お前は標準の持つ責任を安易に考えすぎ。
…と横からレスしておく。
その根拠のない理屈には納得出来ないな Ajaxだって、Canvasだって、標準になる前からあったが活躍しだしたのは標準化されてから まるで全てのPromiseとAPIが何か標準に準拠して完全に互換性があるかの様に言うが、現実はそうじゃない そもそもDOMPromiseもESで提案されてるPromiseも、今尚仕様変更が続いてるもの そんな中幾らかの形に切り出して、バージョンの付いた標準仕様に入れる、JS標準にするということは大きな変革 準拠先も安定度も不確かな、モジュールやプラグインに頼って下さいという段階とは比べ物にならない
>>376 話しそれ過ぎ。
> Node.jsの雰囲気を丸ごと変えてしまう力もあるかも知れないし、
> FirefoxOSのアプリとか、これからの出るものに凄く影響を与えるに違いない
まずね。標準の世界の話だけをするというのなら、
このような、実際の開発の世界の話をしなければいいのよ。
実際の開発の世界の話なんかしなけりゃいいのに、
わざわざヤツのほうが、勝手に実際の開発の領分に侵入してきた。
だから叩き返してやったまで。
Node.jsとかFirefoxOSアプリとか、何も変わりはしない。
実際の開発では、ここらへんの問題はライブラリによって
あらかた解決してしまってるの。
だから、今更標準に入ったって、何も変わりはしないの。
標準に入ったものをすぐ使えるわけでもないしね。
どうしても使いたい奴がプラグイン導入して個人的に使うのと、 大々的に標準に入って、さあ皆さん使ってくださいとなるのでは次元が違うぞ。 とくにJSってもうWebだけのものじゃなりつつあるし、 非同期コールバック式を緩和するためには非常に有効だけど、 本当に言語仕様に入れてメリットあるのかねという話だぞ。 お前さんの言うとおり、プラグインで十分問題が解決するんなら 標準に入れて必要以上に影響を及ぼしたり、言語の肥大化を招くよりはいいだろうってことだ。 お前さんは一体何と戦ってるんだい?
>>379 いや、お前が何と戦っているのか知りたいんだが?
プラグインがあるから標準いらないと言いたいのなら、意見の差はないだろう
>>380 こっちはお前さんがよく分からんツッコミしてくるからその度に冷静に返してるだけだが?
> Node.jsの雰囲気を丸ごと変えてしまう力もあるかも知れないし、 > FirefoxOSのアプリとか、これからの出るものに凄く影響を与えるに違いない 俺は最初から、これはありえないと言ってるだけですが? Node.jsやFirefoxOSのアプリなどの実際の開発知らないでしょ?
そこら辺は個人の感覚だろうからそこまでは否定しないよ。 ちなみに両方とも作ったことがあるけど、それは例えから。 これから5年も10年も仕様に入れるべきものなのかってこと。
ホント安易に考えてんなぁコイツ
根拠というか懸念した理由は上でいくつか挙がってるけど、 もちろん自分が下手するとそうなりそうで怖いなと思っただけで、 標準に入ることで絶対に悪くなるとは言わない。 しかし、今更ES標準になったところで影響力は小さいという論には、今のところ納得出来ないな。 あると考えるのが基本なんだから、無いと思うのならもっと理論的に言って欲しい。
> しかし、今更ES標準になったところで影響力は小さいという論には、今のところ納得出来ないな。 歴史が証明している。 ECMAScript 5が標準になってどんな影響があったか? 明らかに小さいだろう?
あ、非JSerはお帰りください
理論的な話ねぇ? ES標準になっても、すぐに使えるわけではない。 使わないから影響を与えられない。 ES非標準で、ライブラリとして実装できるものは すでに実装され使われている。 十分理論的ですね。
うん、、、もういいよ。 お前さんに分かってもらうのは諦めた。
>>390 が日本語読めない子なのは十分わかった
けど俺も標準に入れてもいいとは思うぞ
ただしC++11のoptional featureみたいな感じがベストじゃないか。すべての標準処理系がDOMを備えるべきだとは思えんし
utilモジュールに入れてimportで取ってくる形ならいいけど、 グローバルにむき出しなら嫌だな
ポイントは前倒ししてまでstrawmanをES6に入れるのかってとこじゃね?
入れるのなら今回のミーティングがラストチャンスだけど
ギリギリで間に合わせた感もあるしな
http://esdiscuss.org/topic/promises-final-steps ライブラリと違って、JSの規格に一度入ると後方互換性を壊す変更は当然NGになるしね
もうちょっとWebでの使われ方見てから練っても十分な気がする
やっぱりいろいろとES6.1が必要なんじゃないかな
というかこの冬のラストコールに間に合うの?
>>371 ,395
PromiseLoveなAnne van Kesterenっていう人が早く入れようとしてるように見える
ミーティングに挙げる仕様を詰めてるだけでES6には入れようとしてないよ 今回はES7についても話し合われたからね
読むとDOM PromiseのJS実装版じゃなくて、 もっと低レベルな感覚な実装なのね、いいかも。 でもこれ入れるんなら、 イベントという概念をもっとJSから扱えやすくなって欲しいな そっちの方向の進化はかなり良さそう
イベントはあまりに重要で各環境の事情を抱えた概念だから難しそう イベントキューの操作くらいは一般化出来ないかな?
今話題になってるこのコードとても面白いね 仕様の奥深くまで分かってないとできないことだ Array.apply(null, { length: 5 }).map(Number.call, Number); // [0, 1, 2, 3, 4]
402 :
デフォルトの名無しさん :2013/09/25(水) 01:26:27.21
ECMAScript6に単純に型指定だけ出来て、静的型チェックしてくれれば最強なのに… 型指定以外は完全に一緒で良いんで、そういうプリプロセッサを誰か作ってくれないかな。
あー、7のguardsがそれにあたるのか。7がリリースされるのっていつになるやら…
405 :
デフォルトの名無しさん :2013/09/28(土) 07:44:14.08
ES6ファミリーにPromiseが入ります。 おめでとう・・・・・・・・! おめでとう・・・・・・・・!
407 :
デフォルトの名無しさん :2013/10/05(土) 18:32:39.18
isRegExpシンボルって面白いね String.prototype.match(regexp) はregexpオブジェクトに@@isRegExpが合った時には rx.match(this) を呼ぶことになってる つまりオレオレ正規表現が容易に実装できるってことか class MyRegExp { constructor( ...... ) { ...... } match(string) { ...... } replace(string, replaceValue) {......} split(string, limit) {......} } let regexp = new MyRegExp( ...... ); string.match(regexp); string.replace(regexp, replaceValue); string.split(regexp, limit);
411 :
デフォルトの名無しさん :2013/10/19(土) 19:00:16.23
ecma262.info/ ECMA-262 Edition 5.1に相当するISO/IEC 16262:2011の仕様は、 日本のSC22専門委員会でJIS規格化されないことが決定されたため、 ECMA-262 Edition 5.1の公的な日本語訳は存在しないことになります。
は? ISO規格に追随するのやめちゃったの? C++11も翻訳しないみたいだし、JISCは馬鹿なの?死ぬの?
本文は翻訳してないあのスタイルじゃあ、あっても無いのとたいして変わりなかったしなw
つーか規格の和訳って必要ないよなぁ どうせ原文にあたらなきゃならくなるんだから
JISにすることで著作権フリーになるんだよ(適当)
昔は日立とか東芝とか三菱とかが 主要言語のマイコンパイラ作ってたから、 社内技術者のために日本語訳が欲しいという要求があったけど、 今は業界からそういう要望もないのでしょう。 エコシステムとか言うんでしょ。
>>416 なるなら大歓迎だわ。
ぜんぜんなんねーんだよ。
419 :
デフォルトの名無しさん :2013/10/25(金) 16:29:14.50
エコシステム->生態系
JISの著作権は原案作成者とそれを規格化の過程において修正する工業調査会にあり、 公衆送信権は工業調査会が独占している。
>>416 原文嫁
著作権は放棄しないって明記されてるぞ
著作権は内国法優先だから、日本で規格の著作者やISOがどんなに著作権を主張しようと
著作権法の第13条第2号がある限り著作権が認められるはずがない……ってのが
>>420 のリンク先の主張でしょ
自分も法律を字義的に解釈すればそれであってると思うけど、これ以上は著作権スレに行ってやったほうがいいね
規格書は告示、訓令、通達その他これらに類するものじゃないから。 「XXXという規格を制定した」これは告示、XXXの規格書本体は告示じゃない。
>>424 だからその屁理屈はドイツじゃ通らなかったんだっつーの
ドイツだけじゃない。アメリカでも国の策定する規格に著作権は認められなかった。 スレチだけどな!
>>426 >>420 は公衆送信権に違反して他人の著作物を公開したいDQNのタワゴトじゃん。
ドイツでは法文に従って判断すると著作権が認められないという判決が出たから著作権法改訂されたと、当のDQNのブログにある。
428 :
デフォルトの名無しさん :2013/10/25(金) 19:13:55.99
天気の配信とか、役人の天下り先確保のために法令を整備してたでしょ。 それと同じなんじゃない?
分かりやすく産業にすると ・ドイツやアメリカでは国家規格に著作権は認められなかった(現在は法を改正済) ・日本は現在ドイツやアメリカの法改正前と同じ状況 ・改正しないとJISに著作権は認められない ・JISスレか著作権スレでやれ
×・改正しないとJISに著作権は認められない ○・改正しないとJISに著作権は認められないとDQNは考えている、行政はそのように考えていない、司法が行政の不利になる判決を出すことは稀
まあ、日本での前例もないみたいだし、これ以上水かけ論やりたいなら余所でね
432 :
デフォルトの名無しさん :2013/10/26(土) 10:38:18.25
仕様の話をしようぜ
434 :
デフォルトの名無しさん :2013/10/28(月) 09:40:22.02
話題出していっていいのよ
ES7の機能で一番早く使えるようになるのはSIMDかもな SMが来年中に実装しそうな勢いだし、何と言ってもV8が興味持ってる 影響範囲がほぼ無いしね
436 :
デフォルトの名無しさん :2013/10/31(木) 01:05:58.42
今はもういつES7か?ってのに こだわる必要はない気がする。 なぜなら順次実装されて言ってるから。 完成する前に使えるようになってる。
438 :
デフォルトの名無しさん :2013/10/31(木) 01:35:06.64
>>439 データ並列からマルチスレッドには飛躍があるけどな。
は? マルチスレッド⊃並列だろうに どこに飛躍が???
442 :
デフォルトの名無しさん :2013/11/11(月) 14:42:38.63
ぴょーん!
マルチスレッドでないデータ並列がSIMD
SIMDはそもそも並列とか意識できなくね
君はそうなのだろう。
SIMDAPIを使っても必ずSIMD命令が使われるわけじゃないしあってると思うよ
Dartのcascade演算子JSにも欲しいなあ obj..a = 1 ..b = 2 ..c = 3 ↓ obj.a = 1, obj.b = 2, obj.c = 3 or Object.mixin(obj, { a: 1, b: 2, c: 3 })
いよいよ始まるというのにこの過疎りようは悲しい……
449 :
デフォルトの名無しさん :2013/11/19(火) 19:24:22.27
今が一番盛り上がる時期なのにな
>>447 VBのWithステートメントに似ているな。
With Label
.Height = 2000
.Width = 2000
.Caption = "Label"
End With
JavaScriptのwithはピリオドが要らないという失敗をしてしまった。
with(label) {
height = 2000
width = 2000
caption = "Label"
}
たったこれだけのことだが、heightはlabel.heightなのか
withの外にあるheightなのか見た目でわからない上に、
label.heightが存在すればlabel.heightに、存在しなければwithの外のheightに
書き込むというだめだこりゃ的な動きをしてしまう。
もしかしてプロキシと組み合わせればなんとかなる可能性が微レ存……? function makeSafeScope(obj){ return new Proxy(obj, { ...... }) } with(makeSafeScope(obj)) { }
withってこうやって使うもんでしょ var scopeOrContext = {a:0, f: function(){++this.a}} with(Object.create(scopeOrContext)){ f()// 1 } scope.a// 0
with(obj) { a = 1 } ってした時にaがobj.aなのかそうでないのか分かりにくいってことだよ
そう言えば今までブロック文中の関数宣言は非推奨だったけど ES6からはブロックスコープになったんだよな (function (){ "use strict" if(1){ function a() {} } return typeof a })() //"undefined"
>>401 >Array.apply(null, { length: 5 }).map(Number.call, Number);
配列内包ってもう固まったんだっけ?
456 :
デフォルトの名無しさん :2013/11/22(金) 00:22:59.64
固まってる for-ofとifだけ a = [1,2,3,4,5] b = [ for(v of a) if(v > 2) v*2 ] // [6,8,10]
457 :
デフォルトの名無しさん :2013/11/22(金) 01:34:53.19
ES6への機能追加が21日で完了しました。 つまり、まもなくラストコールです。 今後は約1年間、実装からのフィードバックを含めた、 バグフィックスや小規模な改定のみが行われ、勧告となります。
やっと、ラストコールか。ちょっと停滞気味のRhinoフォークしてくる。
え、Rhinoって使ってる人いるの?
ググると結構あるぞ。むしろjavaだと他に何がある?
つNashorn
余計な記法増やして読みにくくするのやめてほしいわ このスレ見ても結局 黒魔術が増えるだけなんだなES6って
流れについていけない守旧派の極みだな 別にいいんだよ、IE6が理解できる範囲のJavascriptしか頭に入りませんってなら
ES6は必要な進化だろうけど、そのうち黒魔術化するでしょ LLJS/asm.js最適化しながら手書きできる人間なんて僅かしかいなくてコンパイラにjavascript吐かせる時代になるかもしれない アセンブラやCやってた連中が復活するかもしれないけど
Dartのことですね
猫かわいい
ES6はCと違ってよくわからないって人がごねた結果だろ
>>469 Cをよくわかってないなら喋らない方がいいよw
471 :
デフォルトの名無しさん :2013/12/26(木) 23:29:54.06
A=フェラチオ B=手マン C=セックス D=スカトロ
472 :
デフォルトの名無しさん :2013/12/26(木) 23:57:34.24
>>468 最新のIEと10年前のFirefoxを比較すれば当然そうなります
10年前にFirefoxなんかあったっけ? 10年前だとIE以外は生まれてすらいない時代だと思うけど。
>>473 でたらめを書かないでください。
Firefoxは10年前既にありました。
>>475 Firefoxの最初のバージョンはフェニックスと呼ばれました。
ウィキペディアで調べてもわからないことはあるものです。
そんなに恥ずかしがらなくてもいいです。
生きている価値が無いというほどのことではありません。
でも、ウィキペディアで調べて知ったかぶりをするのはもうやめたほうが良いかもしれませんね。
>>475 名前が変わったら別の製品だと思ったのか
恥ずかしすぎワロタ
もうそろそろ興奮収まったかい?
481 :
デフォルトの名無しさん :2013/12/27(金) 01:03:00.89
ワールドクラスの馬鹿を発見した興奮!
まだだったか
>>477 >>479 全く読んでないから知らんけど、名前が違う頃のFirefox使ったデータならその頃の名前で書くんじゃねーの?
>>472 >最新のIEと10年前のFirefoxを比較
どーゆー意味?
>>468 に載ってるFirefoxのバージョンは26とNightly 29なんだけど
>>468 mozilla.orgのJavascriptは独自仕様だよ。
ECMAScriptに入ってないのも独自の判断で仕様に入れて
Javascript 1.xと称している。
この場合のJavascriptはmozillaの商標。
一般的に言ってるJavascriptは標準規格のECMAScriptの通称。
そのうち独自仕様は辞めると思うが、
もともとJavascriptは彼ら(前身のNetscape社)のもの。
困るんだよねー ちゃんと規格としてかっちり決まってから実装始めてもらわないと
しかし実装がないと規格も決まらないというジレンマ
>>486 このスレの住民の言葉とは思えんな
Fxのお陰でどれだけ仕様が改善できて策定がスムーズに行ったことだか
特に構文レベルだと長いフィードバックが不可欠
それをFxがずっと前からやってくれたおかげで、
今のFxの独自実装が抱える多くの問題を踏まずにすんだ
ChromeにだってSymbolやPromiseやら先行実装たくさんあるし
これから先もSIMDやParallelやら先行実装が重要なものは沢山ある
これからのJSって便利にもなるが厄介なことも増えるよな 例えばnewが要るかどうか 理屈としては継承のために@@createを呼び出させるべきかどうかなんだろうけど、 Mapなんかは付けないとエラー、Proxyやvalue object系には付けるとエラー、とか覚えるのが増えるね
490 :
デフォルトの名無しさん :2014/01/01(水) 00:01:49.39
今年はES6の年です 皆さん祝いましょう!
お断りします
>>489 今でもフレームワークごとに違うじゃん。
ビルドインオブジェクトの話でしょ フレームワークはフレームワーク まあ余談だけどユーザー側で作るAPIは基本的に Class.initとかClass.create〜とかを提供する形にした方がいいと思うね
494 :
デフォルトの名無しさん :2014/01/01(水) 10:19:14.82
ついにJSも世代が分かれて古い方はstaticおじさんと呼ばれるようになるに違いない
ES6が糞過ぎるからしょうがないね
496 :
デフォルトの名無しさん :2014/01/01(水) 14:35:09.29
そうか?物によっては10年もかけただけあって随分洗練されてると思うが 今でも微妙な問題は残ってるけど大山は全て乗り越えた感じだ
おまえらArray.prototype.shuffleとか作ってないか? そういうのは困るからArray.prototype._shuffleみたいにしろとさ
ES6に足りないものは、 {obj1,obj2,obj3}.prop.{prop1,prop2,prop3}.prop = val というシンタックス。あとはいい。
イラネ なんだその黒魔術
これが黒魔術なら分割代入も黒魔術ということになってしまうな
そうか 本当は [a,b,c] = [1,2,3] のように [o.a,o.b,o.c] = [1,2,3] を o[a,b,c] = [1,2,3] と書きたいが これだとa,b,cのコンマが独立した演算子と取られてしまうから 可能性としては o{a,b,c} = {a:1,b:2,c:3} か o{0:a,1:b,2:c} = [1,2,3] とするしかないのか それがどうも冴えないから入らなかったんだろうね
はあ・・ JavaScript ES6 Bad Parts -分かりにくい悪手法- という良書が出来るのが目に見えてる
でも
>>498 の「{}.」は案外凄い良いシンタックスだと思うよ
{obj1,obj2,obj3}.prop.{prop1,prop2,prop3}.prop = val
{obj1,obj2,obj3}.{prop.{prop1,prop2,prop3}.prop} = val
{obj1,obj2,obj3}.{prop.{prop1,prop2,prop3}}.prop = val
{{obj1,obj2,obj3}.{prop.{prop1,prop2,prop3}}}.prop = val
読みやすさは最悪だか汎用性レベルは最高
あらゆるパターンを記述できるわ
案外ES7くらいで採用されるかもね
504 :
デフォルトの名無しさん :2014/01/01(水) 16:14:52.51
ES6のBest Partsのspread演算子様 arr.slice() ↓ [...arr] arr.slice().push(x), arr ↓ [...arr, x] for(var i = 0, arr = []; i < len; i++) arr[i] = i ↓ arr = [...Array(len).keys()] arr.filter(function (x, i, a) {return a.indexOf(x) == i}) ↓ [...new Set(arr)] str.split('') ↓ [...str] 可能性は無限大
505 :
デフォルトの名無しさん :2014/01/01(水) 16:47:20.67
配列内包も素晴らしい s1 = 'abcde', s2 = '12345' for (var arr = [], i1 = 0; i1 < s1.length; i1++) for (var i2 = 0; i2 < s2.length; i2++) arr.push(s1[i1] + s2[i2]) ↓ arr = [for (c1 of s1) for (c2 of s2) c1 + c2]
みんなcoffeescriptからの流用なんだけどね
いいえPythonやHaskellなんかからの導入です CSも同じく
他の言語からの取り入れを悪いことのように言う傾向が今年は滅びますように
そんなのは見たことないな
>>501 o['a', 'b', 'c'] = [1, 2, 3];
が既存の分割代入に近くていい気がする。
プロパティの分割代入とか、プロトタイプ継承を理解していない証拠
>>510 それは無理
o['a', 'b', 'c'] = [1, 2, 3];
は既に
o['c'] = [1, 2, 3];
と解釈されるから
慣れれば読みやすい可能性が微レ存 p{a,b} = q ↓ p.a = q.a p.b = q.b p.x.{a,b} = q ↓ p.x.a = q.a p.x.b = q.b p.{x.{a,b}} = q ↓ p.{x.a,x.b} = q ↓ p.x.a = q.x.a p.x.b = q.x.b
p.{x,y}.{a.b} = q ↓ p.x.a = q.a p.x.b = q.b p.y.a = q.a p.y.b = q.b p.{{x,y}.{a.b}} = q ↓ p.{x.a,x.b,y.a,y.b} = q ↓ p.x.a = q.x.a p.x.b = q.x.b p.y.a = q.y.a p.y.b = q.y.b p.{z:{x,y}.{c:a.d:b}} = q ↓ p.{z.c:x.a,z.d:x.b,z.c:y.a,z.d:y.b} = q ↓ p.x.a = q.z.c p.x.b = q.z.d p.y.a = q.z.c p.y.b = q.z.d
後は分割代入でも先送りになったけど undefinedを見逃す?演算子系は実際必要だな if(a&&a.b&&a.b.c) ↓ if(a.?b.?c) var {a:{b:c}} = {} //c=undefind.b -> error ↓ var {a:{?b:c}} = {} //c=undefind.?b -> undefined
516 :
デフォルトの名無しさん :2014/01/02(木) 17:59:53.93
>>514 パターンマッチはスクリプト言語なら強化して欲しいが、
これに?演算子やguardやら入ったらカオスになるんだろうな。
おまえらみんなwithでも使ってろ ただし最後はちゃんと"use strict";を書いてデバッグすること
518 :
デフォルトの名無しさん :2014/01/09(木) 16:12:01.04
with分も捨てたもんじゃない プロキシと組み合わせればスクリプトを分かりやすく書けたりする unit1.on('reqestCommand', unit => { with (new ControlerProxy(unit)) { if (Y > 100) TURN_LEFT_180 GO_100 if (Y < 0) FREEZE } })
519 :
デフォルトの名無しさん :2014/01/15(水) 00:39:55.46
try { (ノ°□°)ノノ ┻━┻ } catch() { ┬─┬ ノ( ゜-゜ノ) }
521 :
デフォルトの名無しさん :2014/01/17(金) 06:08:12.57
静的型チェックっていうと大袈裟だったかもしれないけど、他人が書いた関数で 引き数に何を渡せばいいか分からない事ってないか? 複数人で規模の大きめのアプリを作る時とかは、みんなまじめにアノテーション とか書いてんのかね。 しかしBrendan Eichがいらねってんなら望み薄だな… bindはいいけど、guardsはTypeScriptと同じように:一個にすればいいんじゃね?
まあダックタイピング+トライ・アンド・エラーで行くしかしょうが無いでしょ。 公式で用意されてる関数は適当に叩けば適切なエラーが帰ってくるからそれ見習ってもいいかもな。 crypto.getRandomValues() //TypeError: Failed to execute 'getRandomValues' on 'Crypto': 1 argument required, but only 0 present. crypto.getRandomValues("^_^") //TypeError: Failed to execute 'getRandomValues' on 'Crypto': First argument is not an ArrayBufferView crypto.getRandomValues(new Float64Array(10)) //TypeMismatchError: Failed to execute 'getRandomValues' on 'Crypto': The provided ArrayBufferView is of type 'Float64', which is not an integer array type. crypto.getRandomValues(new Int32Array(10)) //[519742316, 1326690367, 1843628936, 94818381, 1481545681, -949200701, 1818462933, -1973550051, 2019705203, -1026601786]
トライ・アンド・エラーで別に構わないけど、crypto.getRandomValues()みたいに 適切なエラーを出す為にもGaurdsは必要だと思うけどね。 現状の現実的な解は、関数の先頭に型チェックするassertなりを仕込んでおいて リリース時にスクリプトで削除するか、何もしない関数に置き換えるとかかな。
525 :
デフォルトの名無しさん :2014/01/18(土) 09:06:28.46
Gaurdsに頼る形だとtry-catchを使うことになるし、結局型に合わなかったことしか分からない 必要なのは適切な型か、適切なインターフェイスを備えてるかをテストすることだと思う この辺りを良くする仕組みはES6にも入ってる ES6ではinstanceof演算子は実質オーバーライド可能になって、関数じゃないオブジェクトに対しても使えるようになった 例えばこう書ける const IntegerArray = { [Symbol.hasInstance](x) { return [Int8Array, Int16Array, Int32Array, Uint8Array, Uint16Array, Uint32Array].some(A => x instanceof A) } } new Float64Array(10) instanceof IntegerArray //false new Int32Array(10) instanceof IntegerArray //true これなら柔軟に対応できる。ちなみにClassも継承を活用できていい class IntegerArray extends TypedArray { static [Symbol.hasInstance](x) { return super(x) && x[Symbol.toStringTag].contains('nt') } }
なるほど型判定にinstanceofを使えばいいんだな しかし[Symbol.hasInstance](x)って見慣れない構文だな… x[Symbol.toStringTag]も どこ見ればいいか教えてもらえると助かる
527 :
デフォルトの名無しさん :2014/01/18(土) 21:26:39.22
前者はMethodDefinition ObjectLiteral ↓{ PropertyDefinitionList } ↓{ PropertyDefinition } ↓{ MethodDefinition } ClassExpression ↓class BindingIdentifier ClassTail ↓class Identifier extends AssignmentExpression { ClassBody } ClassBody ↓ClassElementList ↓ClassElement ↓static MethodDefinition MethodDefinition ↓PropertyName ( StrictFormalParameters ) { FunctionBody } ↓ComputedPropertyName ( FormalParameters ) { FunctionBody } ↓[ AssignmentExpression ] ( ) { FunctionBody } 後者は「known symbol」でドラフトを検索してみるといい
528 :
デフォルトの名無しさん :2014/01/21(火) 07:00:19.03
try { (ノ°□°)ノノ ┻━┻ } catch() { ┬─┬ ノ( ゜-゜ノ) }
529 :
デフォルトの名無しさん :2014/01/21(火) 14:32:33.68
530 :
デフォルトの名無しさん :2014/01/25(土) 07:24:58.43
例のwith proxyでvalue objectと演算子オーバーロードがエミュレートできるな 概念を書くと例えば v = vo1 + vo2 * vo3 のとき get vo1 → get vo2 → get vo3 → set v vo1 + vo2 * vo3 のリクエストが受け取れる ここでvalue objectがgetされたときは適当な数値で返しながら覚えておく 例えばそれぞれ2.1、3.2、4.3とか するとこの場合「set v 15.86」リクエストがあった時、実際の処理は2.1+3.2*4.3だったであろうことが逆算でわかる つまりvにvo1+vo2*vo3の意味するとこの結果を代わりに設定して、その後のget vで返すことができる これでマズイこともあるが、かなりのパターンのオーバーロードができそう もう一つ思いついたのは、クロージャなしで任意の変数を関数に紐付けできる WeakMapにcalleeとオブジェクトを紐付ければそれっぽくできるか with(scope(arguments)){ $static, hoge, fuga, puyo, $ } みたいな素敵な宣言文も定義できる
531 :
デフォルトの名無しさん :2014/01/31(金) 06:23:51.84
今やってるTC39ミーティングはES7がいよいよ始まったって感じで興味深いね。
Structured Clone、Typed objects、Value object、Parallel、Object.observe、Do expression、Async/await
その中のTyped objectsのスライドも面白い。
https://docs.google.com/presentation/d/1HGoxjX74Q9i8I1ok-hkmxzWlM7CDQwxT0sUS5PJDxdg/ tobj.bufferで仮想的なメモリダンプができて、それを一旦保存して同型のコンストラクタに食わせることで復元したりも出来そうだね。
個人的お気に入りなのは『do式』
見た目はdo-while文のwhile以降がない形で、最後の評価値を返すブロック文のような式。
見送られたlet文のより良い代わりになったり、複数行アロー関数でのreturnの省略など、かなり素敵に役に立ちそう。
var v; let (r = rand()) { v = b*n|0 }
↓
var v = do {let r = rand(); b*c|0 }
func = () => { ......; return hoge }
↓
func = () => do{ ......; hoge }
ES6はいよいよ詰める作業に入ったね。
おそらくもう一回、3月末のミーティングを終えてから、4月くらいに最終草案が出来るんじゃないかな。
532 :
デフォルトの名無しさん :2014/01/31(金) 19:19:33.18
単体doはPerlを思い出すな
534 :
デフォルトの名無しさん :2014/02/03(月) 21:58:06.74
最近JSのマクロでsweet.jsが流行ってるけど、ES8のマクロはこれがベースになりそうな予感
ES8って…鬼が笑いそうだな(節分だけに)
ラムダっちゃ
537 :
デフォルトの名無しさん :2014/02/04(火) 06:06:37.19
>>535 ES6の勧告は今年末
ES7の勧告はその2年後(つまり今から約3年後)を予定してるとなると
ES8の勧告は2020年になるまでには……って感じだろうな
でもこれまでの流れを見ると、ES7が大方固まったころ、つまり今から2年後にはES8の仕様もミーティングで話されていくし、
その1年前、つまりES6が勧告される頃には、メーリングリストで議論されてstrawmanに候補が挙げられだすのが定跡
つまり、ES8を考えだすのは来年の話でもないと思う
そもそもSweet.jsはMozilla製だし、macro文とかdef文とかESに取り込まれることを狙っているのかもしれない
あともう一つ挙げるなら、かつてES8だと思われてた機能も今のところマクロ以外はみんなES7になったし、
ES7だと思われてたPromiseが急遽ES6に入った例もあるから
マクロもSweet.jsみたいなのがPromiseライブラリ並みの存在になればもしかしたら……ってのはある
539 :
デフォルトの名無しさん :2014/02/05(水) 06:02:48.34
540 :
デフォルトの名無しさん :2014/02/06(木) 10:10:23.63
先日の会議でPromiseに関してchainを廃止してcastをresolveに統合することになったんだけど、凄い揉めてる
http://esdiscuss.org/topic/promise-cast-and-promise-resolve 似たのがあるのはややこしくて無駄
chainとthen、resolveとcastでそれぞれ前者がベーシックで、後者が実用的という感じだろうか
で、残すとなると実用的な方になるのはもっともだが、
ベーシックな方を捨てると、関数型スタイルとしての魅力を大きく損ない、ただのサポートAPIに成り下がってしまう
皆Promiseに対して考えてる重みが全然違う
高レベルなフレームワーク追加と思うかパラダイム導入と思うかでぜんぜん違う
宗教的な部分も関わってくる
もっと根本的な設計から文句がある人もいる(決まるのが急すぎた!)
今でも案が出るし、PromiseじゃなかったらとっくにES7に持ち越しになってると思う
今後どうなるか注目
こんな感じ? 〜ML〜 chain(flatMap)が要る要らないというようなことが半年前から度々話されてきた 〜そして先週の会議〜 「要らないよね〜」 「無くすのでいいと思う」 (ほぼ満場一致ですぐ決まる) 〜ML〜 「解決したよ〜^^ chainとresolveは無くすね」 「これはひどい><」 「話が違うじゃねえかざけんな!」 「オンラインでの積み重ねを大事にしろよ」 ・Googleの人 「あー、会議に出れなくて言えなかったのマズったな ま、周りではchain推しだしV8では無くさないことにしたから^^; (そもそもthenがクソだからchain実装したんだし!)」 「でも会議にでなかった人が決議を取り消せたら進展しないよね…」 『『『会議の意義って…………』』』 そして遂に出てしまった危険ワード「disasters like ES4」に皆が内心震え上がりましたとさ 爆死
542 :
デフォルトの名無しさん :2014/02/16(日) 06:09:25.38
CやC++もそうだけど、最新仕様にジワジワ対応してくのがいやだな ベンダー中立なのも善し悪しだ
es6のletも関数の先頭に巻き上がるの?
545 :
デフォルトの名無しさん :2014/02/20(木) 06:13:15.91
let,constはブロックスコープで巻き上がらないよ 因みに関数宣言はブロックスコープで巻き上がる事になった スコープに関してはこの2点を押さえとけばいい
どうもどうも。 つうことはlet,constだけを使ってる限りは、C++と同じように使う直前で宣言する っていうルールでいいわけだ
逆じゃね? 巻き上がるvarは先頭で宣言する意味が無いけど、 letはブロック文の先頭にやった方がいいと思う。 var a if(f) { a = 1 } else { a = 2 } は if(f) { var a = 1 } else { var a = 2 } とできるし、そのほうが分かりやすい。 letだとこれができない。 で、分岐の前で宣言するようなことをちまちますると分かりにくいから、 いっそそのブロックの先頭でまとめて宣言した方が分かりやすい。 constは定数なので当然先頭のほうが分かりやすい。
'use strict'; var a = 1; function hoge() { // ↓グローバル変数にアクセスするつもり console.log(a); // => undefined (巻き上げの為) var a = 2; // aを使う処理 }; -------- let a = 1; function hoge() { // ↓グローバル変数にアクセスするつもり console.log(a); // => 1 (のはず未確認) let a = 2; // aを使う処理 }; と直感的になるから使う直前で宣言するで問題無いよ
549 :
デフォルトの名無しさん :2014/02/21(金) 06:02:18.19
>>548 あくまで変数はスコープに属する
つまり正確には変数の存在は巻き上がるというかスコープに浸透する
但し宣言箇所までに使おうとするとエラーになる
だからletさえあれば必ずしも良く書けるというわけでもない
特にfor文ではletは一見凄くいい
最近Cと同様に毎ループスコープコンテキストを生成するようになった
これでfor文中でのクロージャ生成がグッとよくなる
ただしその影響でパフォーマンスに影響があるかもしれない
理論的にはループ中にスコープコンテキストを保持するものがない場合
コンテキストを生成しなくて済むが、実際最適化が進むのは時間かかる
いずれにせよ、letはキチッとしたイメージで使っていくべきだと思う
>>547 のような場合は、もし使う直前で宣言するのなら
それはそれ以前に変数を使っていた場合にエラーにしたいからという理由に自ずとなる
だがもし
>>548 のように見えて、キチッとしてないと思うのならブロック文の最初で宣言すべき
ただ大半のケースであろう、そのスコープだけで下位のスコープでは使わない場合
一気に宣言と代入をした方がコンパクトでいいとは思う
場合によっては先頭にする、また場合によってはvarも使うというように
個人的ポリシーのもと綺麗に使い分けるか、思い切ってvarを捨てて
letのその場宣言に統一するか、どちらがいいかは分からない
変数の定義は出来る限り後にするってのはEffectiveC++にも書いてある事だし let,constを使ってる限りはその習慣のままでよくなったって事でいいよ
ES6ってEffectiveC++まで読まないと使いこなせないのか…
>>551 んなわけない
C++の人がJS のヘンテコな仕様を気にしなくてよくなっただけだ
553 :
デフォルトの名無しさん :2014/03/20(木) 20:37:22.08 ID:OnvdowAM
しかし、letが使えない事が最もイラつく要因だな これだけは間違いなく設計ミスと言わざるを得ない はやいとこletが当たり前のように使えるようになってほしいよ
Let it be.
なんでそんなもんが要るのか理解に苦しむ
letって糖衣構文だよね?
letをラムダ式で書くのは一般に可読性がすごく悪いので、letがラムダ式の糖衣構文であることは 間違いないけど、良い糖衣構文の典型例と言っていい。 おまけにJSのラムダ式は function とか無駄にキーワードも長いし(funcで十分ですお)。
そもそもムダ式の使いどころがわからないw
(function って書きかたするだけで即時無名関数だってわかるし、可読性悪いと思わないな。 とはいえletは便利だと思う。
架空の構文を使うが、 let (a = a に与える値, b = b に与える値) { a とか b とかを使ったプログラム片 }; ↑コレが、こうなる↓ (function (a, b) { a とか b とかを使ったプログラム片 })(a に与える値, b に与える値); 可読性は大幅に違うと思うが?
var使えばいいじゃん
564 :
デフォルトの名無しさん :2014/04/27(日) 16:49:18.92 ID:/n7QikUK
varか
バーカと言ってんのか。
perlみたいにmyにすればvarより一文字タイプする手間が減って 人類全体ではおそらくのべ何百万時間と何百テラバイト節約できたのに。
そこでさらに1文字減らそうと考えないお前はとことん子供だな
>>567 phpの$はすばらしいな!え、ちがう?
570 :
デフォルトの名無しさん :2014/04/29(火) 20:33:54.13 ID:pZyrXbny
class構文書く時@@createとconstructorの役割の割り振りが難しそうだな Arrayとか標準クラスを参考にすると@@create()ではそのクラスのインスタンスたり得る未初期化のオブジェクトを構築する つまり例えばArrayならlengthや自然数がハックされた(Proxy)オブジェクトを作り、prototypeの継承もここでする この時点で、obj.isClass()はtrueになるべきだが、まだオブジェクトが使える状態であってはいけない その次にconstructor()で、this.isClass()がtrueならば実際の初期化を行い、使える状態にする this.isClassがfalseまたは、初期化済みのインスタンスが渡された場合はエラーにする 逆にconstructorでオブジェクトをそのクラスのインスタンスたらしめる処理を行ってはいけない 例えば、内部的に使用するプロパティを新しく作成してはいけない 内部プロパティは@@create()でundefinedの値を入れて作っておき、constructor()ではそこに入れるだけにする これを常に守っているクラス間では、多重継承や多重継承元オブジェクトの作成など柔軟性の高さを確保しつつ、安全なクラスシステムが定義できる 一方自由が好きな人でも、@@createを使いこなすことで自分好みのクラスシステムを再定義できる 例えば〜.prototype.〜は長いから〜.$.〜にしようとかも超容易にできる
JavaのJavaScriptが更新されたね
ES6のイテレータってJava8のStreamAPIみたいなメソッド無いの?
The ECMAScript 6 schedule changes
http://www.2ality.com/2014/06/es6-schedule.html ECMAScript 6 will be finished (with the exception of fixing last bugs) by the end of 2014.
The publication process starts in March 2015 (and is finished in June 2015).
JDKに標準添付されているJavaScriptエンジンがJDK7まではRhinoだったのがJDK8からはNashornになったという話じゃないかい
なるほど Java「標準・付属」のJavaScriptが更新, ってことね
letはwith使えば良いじゃん。 with( {i:0} ) { }
ESはclassよりprototype方面を強化してほしいなぁ。 Echo = {}; Echo.print = function() { println( this.message() ); } Hello = Object.create( Echo ); Hello.message = function() { return "Hello"; } Hello.print(); Regexとか標準の型もこれと同じ方法で運用できると助かる。
これから262 vs 408の図になるのか?
408ってなにかと思ったらDartか あれ使ってる人ホントにいるの?
IEの全盛期でも誰もVBScript使わなかったのに 当時のIEよりシェア低いChrome限定の言語とかww
Dartω
arrow構文クソ過ぎワロタ JSLintで使用禁止にされる未来が見える
そんなこと言ってたらLISP以外使えなくなるぞ どこらへんがクソなのか言ってみ
>>585 じゃないけどthisArgを固定されるのひどいと思う。
definePropertiesで省略できないじゃん。
それはメソッドの省略記法使えばいいんじゃ Object.defineProperties(obj, { abc: { get() { /* ~~~ */ }, set(a) { /* ~~~ */ } }, def: { value() { /* ~~~ */ } } });
基本的に無名関数定義にをfunction使う必要がなくなったという認識。 イベントハンドラとかで、elementをthisにしたいときくらいかな
Firefox のアドオンですでに結構使ってるけど、
主なユースケースとしては
>>589 のいうように
Array#forEach とか Promise, EventListener などの無名関数だから
this が束縛されることに対する不便さは特に感じてないな
arrowになって普通のスクリプト言語と同じになったのに、糞という奴は 相当今までのJavaScriptに毒されてんだろうな そろそろ20年にもなる訳だから無理もないが
何故、無名関数定義にfunctionを使いたくないのかが分からない。 こうやって迷走させてDartとかに移行させるつもりなんだろうと思うわ。
ES6以前からMozillaの独自拡張でfunctionの{}省略ってのができたのだから、 関数自体を短く書きたいという要求は多かったのでは? コールバックを多用するライブラリの作り上の特性も関係してると思う
funcぐらいなら毎回書いてもいいけどfunctionだと長すぎるかなー てかJavaのラムダ式もこんな構文だし、まあ流行りってことで
正直、短縮した "func" をキーワードにするだけで済む話だと思うのだが、 なんでこんなすったもんだするのか。
何がすったもんだなのか全くわからん C#勉強した方がいいぞ arrowはほぼ一緒だし恥ずかしい事を言わずに済むよ
もうLispで良いじゃんとしか思えん >>省略記法とか糖衣構文にまつわるゴタゴタ
>>595 キーワード追加は既存コードとの衝突があるし、
funcとか山ほど使われてるから大変なんだろう。
C++のautoとかは新キーワードかとおもいきやCの頃から存在してたが、
全く使われて居ない無意味なキーワードの再利用だから衝突しなかった。
ファンクチョン
> C#勉強した方がいいぞ > arrowはほぼ一緒だし恥ずかしい事を言わずに済むよ は?
ふ?
ほ?
ふ?
>>603 そこは、「サッポロ一番カップスター!!!♪」だろう
イベントハンドラとかでthisが変動するのって重要じゃないか。es6なんだからmoduleもthis変わるだろ?
そのとき実装が省略してarrow function使ったら仕様に出ないから分からずにthis固定されることになるじゃん。
その関数を使ったときcall/bindが期待通りに動かなくてソース読んで初めて判明することなるのは問題じゃない?
そもそも
>>592 の言うとおりes6が迷走し過ぎだと思う。
>>591 クロージャを()=>{}と書くのはsmalltalk系の流れだから現在は全くメジャーじゃない。変種のRubyのblockのほうが知られてるくらいじゃん。
javaなんて元はStrongTalkだから先祖返りじゃん。大体expression closuresはその20年くらい前からあるんだよ。
関数省略したいってのはその頃からある話でMSがjs2.0ゴネたから実装がjs1.8まで遅れたんじゃん。restとspreadだって同じでNSはずっとArgumentsオブジェクト止めたかったんだし。
>>592 DartかTypeScriptか忘れたけどthis固定する方法としない方法両方用意してるからそっちの方が優れてるよ。
他の言語に慣れた人が「thisがころころ変わるのはキモイ」とかってごねたから arrowのthisは今の仕様になったんじゃないの? 知らんけど
NYscene
>>605 > クロージャを()=>{}と書くのはsmalltalk系の流れだから現在は全くメジャーじゃない。
C#と一緒だからそれで十分だし、メジャーとかマイナーとか関係無い
C#C#C#…馬鹿みたい
世界一実用性のある言語だから仕方ないね
JavaScriptでは関数もオブジェクトだから Function instanceof Object がtrue でもObjectは関数だから Object instanceof Function もtrue 何このループ
>>611 型とコンストラクタをごっちゃにしてどうすんだ。
> Function instanceof Object → true
> Object instanceof Function → true
> new Function instanceof Object → true
> new Object instanceof Function → false
で、
> (function(Type){return Type instanceof Type}(function(){})) → false
> (function(Type){return new Type instanceof Type}(function(){})) → true
ラストのわかりにくかったかもしれんので追加 > Array instanceof Array → false > new Array instanceof Array → true
typeof Function → function typeof Object → function 要するに Object はコンストラクタ(関数)でもあり、全てのオブジェクトの親でもあるから Function instanceof Object → 全てのオブジェクトは Object の派生であるから true Object instanceof Function → Object は関数でもあるから true だな
> Object は関数でもあるから 「Object はObjectという型のコンストラクタ(関数)だから」と言った方が誤解を招かなくて済むと思うのだけど。
関数が Object
普通 Object は class なはずだけど JavaScript は関数からオブジェクトを作成するってのが ヘンテコなところでもある ES6だと class の定義が出来るけど、それを typeof したら何になるんだろうか? やっぱり function か
ES6のclassはただの糖衣構文だよ
>>620 function という型はない
だから、仕様を読めといってる
>>621 だから typeof した結果を聞いてんだよ日本語読めないのか?
>>622 classを設定して型が変わったり、[[Call]] が付与されるわけないだろ
>>623 >>617 で
> ES6だと class の定義が出来るけど、それを typeof したら何になるんだろうか?
> やっぱり function か
と聞いてんだぞ
何トンチキな事さっきから言ってんの?
お前が仕様以前に日本語読めてねーじゃん
AMDとは一体…うごご
まともなこと言ってんのは
>>612 だけってどうなん。
rev 28-12.5.6.1-5.
Return a String according to Table 36.
Table 36 ― typeof Operator Results
Object (implements [[Call]]) "function"
だからclass defのtypeofの結果は"function"であってるよ。
js> class A{}
js> typeof A
"function"
js> Object.prototype.toString.call(A)
"[object Function]"
js> Symbol.toStringTag in A.prototype
false
>>626 moduleはいいけどこれ勘弁してほしいわ。
>Changed ordinary object creation to dispatch object allocation through [[CreateAction]] internal slot instead of @@create method.
>Converted all @@create methods into CreateAction abstract operations.
>Eliminated Symbol.create and @@create.
>だからclass defのtypeofの結果は"function"であってるよ
んなこたみんなわかってる。
>>619 が日本語読めないだけ。
>>628 > js> class A{}
> js> typeof A
> "function"
これってどんな環境で確認したの?
説明無しにオナニー披露してんだから ふれちゃだめ
>>632 これか
いやclassの型とかもはやどうでもよくて、単に実行環境を知りたかっただけ
こういうのをサクっと作っちゃうのはスゲーな
しかもガイジンにしちゃソースの可読性がハンパなくいいな…
anbaってHN見て知らないなら開発者じゃないな。
開発者だが全然知らん
でたー通気取り
>>633 > しかもガイジンにしちゃソースの可読性がハンパなくいいな…
これは偏見
>>637 いやもちろん単なる主観でしかないが、こないだもOpenSSLのソースは猿が書いてるとか
言われてたし、メジャーなオプソでも意外と可読性気にせずガリガリ書いちゃってるのは
あるにはある
可読性どころか ループできるところをループせずにコピペの塊だったりする
>>638 jQuery作者とかCrockfordとかソースの可読性に気を使っているガイジンはたくさんいるんだが
Googleだってアメリカの会社だ
日本人のコードが特別優れているようには思えない
たしかに外人は文字列周りとかやたらhard-wiredなコーディングしてたりするけど OpenSSLは古いし報告済みの脆弱性が放置されてるからあれを基準にしちゃダメだろ。 それこそ猿が書いたコードと人間が書いたコード一緒にするなよ。
>>641 猿が書いたって単なる比喩なのに、人間書いたコードと一緒するなとか意味不明
そもそも日本人は可読性に優れたコードを書くというソースはどこ?
最長不倒関数でググれ
>>643 クソみたいなコーディングルールでガチガチに縛るのを横行させた実績はある。
………………策定した奴らにとってはあれが可読性に優れたコードなんだよ!
コーディングルールでガチガチに縛るのは海外も変わらんよ。 違うのは海外勢はガキの頃からcomputer geekでコード書いてるのが当たり前でそういう連中はちゃんとしたコード書けるってことだけだ。
頭のおかしいルールがまかり通る、とかの実質で比較しなきゃ空論以前だな。
ジャンガリアンの悪口早めろ
スレ違いどころか板違いだな woo
ハンガリアンは元々暗号めいてるC言語の型の表記方法に加えて、さらにややこしくnearとか farが付くというマジキチなMS-DOSやWin16のC言語では意味がある。 あとシステムハンガリアンとアプリケーションハンガリアンはちゃんと区別しような。
システムハンガリアンで役に立つのってポインタを表すpくらいじゃねぇの? アプリケーションハンガリアンはwebアプリだと汚染の伝達が見て解るから凄く好きだが。
ミトコンドリア化
PromiseにNotifyのような継続したメッセージング機能がないのなんでだろ jQueryから離れらんないじゃん
それstreamで
それECMAの仕様に入ってる?
WHATWG(笑) ブラウザの事しか考えてないゴミじゃねーか
メッセージングとかそこらへんはhost側でやればいいじゃん。
アーキテクチャ毎に最適解が違うしシングルスレッドかマルチスレッドかでそのアーキテクチャも変わるでしょ。
asyncとかPromiseみたいなどうでもいいもんを仕様に入れようとする今の流れがおかしい。
>>660 の言う通りブラウザのことしか考えてない。
node全否定?
jQueryから離れらんない人(>656)がブラウザ依存を嫌う理由がわからん
その前になぜ同一人物だと思ったのか
promiseもstreamもサーバサイド発なのになぜブラウザのことしか考えてないことになるのか?
promiseはjQuery.Deferredじゃないか? そもそもfutureとpromiseは並列プログラミング一般のデザインパターンだろ。 javaも標準でconcurrentフレームワークにfutureがある。
ES6のPromiseは直接的にはサーバサイドJSの標準化をしていたCommonJSのPromise/A+仕様が元
jQuery が元になった仕様は Selectors API ぐらいかな
670 :
デフォルトの名無しさん :
2015/02/26(木) 21:43:09.84 ID:0l3fh5cz