Ответ 1
Проблема
Вы надежно проверяете преобразование типов типов между типами float, integer и string в случаях, когда переменные могут быть не все объявлены или могут в противном случае потенциально вызвать исключение Javascript.
Решение
Если это вообще возможно, убедитесь, что все переменные, как минимум, объявлены перед попыткой преобразования типов.
Кроме того, поймите, как обрабатывать значения null и понимать тестирование равенства в Javascript.
Подробнее
Один простой способ сделать надежную проверку типов в этом сценарии Javascript состоит в том, чтобы избежать:
- необъявленные переменные
- необъявленные свойства объектов Javascript (aka dictionary)
- нулевые значения
- Значения NaN
Вот простой и быстрый обзор:
//
var vfftest = 0.05; // float
var viitest = 3000; // integer
var vssblank = ''; // empty string
var vssnonblank = 'hello'; // non-empty string
var vddempty = {}; // dictionary with no name-value pairs
var vddnonempty = {'alpha':1,'bravo':'two'}; // dictionary with name-value pairs
var vnull = null; // null
// check boolean
console.log( (vssnonblank) ? 'true' : 'false' ); // true
console.log( (vssblank) ? 'true' : 'false' ); // false
console.log( (vfftest) ? 'true' : 'false' ); // true
console.log( (viitest) ? 'true' : 'false' ); // true
console.log( (vnull) ? 'true' : 'false' ); // false
console.log( (vddempty) ? 'true' : 'false' ); // true
console.log( (vddnonempty) ? 'true' : 'false' ); // true
console.log( (vnoExisto) ? 'true' : 'false' ); // EXCEPTION
// check toString
console.log( (vssnonblank).toString() ); // hello
console.log( (vssblank).toString() ); //
console.log( (vfftest).toString() ); // '0.05'
console.log( (viitest).toString() ); // '3000'
console.log( (vnull).toString() ); // EXCEPTION
console.log( (vddempty).toString() ); // [object Object]
console.log( (vddnonempty).toString() ); // [object Object]
console.log( (vnoExisto).toString() ); // EXCEPTION
// check parseFloat
console.log( parseFloat(vssnonblank) ); // NaN
console.log( parseFloat(vssblank) ); // NaN
console.log( parseFloat(vfftest) ); // 0.05
console.log( parseFloat(viitest) ); // 3000
console.log( parseFloat(vnull) ); // NaN
console.log( parseFloat(vddempty) ); // NaN
console.log( parseFloat(vddnonempty) ); // NaN
console.log( parseFloat(vnoExisto) ); // EXCEPTION
// check parseInt
console.log( parseInt(vssnonblank) ); // NaN
console.log( parseInt(vssblank) ); // NaN
console.log( parseInt(vfftest) ); // 0
console.log( parseInt(viitest) ); // 3000
console.log( parseInt(vnull) ); // NaN
console.log( parseInt(vddempty) ); // NaN
console.log( parseInt(vddnonempty) ); // NaN
console.log( parseInt(vnoExisto) ); // EXCEPTION
// check typeof
console.log(typeof vssnonblank); // string
console.log(typeof vssblank); // string
console.log(typeof vfftest); // number
console.log(typeof viitest); // number
console.log(typeof vddempty ); // object
console.log(typeof vddnonempty ); // object
console.log(typeof vnull); // object
console.log(typeof vnoExisto); // 'undefined'
Ловушки
-
<undeclared> throws an exception for parseInt parseFloat and .toString()
-
null.toString()
генерирует исключение -
parseInt(null) and parseFloat(null) returns NaN
- Если вы можете, по крайней мере, убедитесь, что все переменные объявлены. Это предотвратит исключения для необъявленных значений, но не для нулей.
- Даже если вы используете блок try-catch и убедитесь, что все переменные объявлены, вам все равно придется обрабатывать исключения для нулей, и это потенциально остановит ваш код.
См. также
Следующие ссылки содержат дополнительные сведения, относящиеся к типу и сопоставлению в Javascript:
- Проверка нулевого значения до ToString()
- Какой самый надежный способ проверить, является ли переменная JavaScript пустой?
- Какой оператор равен (== vs ===) должен использоваться при сравнении JavaScript?
- Как преобразовать строку в float в javascript?
- Приведение типов JavaScript
- Не останавливайте JavaScript, когда он выдает исключение
- Поиск типа переменной в JavaScript