Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Если не приводить тип, можно наткнуться на какую-нибудь весёлую особенность.
Скажем, "2"*"2" будет 4, а "2"+"2" -- "22". Какой-нибудь Math.exp преобразует строку к числу сам, а пользовательская функция может и набедокурить.
Кстати, безумное +a; +b; можно действительно использовать как assert для пользовательских значений:
function StrictValue(v) {
this.value = v;
}
StrictValue.prototype.valueOf = function(){
if(typeof this.value === 'object')
throw new Error(':(');
return +this.value;
};
var a = new StrictValue(2);
var b = new StrictValue({});
+a;
console.log('lol'); // lol
+b; // Error: :(
console.log('lol');
Я хотел сделать упор на императивность происходящего.
Как возможный вариант рассматривал что-то такое:
function Killer(kill) {
this.kill = Boolean(kill);
}
Killer.prototype.valueOf = function(){
if(this.kill) throw new Error;
};
var a = new Killer(false), b = new Killer(true);
+a; +b;
Но так и не придумал, как такое может пригодиться, отчего пришёл к предварительной проверке.
Наверно надо как-то так:
// Императивный питух
function Assert(expr) {
this.expr = expr;
}
Assert.prototype.valueOf = function() {
if(!this.expr()) throw new Error;
}
// пример использования
var OK = [true];
var assertOK = new Assert(function(){ return OK[0] === true; });
function maybeSqrt(x, res) {
if(x < 0) {
res[0] = false;
return;
}
res[0] = true;
return Math.sqrt(x);
}
+assertOK;
var s = 0;
for(var i=0; i<10; ++i) {
var x = Math.random() - 0.3;
var y = maybeSqrt(x, OK);
+assertOK;
s += y;
console.log(x, y, s);
}
console.log('S = ' + s);
Што?
Скажем, "2"*"2" будет 4, а "2"+"2" -- "22". Какой-нибудь Math.exp преобразует строку к числу сам, а пользовательская функция может и набедокурить.
Ничего, всегда есть тот кто с помойки этот мусор подберёт. И я говорю конечно же о gc.
Как возможный вариант рассматривал что-то такое:
Но так и не придумал, как такое может пригодиться, отчего пришёл к предварительной проверке.
Наверно надо как-то так: