Javascript:避免字符串到整数或浮点类型转换与空或未定义变量的异常?

Javascript: avoid exceptions for string to integer or float typecast conversion with null or undefined variables?(Javascript:避免字符串到整数或浮点类型转换与空或未定义变量的异常?)
本文介绍了Javascript:避免字符串到整数或浮点类型转换与空或未定义变量的异常?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

  • javascript(V8 引擎)
  • 谷歌浏览器
  • 继承了带有大量数字变量类型转换的 javascript 代码.
  • 如何可靠地将 javascript 字符串类型转换为数字变量(浮点数和整数),并且仍然避免由于未声明或空值而导致脚本停止异常?

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

Tymac has inherited some javascript code that requires a lot of type casting of variables to float to integer to string and numerous permutations between these three types.

问题是,变量被不规则地声明或定义,从而引入了不可预测的势.此外,代码的排列方式很难将其全部整理出来.

The problem is, the variables are declared or defined irregularly, which introduces potential unpredictably. Also, the code is arranged in such a way to make it difficult to sort it all out.

我们的目标是在变量声明因代码设置方式而事先不知道时,提出一种风险证明"方法来在浮点整数字符串之间进行类型转换.

The goal is to come up with a 'risk proof' way to type-cast variables between float-integer-string when the variable declarations are not known in advance because of the way the code is set up.

推荐答案

问题

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

Problem

You want to reliably handle type cast conversion between float, integer, and string types reliably in cases where the variables may not all be declared or may otherwise potentially cause a Javascript exception.

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

If at all possible, make sure all variables are at least declared before attempting a type cast conversion.

此外,了解如何处理 null 并了解 Javascript 中的相等测试.

Also, understand how to handle nulls and understand equality testing in Javascript.

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

One easy way to do robust type-checking in this Javascript scenario is to avoid:

  • 未声明的变量
  • Javascript 对象(又名字典)上未声明的属性
  • 空值
  • NaN 值

这是一个简单而快速的概述:

Here is a simple and quick overview:

//
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 中的类型转换和比较相关的其他详细信息:

    The following links provide additional details relevant to type-cast and comparison in Javascript:

    • 在 ToString() 之前检查 null
    • 什么是最检查 JavaScript 变量是否为空的可靠方法?
    • 等于运算符 (== vs ===) 应该用在 JavaScript 比较中吗?
    • 如何在javascript中将字符串转换为浮点数?
    • JavaScript 类型转换
    • 在抛出异常时不要停止 JavaScript
    • 在 JavaScript 中查找变量类型

    这篇关于Javascript:避免字符串到整数或浮点类型转换与空或未定义变量的异常?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

    本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

在开发JS过程中,会经常遇到两个小数相运算的情况,但是运算结果却与预期不同,调试一下发现计算结果竟然有那么长一串尾巴。如下图所示: 产生原因: JavaScript对小数运算会先转成二进制,运算完毕再转回十进制,过程中会有丢失,不过不是所有的小数间运算会
问题描述: 在javascript中引用js代码,然后导致反斜杠丢失,发现字符串中的所有\信息丢失。比如在js中引用input type=text onkeyup=value=value.replace(/[^\d]/g,) ,结果导致正则表达式中的\丢失。 问题原因: 该字符串含有\,javascript对字符串进行了转
Rails/Javascript: How to inject rails variables into (very) simple javascript(Rails/Javascript:如何将 rails 变量注入(非常)简单的 javascript)
CoffeeScript always returns in anonymous function(CoffeeScript 总是以匿名函数返回)
Ordinals in words javascript(javascript中的序数)
getFullYear returns year before on first day of year(getFullYear 在一年的第一天返回前一年)