正規表現を明記せず、RegExp#exec を String#split にするとちょっとハッピーに

JavaScript の小ネタです。

UserAgent 文字列(window.navigator.userAgent)

"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.814.0 Safari/535.1"

から、Windowsのバージョン(6.1)を取り出すようなコードをよく見かけますね。

ちょっと前の私は RegExp#exec + parseFloat で、こんな(↓)感じにしていたり、

function getWindowsVersion() {
    var m = /Windows NT (\d+(\.\d+)?)/.exec(navigator.userAgent);

    if (m) {
        return parseFloat(m[1]);
    }
    return 0;
}

こんな(↓)感じにワンライナーにしちゃってましたが、

var version = parseFloat((/Windows NT (\d+(\.\d+)?)/.exec(navigator.userAgent) || [,0])[1]);

最近は、String#split + parseFloat で、もっとシンプルにしてるよ!

var version = parseFloat(navigator.userAgent.split("Windows NT")[1]) || 0;

正規表現やめちゃって文字列に。
切り出した文字列に含まれる空白は parseFloat(" 6.1") → 6.1 って感じにトリミングされるので、parseFloat にお任せしてます。

正規表現を明記しないことで、こんなにいいことが! 的なオマケ

IE10 からは、UserAgent に埋まっている Version 番号が二桁になりますね。

"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)" 

ブラウザのバージョン番号が二桁になるシーズンになると、各ブラウザベンダーのブログ(過去においてはIEOpera のブログ)(おそらくは来年の Firefox のブログ)には、
「バージョン番号の取得に /MSIE (\d\.\d)/ のような一桁の数字しか取得できないコードが埋まってると、間違ったバージョンが取得されちゃうかもしれない…」なエントリが乗ったりするのですが、

String#split() + parseFloat で取得するようにすれば、いいんじゃないかな!? って思います!

Opera の userAgent に謎の Version番号(9.80) が埋まってるのも、これ(↑)が理由なんだよね
"Opera/9.80 (Windows NT 6.1; U; ja) Presto/2.9.168 Version/11.50"