The Tale of JavaScript, The Future of ECMAScript

os0x(Shogo Ohta), 2010-11-15

Profile

Theme

JavaScript

JavaScriptとは

つまり…

本来ならJavaScriptとはNetscape、そしてMozillaのECMAScript実装を指す

JavaScript?

if(true) {
  function someFunc(){
    return 1;
  };
} else {
  function someFunc(){
    return 2;
  };
}
var notSomeFunc = function someFunc(){
  return 3;
};
alert(someFunc());// 1 or 2 or 3 ?

Firefoxは1、Opera・Safari・Chromeは2、IE6-8は3になる

JavaScript??

function F,F.prototype.f(n){
  return n;
}
alert(new F().f('hoge'));
Enhanced Scripting in IE9: ECMAScript 5 Support and More - IEBlog - Site Home - MSDN Blogs

JavaScript???

var a = #1={a:#1#};
alert(a.a.a.a.a.a.a.a.a.a.a.a);

???㡼???ѿ?(sharp variables)

循環参照を表現できるFirefoxの独自拡張。JSONでは表現できないデータを表現できて便利。

JavaScript?!

JavaScript 1.7 の新機能 - MDC
JavaScript 1.8 の新機能 - MDC

JavaScript!!?

標準さんはどこにいったの><!?

ECMAScript!

Standard ECMA-262

ECMAScript5

Objectにメソッドが増えた!

Object.
	create
	defineProperties
	defineProperty
	freeze
	getOwnPropertyDescriptor
	getOwnPropertyNames
	getPrototypeOf
	isExtensible
	isFrozen
	isSealed
	keys
	preventExtensions
	seal

あれ、JavaScriptはprototypeによるオブジェクト指向言語でしたよね?

prototypeはどこに行った?

prototype 汚染問題

var hash = {};
var some_strings = document.body.textContent.split(/\W/);
some_strings.forEach(function(str){
  if(hash[str]) {
    hash[str]++;
  } else {
    hash[str] = 1;
  }
});
console.log(hash);

一見問題なさそうなコードだが、 toString や valueOf などのプロパティが壊れてしまう

最速インターフェース研究会 :: JavaScriptで出現回数のカウントをする際のコードやJavaScript:The Good Partsで触れられている

prototype 汚染問題の残念な回避策

__proto__
__defineGetter__
__defineSetter__
__lookupGetter__
__lookupSetter__
__noSuchMethod__

今までは __ を接頭辞、接尾辞にすることで衝突を避けてきた…

当然これらは標準ではない(IE9はこれらを実装しなかった)

バッドノウハウ!!!

それ故のObjectにメソッド追加…

prototype 汚染回避

var hash = Object.create(null);
// __proto__を持たない、つまり
// toStringも valueOfも持たないオブジェクトを作る
var some_strings = document.body.textContent.split(/\W/);
some_strings.forEach(function(str){
  if(hash[str]) {
    hash[str]++;
  } else {
    hash[str] = 1;
  }
});
console.log(Object.keys(hash));

私たちはより良い改善を望んでいる…

そう、ECMAScript6に!

Proxies!

ECMAScript6候補(既にFirefox4で実装されている)

var p = Proxy.create({
  get: function(proxy, name) {
    return 'Hello, '+ name;
  }
});
console.log(p.World); // 'Hello, World'

var obj = {};
var prox1 = (function(obj){
  return Proxy.create({
    get:function(receiver, k){
      return obj[k];
    },
    set:function(receiver, k, v){
      obj[k] = v;
    }
  });
})(obj);
prox1.hoge = 1;
console.log(obj.hoge);

harmony:proxies [ES Wiki]

Proxy Tutorial

noSuchMethodみたいなの

function noSuchMethod(proto, noSuchMethod) {
  var handler = {
    get:function(rcvr, p) {
      return proto.hasOwnProperty(p) ? proto[p] : function() {
        var args = [].slice.call(arguments, 0);
        return noSuchMethod.call(this, p, args);
      };
    }
  };
  return Proxy.create(handler, proto);
}
var Parent = {
  hoge:function(){
    return "i'm hoge";
  }
};
var prox = noSuchMethod(Parent, function(id, args){
  return '// noSuchMethod! ' + id + ':'+ args;
});
console.log(prox.hoge());
console.log(prox.fuga());

ほかにもES5の範囲ではStrict ModeやObject.freezeなど、

ES6候補ではさらに色々な案が出ていて、

JavaScriptで大規模開発がやり易いように進化している!

「でも、JavaScriptって遅いよね!?」

いやいや、最近のJavaScriptエンジンは速いですよ!しかも

Typed Array!

WebGL由来で

がChrome devやFirefox4.0 betaに実装されている

Chrome 9.0.576.0において、単純なforループが10倍高速になる

bench(new Array(1000000));
if(this.Uint8Array)
  bench(new Uint8Array(1000000));
function bench(r){
  var s = Date.now();
  for(var i = 0, l = r.length;i < l; i++){
    r[i]=i%256;
  }
  document.write(Date.now()-s + '<br>');
}

3つのFileAPI

FileAPIは3種類ある

最近ChromeでDirectories and Systemが(ほぼ)実装された。

File API: Directories and System

ブラウザ内に仮想的なファイルシステムを作り、ディレクトリを切ってファイルを保存できるAPI

画像、音声、動画をウェブアプリから手軽に扱えるようになる

つまり、ウェブアプリが本当にデスクトップアプリを超える

デバッグ環境

Web Inspector

Chromeではデベロッパーツールという名前

いわゆるFirebug

特集:Google Chrome版Firebug:デベロッパーツール取扱説明書|gihyo.jp … 技術評論社

HTML5関連API

グラフィック系
  • canvas
  • SVG(インラインSVGはChrome7から)
  • video, audio
  • Web Fonts
  • WebGL
データ系
  • Web Storage
  • Web SQL Database(標準化は停止)
  • Indexed Database API
通信系
  • postMessage
  • Web Sockets
  • XMLHttpRequest Level 2
  • ServerSentEvent
その他
  • Web Workers
  • Geolocation API
  • HTML Forms
  • Application Cache
  • File API
  • Drag & drop
  • Desktop notifications
  • Web Timing

後はテスト…

RequireJS と Envjs に期待

ウェブアプリの大航海時代はもう目前