标签:style http color os java io ar 2014 cti
发现了一点关于JavaScript的parseFloat()函数的东西,写下来与大家分享,自己也做个笔记。
以下是W3C上面对parseFloat函数的说明。 parseFloat 是全局函数,不属于任何对象。parseFloat 将它的字符串参数解析成为浮点数并返回。如果在解析过程中遇到了正负号(+ 或 -)、数字 (0-9)、小数点,或者科学记数法中的指数(e 或 E)以外的字符,则它会忽略该字符以及之后的所有字符,返回当前已经解析到的浮点数。同时参数字符串首位的空白符会被忽略。如果参数字符串的第一个字符不能被解析成为数字,则 parseFloat 返回 NaN。
这只是说明了parseFloat函数的用法,并没有说它的机制。我们再来看看ES5规范里是怎么说的。
大意就是说,先为传进来的参数调用toString方法,然后把得到结果的字符串去空格,再转为数字,如果不能转为数字的话则返回NaN。
然而笔者通过自己的实验发现(在IE,FF,chrome下),浏览器对此做了一点扩展,看代码吧。
var return_numStr = { toString : function() { console.log("toString invoke"); return "6.5536";//返回一个可以转为数字的字符串 }, valueOf : function () { console.log("valueOf invoke"); return "6.5536"; } } parseFloat(return_numStr);//result : toString invoke!! return 6.55.36 var return_not_numStr_butPrimitive = { toString : function() { console.log("toString invoke"); return true;//返回的是primitive类型的值,但不可以转为数字 }, valueOf : function () { console.log("valueOf invoke"); return "6.5536"; } } parseFloat(return_not_numStr_butPrimitive);//result : toString invoke!! return NaN! var return_not_primitive = { toString : function() { console.log("toString invoke"); return {};//返回不是primitive类型 }, valueOf : function () { console.log("valueOf invoke"); return "6.5536"; } } parseFloat(return_not_primitive);//result : toString invoke, valueOf invoke too!!! return 6.5536
我们根据以上代码,总结如下:
1.调用parseFloat的时候,会先调用传入参数的toString方法,如果toString方法返回的是primitive类型(Number,String,Boolean,Null,Undefined),则将toString方法的值转为数字返回,如“6.5536”转为数字6.5536,可参考例子1。但如果返回是true或false并不会转为1和0,而是NaN,可参考例子2。
2.如果toString方法返回的是对象类型,则会调用参数的valueOf方法(这点ES5规范并没有说明)。可参考例子3,这里toString和valueOf方法都调用了,并且是先调用toString方法,返回值{}(非primitive类型),继续调用valueOf方法。
3.根据valueOf方法的值,转为数字返回。(注意true和false并不返回1和0,而是NaN)
标签:style http color os java io ar 2014 cti
原文地址:http://my.oschina.net/u/1274710/blog/307911