Каков наилучший способ сообщить пользователям моих библиотечных функций, что переданные переменные имеют неправильный тип
-
08-07-2019 - |
Вопрос
В настоящее время я занимаюсь созданием библиотеки функций javascript.В основном для моего собственного использования, но вы никогда не можете быть уверены, что кто-то другой в конечном итоге использует это в своих проектах, я, по крайней мере, создаю это так, как будто это может произойти.
Большинство методов работают только в том случае, если передаваемые переменные имеют правильный тип данных.Теперь мой вопрос заключается в следующем:Каков наилучший способ предупредить пользователей о том, что переменная имеет неправильный тип?Должен ли кто-то выдавать подобную ошибку?
function foo(thisShouldBeAString){ //just pretend that this is a method and not a global function
if(typeof(thisShouldBeAString) === 'string') {
throw('foo(var), var should be of type string');
}
#yadayada
}
Я знаю, что javascript выполняет внутреннее преобразование типов, но это может привести к очень странным результатам (т.е. '234' + 5 = '2345', но '234' * 1 = 234), и это может заставить мои методы делать очень странные вещи.
Редактировать
Чтобы все было предельно ясно:Я не хочу выполнять преобразование типов, передаваемые переменные должны быть правильного типа.Каков наилучший способ сообщить пользователю моей библиотеки, что переданные переменные имеют неправильный тип?
Решение
Несколько небольших замечаний по проверке типов - на самом деле это не так уж сложно:
Использование typeof
чтобы проверить наличие примитивов и instanceof
для проверки наличия определенных типов объектов.
Пример:Проверьте наличие строк с помощью
typeof x === 'string'
или
typeof x === 'string' || x instanceof String
если вы хотите включить строковые объекты.
Чтобы проверить наличие массивов, просто используйте
x instanceof Array
Это должно работать достаточно хорошо (есть несколько известных исключений - например, в Firefox 3.0.5 есть ошибка, при которой window instanceof Object === false
хотя window.__proto__ instanceof Object === true
).
Редактировать: Существуют некоторые дополнительные проблемы с обнаружением функциональных объектов:
В принципе, вы оба могли бы использовать typeof func === 'function'
и func instanceof Function
.
Загвоздка в том, что в неназванном браузере крупной корпорации эти проверки возвращают неправильные результаты для некоторых предопределенных функций (их тип задан как 'object'
).Я не знаю никакого обходного пути для этого - проверки надежно работают только для пользовательских функций...
редактировать 2: Существуют также проблемы с объектами, передаваемыми из других окон / фреймов, поскольку они будут наследоваться от разных глобальных объектов - ie instanceof
потерпит неудачу.Существуют обходные пути для встроенных объектов:Например, вы можете проверить наличие массивов с помощью Object.prototype.toString.call(x) === '[object Array]'
.
Другие советы
Проблема с проверкой типов заключается в том, что на самом деле это довольно сложно сделать.Например:-
var s = new String("Hello World!");
alert(typeof s);
О чем приходит предупреждение?Ans:"объект".Это правда, что это глупый способ инициализации строки, но, тем не менее, я вижу его довольно часто.Я предпочитаю пробовать преобразования там, где это необходимо, или просто ничего не делать.
Сказав это в среде Javascript, в которой у меня есть полный контроль (который является не верно, если вы просто предоставляете библиотеку) Я использую этот набор настроек прототипа:-
String.prototype.isString = true;
Number.prototype.isNumber = true;
Boolean.prototype.isBoolean = true;
Date.prototype.isDate = true;
Array.prototype.isArray = true;
Следовательно, тестирование для распространенных типов может быть таким же простым, как:-
if (x.isString)
хотя вам все равно нужно следить за null / undefined:-
if (x != null && x.isString)
В дополнение к тому, чтобы избежать new String("thing")
понятно, этот подход особенно эффективен в отношении дат и массивов.
Библиотеки, такие как jQuery, не информируют пользователя об ошибке.
Если функция ожидает число, а пользователь передает строку, функция просто возвращает, ничего не делая.
Таким образом, вы избежите появления ошибок JavaScript на живом веб-сайте.
PS.Просто убедитесь, что всегда вводите "проверить введенные параметры", чтобы избежать возникновения ошибок JavaScript.
Как насчет throw
:
https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Statements/throw
Также тип не очень хорошо различает Array, Null, Object.Посмотрите на функцию здесь: http://javascript.crockford.com/remedial.html, плюс есть несколько других способов сделать это.
Лично я бы не стал выполнять проверку типа, поскольку это шаг, который просто увеличит время обработки кода.Если вы заботитесь о производительности, вам бы хотелось сократить как можно больше миллисекунд времени обработки.Хорошая документация устранит необходимость в проверке.
Как насчет простого автоматического преобразования строки в числовой тип данных при запуске функции?
Вы всегда можете определить тип данных 'string'.А ты не можешь?
Вы могли бы проверить наличие некоторого значения, например, "debug = 1".Если есть - вы могли бы выводить ошибки, такие как оповещения.Таким образом, в режиме разработки пользователь будет видеть их, но на реальном сайте он отключит это.Точно так же браузер не покажет вам сообщение об ошибке - вам нужно посмотреть на консоль JS.
Также есть FireBug.Вы могли бы обнаружить это и также поместить отладочные сообщения FB.