Javascript:使用null或未定义的变量避免字符串到整数或浮点类型转换的异常? 背景 javascript(V8引擎) 谷歌浏览器 继承的javascript代码包含大量的数值变量类型转换 问题: 如何可靠地将javascript字符串类型转换为数字变量(float和integer),并且仍然避免由于未声明或空值而导致脚本停止异常 细节

Javascript:使用null或未定义的变量避免字符串到整数或浮点类型转换的异常? 背景 javascript(V8引擎) 谷歌浏览器 继承的javascript代码包含大量的数值变量类型转换 问题: 如何可靠地将javascript字符串类型转换为数字变量(float和integer),并且仍然避免由于未声明或空值而导致脚本停止异常 细节,javascript,type-conversion,Javascript,Type Conversion,Tymac继承了一些javascript代码,这些代码需要大量的类型转换变量才能浮点数到整数再到字符串,以及这三种类型之间的大量排列 问题是,变量的声明或定义是不规则的,这会引入潜在的不可预测性。此外,代码的排列方式也使得很难将其全部整理出来 我们的目标是提出一种“防风险”的方法,当变量声明由于代码的设置方式而事先未知时,在浮点整数字符串之间键入强制转换变量。问题 在变量可能未全部声明或可能导致Javascript异常的情况下,您希望可靠地处理浮点、整数和字符串类型之间的类型转换 解决方案 如果

Tymac继承了一些javascript代码,这些代码需要大量的类型转换变量才能浮点数到整数再到字符串,以及这三种类型之间的大量排列

问题是,变量的声明或定义是不规则的,这会引入潜在的不可预测性。此外,代码的排列方式也使得很难将其全部整理出来

我们的目标是提出一种“防风险”的方法,当变量声明由于代码的设置方式而事先未知时,在浮点整数字符串之间键入强制转换变量。

问题 在变量可能未全部声明或可能导致Javascript异常的情况下,您希望可靠地处理浮点、整数和字符串类型之间的类型转换

解决方案 如果可能,请确保在尝试类型转换之前至少声明了所有变量

此外,还要了解如何处理空值,并了解Javascript中的平等性测试

细节 在这个Javascript场景中执行健壮类型检查的一个简单方法是避免:

  • 未声明的变量
  • Javascript对象上未声明的属性(又称字典)
  • 空值
  • 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'
陷阱
  • 为parseInt parseFloat和.toString()引发异常
  • null.toString()
    引发异常
  • parseInt(null)和parseFloat(null)返回NaN
  • 如果可以,至少要确保声明了所有变量。这将防止未声明的值出现异常,但不会防止空值出现异常
  • 即使使用try-catch块,并确保声明了所有变量,也必须处理null异常,这些异常可能会使代码停止
另见 以下链接提供了与Javascript中的类型转换和比较相关的其他详细信息:


if(typeof(foo)!='undefined'&&foo!=null){/*您可以使用foo!*/}
update:缩小问题范围以解决过于宽泛的问题的向下投票提示:对于嵌套或结构化变量,如果要防止停止,有必要检查变量中的每个路径步骤是否处于未定义状态:(例如,
表[indx][fldname]
您必须分别检查
然后检查
表[indx]
然后检查
表[indx][fldname]
)。