码迷,mamicode.com
首页 > 其他好文 > 详细

你真了解parseFloat吗?

时间:2014-08-29 13:14:58      阅读:314      评论:0      收藏:0      [点我收藏+]

标签:style   http   color   os   java   io   ar   2014   cti   

        发现了一点关于JavaScript的parseFloat()函数的东西,写下来与大家分享,自己也做个笔记。

        以下是W3C上面对parseFloat函数的说明。                                                                                          parseFloat 是全局函数,不属于任何对象。parseFloat 将它的字符串参数解析成为浮点数并返回。如果在解析过程中遇到了正负号(+ 或 -)、数字 (0-9)、小数点,或者科学记数法中的指数(e 或 E)以外的字符,则它会忽略该字符以及之后的所有字符,返回当前已经解析到的浮点数。同时参数字符串首位的空白符会被忽略。如果参数字符串的第一个字符不能被解析成为数字,则 parseFloat 返回 NaN。

        这只是说明了parseFloat函数的用法,并没有说它的机制。我们再来看看ES5规范里是怎么说的。     

bubuko.com,布布扣

        大意就是说,先为传进来的参数调用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)

你真了解parseFloat吗?

标签:style   http   color   os   java   io   ar   2014   cti   

原文地址:http://my.oschina.net/u/1274710/blog/307911

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!