ECMAScript デス 4at TECH
ECMAScript デス 4 - 暇つぶし2ch1:デフォルトの名無しさん
12/01/02 05:16:18.29
《ECMAScriptを語るスレ》

1. - 概要 -
ECMA-262規格として知られる言語(通称 ECMAScript)についての利用法や言語仕様、
その他四方山話をするスレです。
Standard ECMA-262 ECMAScript Language Specification Edition 5.1 (June 2011) 標準規格(英語)
URLリンク(www.ecma-international.org)
Annotated ECMAScript 5.1
URLリンク(es5.github.com)
Draft Specification for ES.next (Ecma-262 Edition 6)
URLリンク(wiki.ecmascript.org)
Under Translation of ECMA-262 3rd Edition (日本語訳)
URLリンク(www2u.biglobe.ne.jp)


■前スレ
ECMAScript デス 3
スレリンク(tech板)

■過去スレ
JavaScript デス
スレリンク(tech板)
ECMAScript デス 2
スレリンク(tech板)

2:デフォルトの名無しさん
12/01/02 05:17:18.23
2. - JavaScriptについて -
JavaScriptは動的Webページ作成専用言語ではありません。
このスレでは、★言語★としてのECMAScript(JavaScript、JScript等)の話題を扱います。
ブラウザ環境でのJavaScriptはWeb製作板へ。ASP、CGIなどはWebProg板へ。

●スレ違い●なレスの例
 + JavaScriptによるWebページの挙動実現に関する疑問/質問、は、
   ■スレ違い■です。→Web製作板へどうぞ
 + Webブラウザの動作挙動に関するの疑問/質問         は、
   ■スレ違い■です。→Web製作板へどうぞ
 + そのほか、Webページ作成に限定した内容の疑問/質問    は、
   ■スレ違い■です。→Web製作板へどうぞ

■参考■[Web製作板] + JavaScript の質問用スレッド vol.94 +
スレリンク(hp板)

※JavaScriptが板違いと言いたい人へ
運営サイドから次のような見解が出ています。
|459 飛べない削除屋 ★ sage :04/05/30 15:38 ID:???
|>‍>458
|ローカルルールにはひどく単純化されて書かれていますが、
|Javascript という言語そのものが板違いなのではありません。
|用途によって板違いかどうかを判断してください。

3:デフォルトの名無しさん
12/01/02 05:21:56.94
3. - 主な実装 -
Rhino (Mozilla.orgでメンテナンスされている組み込みを目的としたJava製の実装)
URLリンク(www.mozilla.org)

SpiderMonkey (同上。ただしこちらはCによる実装で、Mozilla Firefoxで採用されている)
URLリンク(developer.mozilla.org)

NJS (旧NGSを引き継いで開発されている独立したインタプリタ実装)
URLリンク(sourceforge.net)

JScript (Microsoft社による実装。WSHを介したローカルマシン用のバッチスクリプトとして使用に加え、.NETの開発言語のひとつでもある。
また、WebクライアントサイドスクリプトやASPにも利用することができる。)
URLリンク(msdn.microsoft.com)
JScript .NET
URLリンク(msdn.microsoft.com)(v=vs.71).aspx

DMDScript (Digital Mars社による実装。Windows上で利用できるJScript置き換え的な位置づけ
スタンドアロンのインタプリタに加え、COMコンポーネントとして組み込むこともできる。)
URLリンク(www.digitalmars.com)

FESI (ECMAScript第一版に準拠したJava実装)
URLリンク(www.lugrin.ch)

DMonkey (Delphi(ObjectPascal)への組み込みを目的とした実装)
URLリンク(sourceforge.jp)

Tamarin (Adobe から Mozilla.org に寄贈された JIT 付きの仮想マシン。
コンパイラは含まれないので、ECMAScript のソースを直接実行することはできない。)
URLリンク(wiki.mozilla.org)

4:デフォルトの名無しさん
12/01/02 05:22:47.60
3の続き

KJS(KDEプロジェクトによって開発された実装)
URLリンク(api.kde.org)

JavaScriptCore(SafariのブラウザエンジンであるWebKitで採用されている実装で、KJSを元に改良されている)
URLリンク(trac.webkit.org)

Carakan(Opera Software ASAによって開発されOperaで採用されている実装)
URLリンク(my.opera.com)

V8(GoogleによるC++実装で、Google ChromeやNode.jsなどで採用されている)
URLリンク(code.google.com)

iv / lv5(日本人によって開発されているC++実装で、ES5.1準拠を謳う)
URLリンク(github.com)

5:デフォルトの名無しさん
12/01/02 05:23:15.54
4. - 関連スレ -
Web上におけるクライアントサイドスクリプティングに特化した実装(通称Javascript)については
WebPrograming板などの専門スレをご利用ください。

[Web製作板] + JavaScript の質問用スレッド vol.94 +
スレリンク(hp板)
[WebProg板] Ajaxでも語りませんか Rigel4
スレリンク(php板)
[プログラム板] JavaScriptスレ
スレリンク(tech板)

6:デフォルトの名無しさん
12/01/02 05:25:46.39
ここまでテンプレ
リンク切れの修正や実装の補足などをした

7:デフォルトの名無しさん
12/01/02 09:55:56.16
>>1
おつ

8:デフォルトの名無しさん
12/01/02 10:00:35.85
>>989
JSON2.jsでは普通に使われてる書き方だけどな。
まぁ一般的な書き方は(functionの方ではあるけどな。

>>996-998
今回書かれているbに対して、それらの書き方は構文的にもエラー。
しかしb = と代入式が書かれてる時点で括弧なしは構文エラーではなくなる。
つまり単独での実行を例にするのは間違ってる。


9:デフォルトの名無しさん
12/01/02 10:49:33.00
なんで右にもtestを付けるんですか?
var test = function test() {};

10:デフォルトの名無しさん
12/01/02 12:07:04.67
name で名前が取り出せるようになるから。

11:デフォルトの名無しさん
12/01/02 12:14:18.49
あ、それだけなんですか。デバッグの時に多少マシになる感じなんですね。

12:デフォルトの名無しさん
12/01/02 12:15:14.56
>>8
言語仕様を読んだこと無い奴がカドクセーとかほざいてるだけだから気にするな。

13:デフォルトの名無しさん
12/01/02 12:39:13.77
そういう流れいらないから

14:デフォルトの名無しさん
12/01/02 12:45:04.91
カッコを付ける習慣がある以上、納得できる理由を出さないと。ただの遠吠えになってるよ。

15:デフォルトの名無しさん
12/01/02 12:59:11.96
お前の習慣なんてしらねーよw

16:think49 ◆bKk/qcAKuM
12/01/02 19:52:15.67
>>前スレ997
ご指摘通り、記憶違いのようでした。お騒がせしました。

>>8
なるほど…。確かに代入演算子で右辺が式であることを保証している為、式文の規定にはとらわれないですね。納得です。
URLリンク(www2u.biglobe.ne.jp)

>>9
名前付き関数式は関数内のスコープに影響するので変数名を変更しても自身を参照できるようになります。

17:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/01/03 12:04:33.05
>>16
> 変数名を変更しても

「変数が別のものに束縛されても」と言いたいのかな?

19:デフォルトの名無しさん
12/01/03 13:43:44.69
ECMAScriptの規格に「束縛」なんて用語出てこないけど、何と勘違いしちゃってるの?

20:think49 ◆bKk/qcAKuM
12/01/03 15:09:33.38
>>18
「束縛」はわかりませんが、URLリンク(jsfiddle.net) の「名前付き関数式を利用するパターン」がそれです。
IE8- ではバグがあるので使えませんけどね…。
URLリンク(d.hatena.ne.jp)

後学の為に「束縛」を説明(もしくは参考URLの掲示)していただけると嬉しいです。
ぐぐって何となくは理解しましたが、「変数への代入 === 束縛」なのでしょうか。
この前提が正しいと仮定して、束縛することよりも元々の変数の名前で参照できなくなることが鍵のような気がします。

21:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/01/13 16:46:09.65
>>8
>JSON2.jsでは普通に使われてる書き方だけどな。

hoge = function(){}();

こういうのの話だよね?
無いぞ。どこだよ。

23:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/05 21:17:08.31
URLリンク(d.hatena.ne.jp)

ES.nextもstrawmanもキモくね?

25:デフォルトの名無しさん
12/02/06 00:49:49.89
Traitだけありゃいいのに最適化がうんたら

26:デフォルトの名無しさん
12/02/23 00:39:23.23
>>24
実行コンテキストがいちいち変わるのが理解出来ないからクラスベースの
構文糖用意したつもりなんだよ。妥協点がそこだったんだろ。

ところで関数が暗黙にthisプロパティを持たなくなったのは良かったが
Function.prototype.bind(cx,args...)で引数のLIST型書きかえれるようにしたのはやめて欲しかった。
Callオブジェクトを撲滅できない以上ここら辺は積極的に隠蔽すべきだと思うんだが。
__proto__プロパティがダメでObject.define*がいい理由も根拠がわからん。

27:デフォルトの名無しさん
12/03/07 21:34:12.90
__proto__がいいと思う理由は何?

28:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/03/08 23:46:27.29
newはprototypeのコピーであって参照じゃないっしょ

30:デフォルトの名無しさん
12/03/09 02:34:50.33
>>29
言われて本読みなおしてググってやっと理解できました。
ありがとうございます。

31:デフォルトの名無しさん
12/03/15 01:18:49.40
ECMAScript Language Specification ECMA-262 6th Edition - DRAFT
URLリンク(people.mozilla.org)

読みやすくてイイ!

32:デフォルトの名無しさん
12/03/24 17:13:23.76
JavaScriptではperlの
( $foo, $bar ) = split( /,/ );
みたいな書き方は出来ない?
(リストの左辺値)

33:デフォルトの名無しさん
12/03/24 17:13:59.06
>>32
すんません。ECMAScriptでした。

34:デフォルトの名無しさん
12/03/24 17:53:59.26
実装による
以上

35:デフォルトの名無しさん
12/03/24 20:34:52.67
>>34
仕様の話に実装で答えても…

36:デフォルトの名無しさん
12/03/24 20:38:43.62
ES5.1までの仕様にはないかな
6以降で入れるみたいな話しがちらほら
Fxはたしか実装してた気がする


37:デフォルトの名無しさん
12/03/25 00:11:46.03
FirefoxはJavaScript1.7で導入してて
URLリンク(developer.mozilla.org)
分割代入 (destructuring assignment) って名前がついてる

38:デフォルトの名無しさん
12/03/25 07:09:48.00
CoffeeScript使え

39:デフォルトの名無しさん
12/03/27 14:24:18.92
32です。ありがとうございました。
ってことは、配列の内容を個々に変数にバラすには
1個ずつ代入するしか方法がない、ってことでしょうかね。

40:デフォルトの名無しさん
12/03/27 15:40:12.32
だからFFでできるしCS使う手もあるっていってるじゃん


41:デフォルトの名無しさん
12/03/27 23:09:58.48
isnt演算子のセンスのなさ
isnt = is not = is!
でよかったじゃん

42:デフォルトの名無しさん
12/03/28 09:34:12.46
それは分かりづらいから無い

43:デフォルトの名無しさん
12/03/28 21:08:23.71
Dだと!is

44:営利利用に関するLR審議中@詳細は自治スレへ
12/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審議中@詳細は自治スレへ
12/03/29 09:42:07.10
CoffeeScriptはES3デスよ……

46:営利利用に関するLR審議中@詳細は自治スレへ
12/03/29 21:57:40.92
>>45
すんません。よく知りませんでした。
勉強します。

47:デフォルトの名無しさん
12/04/27 12:03:13.48
ところでes6のletとconstはふざけてんのアレ?

48:デフォルトの名無しさん
12/04/27 14:32:16.75
letはいろんな書き方できるから?
何がどうふざけてるか書いてくれないかな

49:デフォルトの名無しさん
12/04/27 22:41:57.09
そういう感性は俺にはなかった。
letもconstもプログラム言語にはあって然るべき機能だと思うけど。

50:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/04/28 09:54:55.97
ガチで長いぞw

54:デフォルトの名無しさん
12/04/28 17:45:52.49
>>50
長過ぎるのと意味が分からんところがあるけど
> このときtry-catchの変数だけは実装上varとは別のスロット集合に束縛してスコープが別になってる。
とりあえず、↑これはcatch内だけだね。

> letはブロック直下以外禁止なのでforの初期化子に
> 置けないから本末転倒になってる。これを回避するにはforをブロックで囲んでその直下にlet定義するしかない。
んなこたーない。仕様的にもちゃんと置けるよ。

他は後でつっこむ

55:デフォルトの名無しさん
12/04/28 18:55:45.44
>>50-52"をまとめると

ブロックはスコープじゃなくて唯の複文
letはスコープ作るために導入された
letはundefined valueで初期化されない
letでundefined valueで初期化されるよえに=undefined、=void(0)などと書くと最適化されにくくなる弊害がある

ってこと?

56:デフォルトの名無しさん
12/04/28 20:34:09.47
let文、let式がなければ

var foo = 0;
{ let foo = foo; alert(foo); }

とかではまるやつが出てくるのは目に見えてるしな

57:デフォルトの名無しさん
12/04/28 22:07:39.07
letは色んな事出来すぎるからだめなんだよなぁ
何であんなに色んな記法を作ったのか


58:デフォルトの名無しさん
12/04/29 01:30:12.11
>>51
> ほかにもconstは最適化のために初期化子必須になったんだけどこれは元々ある変数の初期化を伴わない定義の

constやletを初期化せずに宣言するのはバグの元だろ。どの言語でも言える事だけどローカル変数は
宣言と同時に絶対初期化するべき。

> 未初期化のconst

constは初期化必須って言っているのに、未初期化って矛盾してるぞ。その時はどんな値になってるんだ?
単純に未初期化のconstは、その時点で実行時エラーになる気がするが。


59:デフォルトの名無しさん
12/04/29 01:39:48.38
constもletもJavaScriptの構造を理解している人に取っては必要ないものだよ
他言語メインの人がなんとなく使うときにハマるからあった方がいいねってもの

60:デフォルトの名無しさん
12/04/29 01:40:25.53
const hoge;
hoge = "後から代入できちゃう";

ってことなんじゃねーの?
undefinedな定数にしたくて初期値省略してるのに、代入されたら台無しだよっていう

61:デフォルトの名無しさん
12/04/29 02:01:05.13
constな変数(定数)をundefinedにする意味は全くないと思うけど、単純に未定義
って事もあるから、どっちでもいいか。
constな変数は絶対に初期化しとけって事だな。


62:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/04/29 07:56:25.15
JavaScriptって、一見代入とかができたように見えて、実はできない、という
場合ってスルーしちゃうじゃない。昔から。

foo = "foo"
foo.bar = "baz"

alert(foo.bar) // undefined

64:デフォルトの名無しさん
12/04/29 08:00:51.12
何のためのstrict modeなんですかねえ

65:デフォルトの名無しさん
12/04/29 08:13:31.96
たとえばJavaだと、参照される前に確実に1回だけ初期化される変数は、
finalだけど初期値なし、にできるけどな。

要するにundefinedってのは、名前が未定義って意味じゃなくて、初期化されてない値
(unititializeとすべき?)って意味だから、「undefinedな定数」なんて無理だから、って
ことじゃね?

66:デフォルトの名無しさん
12/04/29 08:27:47.33
>>63
これは foo.bar にアクセスした時点で新たに String オブジェクトが生成されて
そっちの bar プロパティに代入してるだけだから、
代入が失敗しているわけではないと思う

67:デフォルトの名無しさん
12/04/29 13:19:34.99
>>66
イミフ

68:デフォルトの名無しさん
12/04/29 13:20:57.64
fxでも失敗するね
const hoge;
hoge = "aaaa"; // aaaa
hoge; // undefined

69:デフォルトの名無しさん
12/04/29 13:26:20.85
>>67
仕様書を読んでみるといい

70:デフォルトの名無しさん
12/04/29 13:41:28.54
6ドラフトの12.2.1 Let and Const Declarations
読んだけどわからん
そんなこと書いてあるかな?

71:デフォルトの名無しさん
12/04/29 14:11:35.11
すごくおおざっぱに説明すると、プリミティブに対してオブジェクトとして
アクセスしようとすると、オブジェクトが作られて、それに対してアクセスする、
というのが言語仕様。

だから、その作られたオブジェクトの属性として設定されるけど、そのオブジェクトに
アクセスする方法がないし、元の変数は元のプリミティブを指したままなので……
というのが >>63 で起きてること。

72:デフォルトの名無しさん
12/04/29 22:57:50.88
ゴミな仕様だな

73:デフォルトの名無しさん
12/04/30 12:10:26.90
普通に例外吐いて止まってくれるだけでだいぶ助かるんだが

74:デフォルトの名無しさん
12/04/30 13:06:49.34
strict mode + Object.sealed でおk

75:デフォルトの名無しさん
12/04/30 15:41:31.94
foo.bar()
みたいな明らかに一文が終了してるときもセミコロンいるやん。

if(foo)
a+b;

みたいなコード書くヤツのほうを撲滅しろよ。

76:デフォルトの名無しさん
12/04/30 16:27:47.76
波括弧を必須にするだけでよかったのにな

77:デフォルトの名無しさん
12/04/30 16:59:47.58
;の省略とかややこしくなるだけだからいらんわ

78:デフォルトの名無しさん
12/04/30 17:09:36.40
セミコロン省略はそこまで混乱しないだろ

79:デフォルトの名無しさん
12/04/30 18:12:22.52
多分シェルでも全ての行末にセミコロンを付けるような人なんだろう

80:デフォルトの名無しさん
12/04/30 21:28:42.23
セミコロン省略はあっていい
自分も付けるか気分と見やすさと必須性で決める
基本は全く無駄な物だから付けない

81:デフォルトの名無しさん
12/04/30 22:12:51.55
必要ないならなくなってるよ。必要だから残ってる。
httpを使うことを考えると無くせない。

82:デフォルトの名無しさん
12/05/01 07:52:42.83
俺は実際全くセミコロン付けないで書けている。よって必要ない。

改行せず一行に詰め込む時にだけ必要、という主張だね。

83:デフォルトの名無しさん
12/05/01 08:48:23.26
そんなことは言ってない
必要ないところで省略した方が逆に見栄えもよく感じられて
問題もないこともあるから省略できていいって言ってる
セミコロンは必要、だけど省略も必要
わかる?

84:デフォルトの名無しさん
12/05/01 08:57:11.06
省略したほうがいい場面ってどこだよ

array.filter(function(v) { return v % 2 == 0 });

みたいに関数本体が一文で済むところなら
セミコロンなしでもいいかなという気はするけど、
それ以外になんかあるか?

85:デフォルトの名無しさん
12/05/01 09:25:23.96
一律つけた方が法則がシンプルな分
見栄えもいいよ
セミコロンの場合実害が少ないからなくても困らないけど

86:デフォルトの名無しさん
12/05/01 09:46:43.49
メモ帳で長いコード書くとき
カッチリしたもう変更がないだろう機械的なコードはセミコロンで固めて
個性的な変更しまくりのふわふわしたコードには付けないな


87:デフォルトの名無しさん
12/05/01 09:49:49.99
>>84
いや、むしろそういうごちゃごちゃした1行には付けるべきだろ。

a=1
b=2+a
みたいなのには必要ない、もしくは、
a=1;b=2+a;
にする。

88:デフォルトの名無しさん
12/05/01 09:54:58.57
>>86
こーいう、背後に哲学が感じられる使い分けが
コードから読み取れれば問題ない

無分別に一貫性なくつけたりつけなかったり
は醜いし読みにくい。
考えなさっぽさが滲みでてみっともないし。

89:デフォルトの名無しさん
12/05/01 10:28:52.18
スマホで作ってるとセミコロン付ける付けないとインデントはかなり悩む

それはそうとMathやStringが拡張される話で今盛り上がってるのは個人的にもありがたいんだけど

数の進数やbit数に関しての拡張と現在milli秒で扱ってる範囲ををmicro秒にして欲しいんだけど
そういう話は挙がってないの?

90:デフォルトの名無しさん
12/05/01 11:54:26.69
なんでもかんでもマイクロ秒管理したら
既存APIが遅くなるんでねーの?

91:デフォルトの名無しさん
12/05/01 12:18:42.55
OSから取得するナノ秒までで約60bit
マイクロ秒までで約50bit
ミリ秒までで約40bit

全部64bit整数使ってるだろうから変わりないのでは?

92:デフォルトの名無しさん
12/05/01 14:11:47.69
非力な組み込みでもecmascript使うんだから標準で仕様化したらだめだ。

93:デフォルトの名無しさん
12/05/01 14:45:30.95
非力というか万が一タイマーがサポートしてないのなら0埋めで返せばいいだけじゃない?
スクロールとか描画なんかの演算とタイマー設定をもう少し正確にやりたいだけでしょ?
まあディスプレイ付きのデバイスなら今時間違いなくマイクロ秒まではサポートしてるタイマー使ってるはずだけど

94:デフォルトの名無しさん
12/05/01 18:40:05.14
セミコロン問題は、一応プラグマのopen issueのままです。
URLリンク(wiki.ecmascript.org)

95:デフォルトの名無しさん
12/05/02 00:11:18.62
>>93
だから、ECMAScriptなんつー総本山規格じゃなくて、ディスプレイ付デバイスで動かすような実装のレベルで
何とかしてよってのが>>92なんじゃねーの。

96:デフォルトの名無しさん
12/05/02 05:02:25.84
マイクロ秒単位のタイマは、むしろ非力な組み込みでの需要の方が大きいんじゃねーの
なんにせよ非リアルタイムな環境でのマイクロ秒タイマは
信用ならない精度になるだろ

そういう話をするとしたらQueryPerformanceCounter的な高精度カウンタを新設して
自前でポーリングしれって感じになるんじゃねえかな

97:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/05/03 08:34:31.35
>>97
Function#bind を活用してみてください。

99:デフォルトの名無しさん
12/05/03 09:00:22.22
>>98
それじゃ無理だろ。
そもそもbindさせるオブジェクトを
これから作ろうって話な訳だし。
evalして無理やりパースするくらいじゃね?

100:デフォルトの名無しさん
12/05/03 11:47:48.86
>>97
もともとそのコンストラクタをどう使うつもりなのか

101:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/05/03 14:19:49.87
それじゃapplyNewの戻り値が関数になるし[2,3]がインスタンスにバインドされない。
隠蔽したいのはCのvar c=0だけだと思う。

104:デフォルトの名無しさん
12/05/03 14:32:30.10
いい忘れた。
a2.push.apply(a2, args)じゃなくてArray.prototype.push.apply(a2, args)じゃね?

105:デフォルトの名無しさん
12/05/03 15:32:29.16
>>100
基本的には「コンストラクタを呼び出す時に
apply的な呼び出しは可能なのか」ということ。
限定的な使い方ではなくクロージャとかになっていても
問題ないような記法が自分では見つけられなかった。

あるコンストラクタのユーティリティ関数を作るときに
関数内からコンストラクタを呼び出す際、
引数の数が一定じゃない場合などは配列で渡せるとシンプルだなと思ったので。

強引な代替案なら思い付くんだけど
ハッとするようなスマートな記法をお持ちの方がいたら
勉強になるなと思ったですw


106:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/05/03 17:54:48.87
言っておくが >>102 でできるからな。

108:デフォルトの名無しさん
12/05/03 20:53:52.00
>>107
jqueryとかのbindメソッドじゃダメだよね?
現時点で実装してる処理系ってFirefoxくらい?

109:デフォルトの名無しさん
12/05/03 21:15:07.89
ES5だからIE9以上を含む全てじゃね?
IEはしらんがFxやらGoogleChromeやらOperaは実装済のはず

110:97
12/05/03 23:41:34.06
>>102
ありがとう!
勉強になったよ
pushの結合もオレには新しかったw
concatより早いんかな
あとで調べてみようっと

111:デフォルトの名無しさん
12/05/04 11:32:46.04
形だけなら別に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)


112:デフォルトの名無しさん
12/05/04 13:43:47.26
__proto__使わずに同じ事する懐かしの方法だな。

>>105はnew(C.apply(...))の形式が取りたいって最初の要件は良かったのか?

113:デフォルトの名無しさん
12/05/04 13:45:14.01
最初の要件かそもそも、不明確なので

114:デフォルトの名無しさん
12/05/04 15:36:13.38
>>112
実引数に配列を渡したいだけかと思ってたが。

115:デフォルトの名無しさん
12/05/04 15:47:45.81
>コンストラクタを呼び出すとき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

116:デフォルトの名無しさん
12/05/04 16:43:37.62
>>115
そうか、>>111は忘れてくれw

117:デフォルトの名無しさん
12/05/23 01:38:00.11
ECMAからES5.1仕様書のHTML版公開
URLリンク(ecma-international.org)

118:デフォルトの名無しさん
12/05/23 11:26:27.98
素晴らしい。

119:デフォルトの名無しさん
12/06/04 06:55:06.70
お兄ちゃん、感心しているだけじゃなくてちゃんと読まないとダメだよ?

120:デフォルトの名無しさん
12/06/04 16:23:57.05
あー毒舌な妹がこんなところにまで

121:デフォルトの名無しさん
12/06/10 04:12:22.56
なあお前ら。
関数が結合されるのがヤダヤダ!って場合は__parent__の代わりにbind使えばいいが__proto__はどうするよ?
あと自己反映のときのcalleeとか。harmonyにProxyがあるのにcalleeがダメな理由てなんだ?

