本文共 1347 字,大约阅读时间需要 4 分钟。
JavaScript在执行数值运算时,常会出现浮点数溢出问题。
例如:0.1 + 0.2 不等于 0.3num = 0.1 + 0.2;//0.300000000000000004
这是JavaScript中最常报告的Bug,并且这是遵循二进制浮点数算数标准(IEEE 754)而导致的结果。这个标准适合很多应用,但它违背了数字基本常识。
幸运的是,浮点数中的整数运算是精准的,所以小数表现出来的问题可以通过指定精度来避免。
num = (1 + 2) / 10;//0.3
这种处理经常在货币计算中用到,在计算货币时当然期望得到精确的结果。例如,元可以通过乘以100而全部转成分,然后就可以准确地将每项相加,求和后的结果可以除以100转换回元。
JavaScript能够自动转换变量的数据类型,这种转换是一种隐性行为。在自动转换数据类型时,JavaScript一般遵循:如果某个类型的值被用于需要其它类型的值的环境中,JavaScript就自动将这个值转换成需要的类型,具体如下表:
值(value) | 字符串操作环境 | 数字运算环境 | 逻辑运算环境 | 对象操作环境 |
---|---|---|---|---|
undefined | “undefined” | NaN | false | Error |
null | “null” | 0 | false | Error |
非空字符串 | 不转换 | 字符串对应的数字或NaN | true | String |
空字符串 | 不转换 | 0 | false | String |
0 | “0” | 不转换 | false | Number |
NaN | “NaN” | 不转换 | false | Number |
Infinity | “Infinity” | 不转换 | true | Number |
Number.POSITIVE_INFINITY | “Infinity" | 不转换 | true | Number |
Number.NEGATIVE_INFINITY | “-Infinity” | 不转换 | true | Number |
Number.MAX_VALUE | “1.7976931348623157e” + 308 | 不转换 | true | Number |
Number.MIN_VALUE | ”5e-324" | 不转换 | true | Number |
其它所有数字 | ”数字的字符串值“ | 不转换 | true | Number |
true | “true” | 1 | 不转换 | Boolean |
false | ”false" | 0 | 不转换 | Boolean |
对象 | toString() | valueOf()或toString()或NaN | true | 不转换 |
如果把非空对象用在逻辑运算环境中,则对象被转换为true。此时的对象包括所有类型的对象,即使是值为false的包装对象也转换为true。
如果把对象用在数值运算环境中,则对象会被自动转换为数字,如果转换失败,则返回值NaN。被转换为数值0.如果数组仅包含一个数字元素,则被转换为该数字的数值。如果数组包含多个元素,或者仅包含一个非数字元素,则返回NaN。
当对象用于字符串环境中时,JavaScript能够调用toString()方法把对象转换为字符串再进行相关计算。当对象与数值进行加号运算时,则会尝试将对象转换为数值,然后参与求和运算。如果不饿能够将对象转换为有效数值,则执行字符串连接操作。
转载地址:http://misqb.baihongyu.com/