你真了解parseFloat吗?

        今天看了一下parseFloat,写下来与大家分享,自己也做一下笔记。

        相信很多人都知道JavaScript的parseFloat这个函数,但不一定很了解。包括我自己,以前我总以为如果传进去的参数是一个对象,那么返回的应该就是NaN。

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

        我们再来看看ES5的规范是怎么说的吧

你真了解parseFloat吗?_第1张图片

        大意就是先转成字符串,再转为数字,如果不能转为数字,则返回NaN。实验一下,我们来看3个例子:

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.首先为传进来的参数调用toString方法,如果返回的是primitive类型(即Number,String, Boolean,Undefined,Null),则将此返回值转为字符串。再尝试将字符串转为数字,如果不能转成数字则返回NaN。(可参考实例代码1, 2)

2.如果toString方法返回的不是ptimitive类型,则继续调用valueOf方法。如果返回的是primitive类型,则将其转为字符串,再将字符串转为数字返回。

3.如果valueOf方法返回的也不是primitive类型,则返回NaN。

你可能感兴趣的:(你真了解parseFloat吗?)