122:デフォルトの名無しさん
12/06/10 11:15:47.27
>>121
__proto__のgetterはObject.getPrototypeOf、setterはObject.createである程度代用できる
arguments.calleeについてはURLリンク(togetter.com) が参考になる

123:デフォルトの名無しさん
12/06/11 07:47:35.23
>>122
そこ色々間違ってるから鵜呑みにしないほうがいいぞ。

124:デフォルトの名無しさん
12/06/11 10:30:16.63
>>123
どこがどう間違っているのか分からないとあなたの情報を鵜呑みに出来ない

125:デフォルトの名無しさん
12/06/11 10:30:27.73
>>123
ご指摘ありがとう
よろしければ、より参考になる資料を示して頂けると嬉しい

126:デフォルトの名無しさん
12/06/14 17:49:57.32
古い情報も相当残ってるけどwiki.ecmascript.orgが確実。

127:デフォルトの名無しさん
12/06/14 18:28:36.68
>>126
古い情報が相当残っているのに確実とする理屈がわからない
結局、どこが間違っているかも言及なしだしあてにはできないなー

128:デフォルトの名無しさん
12/06/15 08:25:24.62
書いた本人は分かってるんだろうけど書き方がイマイチだから読む人がちゃんと分からないのではってことかな?

いずれにしろ1つのサイトだけあてにするのはダメ


129:デフォルトの名無しさん
12/07/01 15:23:04.66
URLリンク(wiki.ecmascript.org)
>removed <| and TriangleLiterals
これだからTC-39はダメなんだ!

130:デフォルトの名無しさん
12/07/01 16:24:38.17
そらそうよwww
これでもう復活はないなw 嫌いじゃないけどちょっと無理がありすぎたんだw

131:デフォルトの名無しさん
12/07/02 11:09:20.07
ダメなところを改善したいBrendan EichといじりたくないTC39の戦いはまだまだつづく!

132:デフォルトの名無しさん
12/07/02 13:59:41.98
AS3が一番とばっちりだよな。
先走りすぎたせいでJS2とも別モンになっちまったしhaXeの方がJS2に近いくらいだわ。

133:デフォルトの名無しさん
12/07/02 14:57:01.97
Q. JS2とは?

134:デフォルトの名無しさん
12/07/02 16:48:46.88
ActionScript3は、少し先走りすぎだったし、
Mozillaに提供した実装Tamarinのコードの質が悪く、
仕様の安易な部分と合わせて、反対派を団結させてしまったね。
結局Mozilla.orgでもTamarinを利用するTraceMonkeyプロジェクトはなくなったし。
ECMAScript 4で議論された機能については、議論継続中だからいいんだけども。

