あなたの知らないECMAScript
「ECMAScriptって知ってますか?」
ECMAScriptとは
- ECMAScript == 仕様
- JavaScript == 実装
ざっくり「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を使いましょう)
ご清聴ありがとうございました!