Каков наилучший способ сообщить пользователям моих библиотечных функций, что переданные переменные имеют неправильный тип

StackOverflow https://stackoverflow.com/questions/430937

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top