135:デフォルトの名無しさん
12/07/02 17:20:57.92
議論継続中て言ったてこれだろ?

>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というのを少しでも認識させたのが唯一の功績だよ。

136:デフォルトの名無しさん
12/07/06 16:22:49.91
ECMAScript 4に戻ってやり直すのが皆一番幸せになるわ

137:デフォルトの名無しさん
12/07/06 16:26:33.37
つか明らかにJavaScriptの土管化が進行中な件
ウェブのC言語と言えば聞こえはいいが、要は誰も直で書きたがらないってことだからな。
そういう用途に応えるためにLLJSとか開き直ったものも出してきてるしw

138:デフォルトの名無しさん
12/07/06 16:31:52.47
そして
問題点1:土管としては低効率
問題点2:土管が土管化を嫌がっていらんことするリスク

139:デフォルトの名無しさん
12/07/07 01:50:08.30
それって土管って表現するの?

140:デフォルトの名無しさん
12/07/07 09:45:23.03
6の仕様を見ていると結構いい感じだな。早いとこ普及してほしいよ。一応仕様のリリースは来年らしいけど。

141:デフォルトの名無しさん
12/09/10 09:02:29.57
>JavaScriptの土管化
>JavaScriptの土管化
>JavaScriptの土管化
>JavaScriptの土管化
>JavaScriptの土管化
>JavaScriptの土管化
>JavaScriptの土管化
>JavaScriptの土管化
>JavaScriptの土管化

