読者です 読者をやめる 読者になる 読者になる

以下斜め読んだ内容

pseudo translation of useful posts, book reviews, remarks,etc. twitter: feeddict

Andrea Giammarchi「32 bytes, ehr ... 9, to know if your browser is IE」

斜め読み

Web Reflectionの2009.1.29のブログエントリ

Web Reflection: 32 bytes, ehr ... 9, ehr ... 7!!! to know if your browser is IE

「32バイトの文字列でIE判定できるコード書いたよ」と書いたらコメント欄のやりとりの中であれよあれよという内に、7バイトにまで短くなってしまったというブログエントリで、何度かUpdateされてる。
navigator.userAgentプロパティもIE独自のプロパティ(ex.document.uniqueID)も使わず、より少ないバイト数でIEを判定できるコードを紹介・解説するという趣旨のエントリ
3段階紹介されて、段階が上がるごとにバイト数がどんどん短くなる。

  • レベル1:32バイト
  • レベル2:13バイト
  • レベル3:9バイト
レベル1:32バイト

既知ものと比べるとそんなに短くない。

try{IE=window=!1}catch(e){IE=!0}

レベル2:13バイト

コメント欄に登場したGareth Heyesの発案

if("\v"=="v")

このアイディアの核は、IE(というかJScript)がメタ文字「\v」を「v」と解釈する点にある。

レベル3:9バイト

Gareth Heyesのアイディアを更にoxotnickが短縮させたもの
演算子「+」はまず算術演算子として解釈され、被演算子オペランド)2項がともに文字列である場合のみ文字列演算子である点を利用してる。

if(!+"\v1")

  • IE以外では「!+"\v1"」は「!(+1)」と解釈される。falseを返す。
    • \vは改行と解釈されるので、その有無で意味が変わらなくなる。
  • IEでは「!(+"v1")と解釈され、trueを返す。
    • 「+"v1"」の「+」は算術演算子としてしか解釈されないので「(+"v1")」NaNを返す
    • NaNの否定なので、trueが返る

補足1。JScriptでメタ文字\vがサポートされないのは仕様

ECMAScriptWIKIに「JScript Deviations from ES3」と題された文書がアップされて、その中に「\vはサポートしない」「\vはvだ」と書かれてる。

2.1 White Space: §7.2
JScript does not support the \v vertical tab character as a white space character. It treats \v as v.
JScript Deviations from ES3

補足2。2007年にDean Edwardsが作った17バイトのバージョン

if(/*@cc_on!@*/false)
Dean Edwards: Sniff!

ただしMS独自の条件付コンパイル(conditional compile)を使ったコード

補足3。object detectionを使っても17バイトまで切り詰め可能

17バイト

if(document.UniqueID)

18バイト

if(document.selection)