做项目时,遇到一个超级诡异的问题。对于秒数处理的。由于程序中把秒增加了10秒进行提前量进行判断,因此需要考虑对时间进行进位处理。进位的判断是当秒数达到或超过60后,将其减60,并将分钟数+1,然后再判断分钟和小时的进位。逻辑是没有错的。
但诡异的是,即使是处理了进位后,在实际运行的时候,经常会出现 13:23:63 秒这样的情况。在一通追踪检查之后,诡异的发现,居然出现了 63>60 判断为假的神奇结果。检查了N久之后,才找到问题所在。原来问题出在对数字进行格式化时在前面增加的一个0。由于对时间的处理格式,应该是 08:03 这样的格式,所以在中间缓存的数据中,所有秒数都是直接在前面加了0。并且在最终使用时,将字符串截断为最后两位来使用。打开浏览器的调试控制台,输入 063,你会很惊奇的发现,返回值居然是51。这他喵的是怎么回事?
原来,Javascript 在遇到以0开头且各位数字都不大于7的整数时,会默认把这个数字当作八进制数字处理。就出现了上面的结果。那么 eval("063") 的计算结果,就是十进制的51。
其实说穿了,这并不是什么问题,但在我们学习程序开发的时候,不论是自己找资料学,看书学或者去培训班学,没人会告诉你这一点,只会告诉你,0x开头的数字是十六进制,0b开头的是二进制,0o开头的,就是八进制。有些书或者资料则只会告诉你最常用的0x数字前缀,当然,最操蛋的培训老师,就从没告诉过你有数字前缀这个东西!
但诡异的是,即使是处理了进位后,在实际运行的时候,经常会出现 13:23:63 秒这样的情况。在一通追踪检查之后,诡异的发现,居然出现了 63>60 判断为假的神奇结果。检查了N久之后,才找到问题所在。原来问题出在对数字进行格式化时在前面增加的一个0。由于对时间的处理格式,应该是 08:03 这样的格式,所以在中间缓存的数据中,所有秒数都是直接在前面加了0。并且在最终使用时,将字符串截断为最后两位来使用。打开浏览器的调试控制台,输入 063,你会很惊奇的发现,返回值居然是51。这他喵的是怎么回事?
原来,Javascript 在遇到以0开头且各位数字都不大于7的整数时,会默认把这个数字当作八进制数字处理。就出现了上面的结果。那么 eval("063") 的计算结果,就是十进制的51。
其实说穿了,这并不是什么问题,但在我们学习程序开发的时候,不论是自己找资料学,看书学或者去培训班学,没人会告诉你这一点,只会告诉你,0x开头的数字是十六进制,0b开头的是二进制,0o开头的,就是八进制。有些书或者资料则只会告诉你最常用的0x数字前缀,当然,最操蛋的培训老师,就从没告诉过你有数字前缀这个东西!