142:デフォルトの名無しさん
12/09/27 00:40:57.35
ECMAScript6にいつのまにかclassが追加されててワロタw
どうやら6/15のDraftに追加されたようだ。
さがしたら>>135で話題になってたけど、言ってる意味がわからん。。
ちょっと勉強するか。

143:デフォルトの名無しさん
12/09/27 01:36:15.53
しかし仕様書を見てもよくわからんな。。
もう少し土管化するまで待つか

144:デフォルトの名無しさん
12/09/27 08:05:08.60
土管化が何を指してるのかさっぱりだ

145:デフォルトの名無しさん
12/10/01 02:35:37.39
URLリンク(www.slideshare.net)
URLリンク(constellation.github.com)

この辺りを見てclassについてある程度理解出来た。
単なるシンタックスシュガーなんだな。それで十分だ。

それにしても、モジュールの機能が無いみたいだけどそれ以外は普通にモダンな
スクリプト言語になっちゃうね。

146:デフォルトの名無しさん
12/10/01 12:03:59.01
言語設計は最初からモダンだけどな。
ライブラリ設計は古かったけど。(殆ど無いに等しいし)

147:デフォルトの名無しさん
12/10/14 16:38:50.03
ECMAScriptの最新 = TypeScriptなの?

148:デフォルトの名無しさん
12/10/15 00:05:30.16
私も興味があります
現在策定中のECMAScriptとTypeScriptの相違はどの程度なのでしょうか?

