The features that do not introduce new keywords (destructuring assignment and array comprehensions) can be used without specifying the JavaScript version.
New in JavaScript 1.7 - MDC
今さらな話だけど、yieldキーワードとletキーワードを使わなければ、Firefox2でも何の断りもなしに1.7の配列内包・分割代入が使えることを知った。
てっきりFirefox3からだと思ってたので使ってなかったのだけど、そもそも気にする必要がなかったんですね……
というわけで、使えそうなコードのメモ。
分割代入・値の交換
var [a,b]=[4,9]; [b,a]=[a,b]; console.log([a,b]); // -> [9, 4]
プロパティの部分取得
ObjectからObject?への分割代入 - 0x廃棄階層 - 統治局
window.addEventListener("click", function(e){
var {pageX: x, pageY: y} = e;
console.log([x, y]);
this.removeEventListener("click", arguments.callee, false);
}, false);
(click) // -> [289, 115]
parseurl
DOM:window.location - MDC # Location object - Properties
const SAMPLE_URL = "http://www.google.com:80/search?q=devmo#test"; const RE_URL = /^([a-z]+:)\/\/(([\u0021-\u007e]+?)(?:\:(\d+))?)(\/[\u0021-\u007e]*?)(\?[\u0021-\u007e]+?)?(#[\u0021-\u007e]+)?$/; var [href, protocol, host, hostname, port, pathname, search, hash] = SAMPLE_URL.match(RE_URL); [href, protocol, host, hostname, port, pathname, search, hash] // -> ["http://www.google.com:80/search?q=devmo#test", "http:", "www.google.com:80", "www.google.com", "80", "/search", "?q=devmo", "#test"]
正規表現はRFCに従った厳密なものではありません。手抜きです。
せめて非ASCII文字にはマッチしないようにちょっと修正。
配列内包
var range = function(start, end){
var o = {};
for (var i=start; i<end; i++) o[i] = i;
return o;
};
[i*i for each (i in range(0,10))]
// -> [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
range関数はジェネレータ(yieldキーワード)が使えないので、普通のオブジェクトで代用していますが、一般にfor/for each ~ in文において参照される順序は不定なのでちょっと微妙。
この場合は数値順にプロパティを与えているのでうまくいくようですが……
ハッシュから配列への変換
逆に言えば順序が不定でも問題なければ良いわけで、ハッシュから最も値の大きいキーを調べるコードは次のように書ける。
var o = {
a: 5,
b: 7,
c: 0,
d: 2,
e: 9,
f: 3,
};
[[i, o[i]] for (i in o)].sort(function(a,b){return b[1]-a[1];})[0][0]
// -> "e"
これがFirefox2やGreasemonkey上でも問題なく動くというところが新発見。
