YUI.Lang is buggy?
Сижу я, значит, никого не трогаю, починяю примус пишу один модуль, и тут выясняется неприятное: оказывается, в YUI 3.0.0.pr2, модуле Lang методы isNumber и isBoolean того. Не этого. В смысле, бажные:
alert(YUI.Lang.isNumber(new Number(1))); // false
alert(YUI.Lang.isBoolean(new Boolean(true))) // false
Неприятно.
Лезу в код, и вижу:
1 // для простоты восприятия я выкинул все лишнее, относящееся только к YUI
2 isBoolean = function(o) {
3 return typeof o === 'boolean';
4 };
5
6 isNumber = function(o) {
7 return typeof o === 'number' && isFinite(o);
8 };
Придется править ручками.
Как известно, typeof объекта Boolean возвращает object. Лезу в Boolean Reference, что на w3schools, и вижу, что у Boolean есть метод, который мне поможет - valueOf. Правлю isBoolean на что-то вроде:
1 isBoolean = function(o) {
2 return (typeof o === 'boolean' || (o !== null && typeof o === 'object' && (typeof o.valueOf() === 'boolean')));
3 };
Тесты прогоняются на ура. Идем дальше. Смотрим в Number Reference, и по накатанной правлю и isNumber:
1 isNumber = function(o) {
2 return ((typeof o === 'number') || (o !== null && typeof o === 'object' && (typeof o.valueOf() === 'number')) && isFinite(o);
3 };
Казалось бы, все круто? Не совсем.
alert(isNumber(new Date())); // return true;
Хм. Ну, давайте еще добавлю проверку на то, что это не Date.
1 isNumber = function(o) {
2 return ((typeof o === 'number') || (o !== null && typeof o === 'object' && !(o instanceof Date))) && (typeof o.valueOf() === 'number')) && isFinite(o);
3 };
Теперь все работает нормально, но какой монстрик-то жуткий получается. Ладно, в идиота я наигрался, пора и голову включить:
1 isBoolean = function(o) {
2 return typeof o === 'boolean' || o instanceof Boolean;
3 };
4
5 isNumber = function(o) {
6 return (typeof o === 'number' || o instanceof Number) && isFinite(o);
7 };
Вуаля. Пойду на форум YUI рапортовать о баге. Всем спасибо за внимание.