Javascript:使用null或未定义的变量避免字符串到整数或浮点类型转换的异常? 背景 javascript(V8引擎) 谷歌浏览器 继承的javascript代码包含大量的数值变量类型转换 问题: 如何可靠地将javascript字符串类型转换为数字变量(float和integer),并且仍然避免由于未声明或空值而导致脚本停止异常 细节
Tymac继承了一些javascript代码,这些代码需要大量的类型转换变量才能浮点数到整数再到字符串,以及这三种类型之间的大量排列 问题是,变量的声明或定义是不规则的,这会引入潜在的不可预测性。此外,代码的排列方式也使得很难将其全部整理出来 我们的目标是提出一种“防风险”的方法,当变量声明由于代码的设置方式而事先未知时,在浮点整数字符串之间键入强制转换变量。问题 在变量可能未全部声明或可能导致Javascript异常的情况下,您希望可靠地处理浮点、整数和字符串类型之间的类型转换 解决方案 如果可能,请确保在尝试类型转换之前至少声明了所有变量 此外,还要了解如何处理空值,并了解Javascript中的平等性测试 细节 在这个Javascript场景中执行健壮类型检查的一个简单方法是避免:Javascript:使用null或未定义的变量避免字符串到整数或浮点类型转换的异常? 背景 javascript(V8引擎) 谷歌浏览器 继承的javascript代码包含大量的数值变量类型转换 问题: 如何可靠地将javascript字符串类型转换为数字变量(float和integer),并且仍然避免由于未声明或空值而导致脚本停止异常 细节,javascript,type-conversion,Javascript,Type Conversion,Tymac继承了一些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异常,这些异常可能会使代码停止
if(typeof(foo)!='undefined'&&foo!=null){/*您可以使用foo!*/}
update:缩小问题范围以解决过于宽泛的问题的向下投票提示:对于嵌套或结构化变量,如果要防止停止,有必要检查变量中的每个路径步骤是否处于未定义状态:(例如,表[indx][fldname]
您必须分别检查表
然后检查表[indx]
然后检查表[indx][fldname]
)。