149:デフォルトの名無しさん
12/10/15 00:19:27.67
マージされることがあるとしても、バージョン二つくらい後だろ。
クラス仕様については、ECMAScriptとほぼ同じ機能になってるな。
違いは組み込みかライブラリ化の違いくらい。

150:デフォルトの名無しさん
12/10/15 17:18:28.74
>>149
ありがとうございます
そうなると、あと10年位掛かりそうな・・・

オプショナルな静的型付けとかジェネリックとか、次の仕様に取り込まれないかな

151:デフォルトの名無しさん
12/10/15 17:47:41.70
ECMAScript4の失敗を忘れたのか?
そこまでやるならいっそ新しい言語にしてくれたほうがマシ
糞みたいな互換性やら名前やらとはさっさとおさらばしたいぜ

152:デフォルトの名無しさん
12/10/15 20:19:01.64
ECMAScript4の失敗についてはよく知らないけど
TypeScriptはJavaScriptの上位互換だよ
TypeScriptのように、既存のJavaScriptが動くように仕様を拡張したら問題ないのでは?

153:デフォルトの名無しさん
12/10/15 20:43:43.76
ECMAScript4の失敗
URLリンク(ja.wikipedia.org)
URLリンク(developers.slashdot.jp)
URLリンク(news.mynavi.jp)

154:デフォルトの名無しさん
12/10/15 22:08:55.95
>>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の仕様を拡張してほしいというのが、私の考え。

155:デフォルトの名無しさん
12/10/15 22:58:57.10
MicrosoftはMicrosoftで思惑あったと思うが、
・AdobeがActionScriptをECMAScript4にしようとしていた。
・既に広く広まったECMAScript3との互換性の問題が軽視。
古いコードをどうやって実行するのか議論が深まらないまま。
・ECMAScript4の新機能の多くがActionScriptをコピーしただけで、
入れることの是非、設計詳細部の議論が深まらないまま。
・ActionScriptの機能の多くが実装者の思いつきで設計。(Adobeの公開MLに残ってる)
・参照実装であるtamarinのコードの質の低さ。
というわけでストップになった。
ただしECMAScript4で導入されそうになった機能は捨てられたわけでなく、
多くは議論を深めてから入れる方向で考えられている。
Webの現状を考えると時間をかけるのが妥当と判断された。
それはBrandenの声明にもはっきり書かれている。

156:デフォルトの名無しさん
12/10/15 23:48:22.01
>>155
ActionScriptはECMAScript 4を元に作られたと思っていたのですが、
実際は逆で、ActionScriptを元にECMAScript 4の仕様を決めようとしていたということでしょうか?
ECMAScript 4は2回決裂しているようなので、そこらへんの前後関係は良く分かりませんが、
少なくとも2回目の決裂に関しては、Adobeの強引さとActionScriptの出来が問題になったということですかね。

ECMAScript 6に関してはしっかり議論して合意に達してほしいですね。
便利な機能が入ることを期待しつつ、時間が掛かることをもどかしく思ったりしつつ、
末端プログラマとして、仕様策定者に期待したいです。

157:デフォルトの名無しさん
12/10/16 08:10:49.32
>実際は逆で、ActionScriptを元にECMAScript 4の仕様を決めようとしていたということでしょうか?
ドラフトを先走って実装しただけ

158:デフォルトの名無しさん
12/10/18 19:10:41.39
>>154
前半の陰謀論はまったく要らないな

159:デフォルトの名無しさん
12/10/19 21:05:59.32
JavaScriptの未来?
URLリンク(brendaneich.github.com)

160:デフォルトの名無しさん
12/10/19 21:13:28.34
>>159
ちなみにBrendan Eichのスライド

161:デフォルトの名無しさん
12/10/19 21:25:10.17
Brendan Eich @BrazilJS 2012 - The State of JavaScript
URLリンク(www.youtube.com)

162:デフォルトの名無しさん
12/10/20 00:54:46.78
typescript出たばかりなのに、No Classかよw



最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch