Array.map()はSafariにはないのでより素直な別解。

IT戦記 - JavaScript のワンライナーでカラーコード
'#' + [76, 84, 105].map(function(i){ return (i >> 4 ? '' : 0) + i.toString(16) }).join('')
 (function(r,g,b){return '#' + (16777216+r*65536+g*256+b).toString(16).substr(1)})(0,127,255)

それにしても、なんでJavaScriptにはString.sprintf()がないんだろ。ぐぐると実装はいくつか出てくるんだけどね。sprintf()があれば、

sprintf("#02x02x02x", $r, $g, $b); # perlでの例

ですむのに。

追記: でばっぐさんくす>amachang

// previous and buggy version 
(function(r,g,b){return '#' + (r < 16 ? 0:'') + (r*65536+g*256+b).toString(16)})(15, 127, 255) 

このように r が 0 だとおかしくなりませんか?

別解

(function(r,g,b){return ((1<<24)+(r<<16)+(g<<8)+b).toString(16).replace(/^1/,'#')})(0, 1, 1)

さすが。これなら無条件に0 fillが行われる。

Dan the JavaScripter