jquery源码阅读知识储备(10)javascrpt中的数字(待续)

1. parseInt 的进制问题

parseInt 是 JavaScript 中非常常用的一个方法,它用来将数字型的字符串转换为数字类型的整数,一般使用这个函数不会出现什么问题,但有些情况例外,比如要转换的字符串为 "08","09"。下面的代码展示了 parseInt 处理字符串"08"时不同的返回结果。导致这种结果的原因在于,可能很少有人注意到 parseInt 方法实际上有两个参数,第一个是要转换为数字的字符串,第二个可选参数为转换的进制值,如果没有提供第二个参数,则前缀为 '0x' 的字符串被当作十六进制,前缀为 '0' 的字符串被当作八进制。所有其它字符串都被当作是十进制。这就造成了parseInt("08")的结果为0,而parseInt("8")结果为8的怪异现象,解决的办法很简单:为该方法明确地指明参数。

var t_1_a = "08";
parseInt(t_1_a);   // 0
parseInt(t_1_a,10);   // 8
2. 0 除以 0 与 1 除以 0

 

在进行除法运算的时候,如果事先不知道参与运算的两个数字,那么有可能遇到类似 0/0 和 1/0 的情况。感谢数学老师,他让我们知道了 n/0 (n!=0)是一个极限数,于是理所当然地,在 JavaScript 中,当 n大于0 时,这个表达式的运算结果是 Infinity,n小于0 时,结果为 -Infinity。不要以为我在这里随便写了一个单词,Infinity 是 Global 对象的成员,事实上它的数据类型依然为"number"。而当 n = 0 时,即 0/0 ,这个运算的结果是 NaN,它是个特殊的家伙。避免这种情况,一种办法是检查参与运算的数字,另一种办法是检测运算结果。

1/0   // Infinity
0/0   // NaN
3. 数字的检测: isNaN 与 isFinite

刚才我们认识到了一种可能产生 Infinity 和 NaN 的情况,但在实际中,可能导致这种结果的例子很多,比如一个用户表单,其中的一个域只能填写数字,如何检测到用户的不合法填写,并保障有效运算并返回给用户。先说 NaN 的情况吧,它 比 Infinity 稍显复杂,NaN 用来表示非数字值的特殊值,同 Infinity 一样,它也是 Global 对象的成员。NaN 不与任何值相等,包括其本身,这已经否定了我们使用 "==" 来检测 NaN 的可能,而 typeof NaN 的结果也是 "number",这使我们无法将它与常规的数字区分开。

typeof NaN;   // number
"test" == NaN;   // false
5 == NaN;    // false
NaN == NaN;   // false

幸运的是 JavaScript 提供了一个名为 isNaN 的方法,它接受一个唯一的参数,并返回该参数是否是保留值 NaN,下面的代码已经几乎成功地分辨了数字与非数字,唯一需要注意的是最后一行,空字符串也被返回 false,这表示 JavaScript 认为它是一个合法的数字,这是因为空字符串隐式转型为数字0,这告诉我们,禁止空字符提交或验证 length 属性是非常有必要的。

isNaN(NaN);   // true
isNaN("5");   // false
isNaN("5a");   // true
isNaN("");    // false

而验证 Infinity 则简单多了,因为它既可以使用相等运算与全等运算,也可以使用 isFinite 检测。isFinite 方法同样只接受唯一的参数,用以检测提供的数字是否是有限的。

1/0 == Infinity    // true
isFinite(1/0);    // false
4. 使用 "+" 运算符转换字符串为数字

在需要转换为数字的变量前面添上一个加号,这是目前最从容淡定的数值类型转型方法。

var a = "5";
var b = 6;
a + b;   // "56"
+(a) + b;   // 11
5. 数字 0 的故事

JavaScript 太灵活了,以至于有的时候甚至分不清 0 到底还是不是0。事实上 0 既可以表示数字 0 ,也可以表示长度为0的字符串,还可以表示布尔值 false,因此在需要明确区分它们的时候使用"==="全等符是非常正确的选择。
大多数有经验的前端程序员都提倡使用全等运算符,并尽可能地明确数据类型,这样既可以规避诸如上面的一些错误,同时还将避免 JavaScript 内部处理时不必要的数据类型转换过程,这样做的好处在于它可以让代码运行得更快一点。

0 == false;  // true
0 == ""  // true
0 === false;  // false
0 === ""  // false
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值