Добавил вариант с рекурсией. Чисто для образования, так как он намнооого дольше 
(function() {
function test1() {
	for (var i=0; i<1000000; i++) {
		if (/2/.test(i)) {
			//console.log(i);
		}
	}
}
function test2() {
	function containsDigit(number, digit) {
		while (number > 0) {
			if (number % 10 == digit)
				return true;
			number = (number/10)|0;
		}
		return false;
	}
	for (var i=0; i<1000000; i++) {
		if (containsDigit(i, 2)) {
			//console.log(i);
		}
	}
}
function test3() {
	function containsDigit(number, digit) {
		if (number == 0) return false;
		if (number % 10 == digit) return true;
		containsDigit((number/10)|0, digit);
	}
	for (var i=0; i<1000000; i++) {
		if (containsDigit(i, 2)) {
			//console.log(i);
		}
	}
}
var t1 = Date.now();
test1();
t1 = Date.now() - t1;
var t2 = Date.now();
test2();
t2 = Date.now() - t2;
var t3 = Date.now();
test3();
t3 = Date.now() - t3;
alert("test1: " + t1 + ", test2: " + t2 +", test3: " + t3);
})();
P.S. У меня в файрфоксе вариант Рони быстрее - test1: 423, test2: 530, test3: 2131.