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

Основываясь на ваших изменениях, я считаю, что это должно сработать:

if (a == 1 && b == 2 && c == 3) {
  // do something
} else if (a == 4 && b == 5 && c == 6) {
  // do something else
}

Если вы действительно хотите вместо него использовать оператор switch, это возможно:

def val = [a, b, c]
switch (val) {
    case {it == [1, 2, 3]}:
        // something
        break;
    case {it == [4, 5, 6]}:
        // something else
        break;

Но я не уверен, почему вы предпочитаете это блоку if / else.

5
задан Mitch Wheat 10 January 2009 в 13:42
поделиться

6 ответов

Некоторые маленькие комментарии по проверке типа - это на самом деле не, который усложнил:

Использовать 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'). Я не знаю ни о каком обходном решении для этого - проверки только работают надежно на пользовательские функции...

edit2: существуют также проблемы с объектами, переданными из других окон/кадров, поскольку они наследуются различным глобальным объектам - т.е. instanceof перестанет работать. Обходные решения для встроенных объектов существуют: Например, можно проверить на массивы через Object.prototype.toString.call(x) === '[object Array]'.

2
ответ дан 14 December 2019 в 04:49
поделиться

Как насчет throw: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Statements/throw

Также тип не различает Массив, Пустой указатель, Объект очень хорошо. Посмотрите на funciton здесь: http://javascript.crockford.com/remedial.html, плюс существует несколько других способов сделать это.

Лично я не сделал бы типа, проверяющего, так как это - шаг, который просто добавит больше времени обработки к коду. Если бы Вы заботитесь о производительности, Вы хотели бы обрубить как можно больше миллисекунд времени обработки. Хорошая Документация исправит потребность в проверке.

1
ответ дан 14 December 2019 в 04:49
поделиться

Библиотеки как jQuery не сообщают пользователю ошибки.

Если функция ожидает число, и пользователь передает строку, функция просто возвращается, ничего не делая.

Тем путем Вы избежите ошибок JavaScript, открывающихся на живом веб-сайте.

PS. Просто удостоверьтесь, что всегда ввели, проверяют Ваши введенные параметры, для предотвращения бросаемых ошибок JavaScript.

1
ответ дан 14 December 2019 в 04:49
поделиться

Что о только для тихого преобразования строки в числовой тип данных на функциональном запуске?

Всегда можно определять тип данных 'строки'. Не можете Вы?

0
ответ дан 14 December 2019 в 04:49
поделиться

Проблема с проверкой типа состоит в том что его на самом деле довольно твердое, чтобы сделать. Например:-

var s = new String("Hello World!");
alert(typeof s);

Что предупреждено? Ответ: "объект". Ее истинное это - ненормальный способ инициализировать строку, но я вижу его довольно часто, тем не менее. Я предпочитаю делать попытку преобразований, в случае необходимости или просто ничего не делают.

Сказав, что в среде JavaScript, в которой я имею полный контроль (который не верен, если Вы просто обеспечиваете библиотеку) я использую этот набор опытного:-тонких настроек

String.prototype.isString = true;
Number.prototype.isNumber = true;
Boolean.prototype.isBoolean = true;
Date.prototype.isDate = true;
Array.prototype.isArray = true;

Следовательно тестирование на общие типы может быть столь же простым как:-

if (x.isString)

хотя все еще необходимо не упустить пустой/неопределенный:-

if (x != null && x.isString)

В дополнение к предотвращению new String("thing") глюк, этот подход особенно добивается признания в Даты и Массивы.

4
ответ дан 14 December 2019 в 04:49
поделиться

Вы могли проверить на некоторое значение как набор "debug=1". Если существует - Вы могли бы произвести ошибки как предупреждения. Таким образом в режиме разработки пользователь будет видеть их, но на реальном сайте он выключит его. Тем же путем браузер не покажет Вам сообщение об ошибке - необходимо посмотреть на консоль JS.

Также существует FireBug. Вы могли обнаружить, что и помещают сообщения отладки FB также.

0
ответ дан 14 December 2019 в 04:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: