Javascript: избегать исключений для преобразования целых чисел или целочисленных чисел с переменными типа null или undefined?

Фон

  • javascript (двигатель V8)
  • браузер Chrome Chrome
  • унаследованный код javascript с большим количеством различения типов числовых переменных.

Вопрос

  • Как надежно вводить строку javascript в числовые переменные (float и integer) и по-прежнему избегать исключений script из-за необъявленных или нулевых значений?

Подробнее

Tymac унаследовал некоторый код javascript, который требует много различения типов переменных для float для integer для строки и множества перестановок между этими тремя типами.

Проблема состоит в том, что переменные объявляются или определяются нерегулярно, что потенциально непредсказуемо. Кроме того, код устроен таким образом, чтобы затруднить его сортировку.

Цель состоит в том, чтобы придумать способ "доказательства риска" для ввода переменных типа между строкой float-integer, когда объявления переменных не известны заранее из-за способа настройки кода.

Ответ 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: