あなたの知らないECMAScript

自己紹介

「ECMAScriptって知ってますか?」

ECMAScriptとは

ざっくり「ECMAScript == JavaScript」

「あなたの知らないECMAScript」
その1

ECMAScriptにもラベルがあるのはご存知ですか?

こんなの
hoge:
while (true) {
	while (true) {
		break hoge;
	}
}

が、実際にはそんなに使われない

(イテレータと相性悪いから)

しかし、このラベルがあることでこんなコードが動く

<script>
javascript:alert('ECMAScript valid');
</script>
ブックマークレットをそのまま貼り付けた時とか

さらに、こんなコードも

http://events.html5j.org/conference/2012/09/
function hoge () {
	alert('ECMAScript valid');
}
URLそのまま貼っちゃった!

ラベルのお陰で偶然動いているサイトは多い

「Webを影で支えるラベル」

「あなたの知らないECMAScript」
その2

「Perl, Ruby, Pythonにあって、C, Pascal, ECMAScriptに無いものなーんだ」

答え

「文法上独立したelse if」

ECMAScriptにelse ifは無い

「でもelse ifって普通に使うじゃん!」

こんなかんじで
if (false) {
	alert('if');
} else if (true) {
	alert('else if');
} else {
	alert('else');
}

「それはblockの省略されたelseでelse ifという文法ではないです」

これの省略形
if (false) {
	alert('if');
} else {
	if (true) {
		alert('else if');
	} else {
		alert('else');
	}
}

「else ifなんていらなかったんだ!」

「あなたの知らないECMAScript」
その3

ECMAScriptの静的解析をしようとした人が全員ハマるところ

「/が正規表現の開始か演算子か区別できない問題」

正規表現リテラルなのか/演算子なのか簡単に区別できない
var hoge = 10 / 3 / 1;

しかし、ECMAScript5ではこんなルールが追加されてさらに大きな問題が

「正規表現中の[]内では/のエスケープ不要」

こう書ける
var regexp = /[/]/;

つまりこんなコードが実行できる

var hoge = /[/*]/; var huga = /[*/]/;
ECMAScript5 valid!

ブロックコメントの切り出しすら簡単にできない

「/*このなか*/はブロックコメントとは限りません」

「/*このなか*/はブロックコメントとは限りません」

(ECMAScriptの静的解析にはEsprimaを使いましょう)

ご清聴ありがとうございました!

KAYACではECMAScriptを知ってる技術者も募集しています!